2016-01-18 14 views
6

Tôi đang làm việc trên một dịch vụ trong một hệ thống được sắp xếp bằng cách sử dụng docker-compose. Dịch vụ được viết bằng một ngôn ngữ được biên dịch và tôi cần phải xây dựng lại nó khi tôi thực hiện một thay đổi. Tôi đang cố gắng tìm cách tốt nhất để nhanh chóng lặp lại các thay đổi.Luồng công việc phát triển Docker cho các thành phần được biên dịch trong thiết lập docker-compose

Tôi đã thử 2 'quy trình công việc', cả hai đều dựa vào việc được liên kết với thư mục nguồn qua số volume: để nhận nguồn mới nhất.

A.
  • Mang lên tất cả các container hỗ trợ với docker-compose up -d
  • Dừng container cho các dịch vụ được phát triển
  • Chạy container mới bằng cách sử dụng hình ảnh docker-compose run --name SERVICE --rm SERVICE /bin/bash
  • Trong đó chạy chứa biên dịch và chạy ứng dụng tại cổng tiếp xúc.
  • Khởi động lại bằng cách dừng quá trình chạy và sau đó xây dựng lại.
B.
  • (yêu cầu Dockerfile CMD để xây dựng và sau đó chạy dịch vụ)
  • Dừng dịch vụ: docker-compose kill SERVICE
  • Khởi động lại dịch vụ docker-compose up -d --no-deps SERVICE

Vấn đề là cả mất quá nhiều thời gian để khởi động lại và khởi động lại dịch vụ cục bộ (chạy trên máy tính xách tay của tôi một cách độc lập o f docker). Cài đặt này có vẻ ổn với các ngôn ngữ thông dịch có thể tải lại các tệp đã thay đổi nhưng tôi chưa tìm được hệ thống dịch vụ ngôn ngữ phù hợp nhanh.

+1

Docker có đang chạy trên máy tính xách tay của bạn hay từ xa không? Tự hỏi ý của bạn là "so với khởi động lại dịch vụ cục bộ". Điều gì khiến nó mất quá nhiều thời gian để khởi động lại? Đang biên soạn chậm hơn? Bắt đầu? – thaJeztah

+0

Tôi đã cố gắng làm cho điều này rõ ràng hơn trong câu hỏi. Docker đang chạy qua docker-machine. Khi tôi nói 'chạy cục bộ', tôi có nghĩa là xây dựng và chạy dịch vụ mà không cần sử dụng docker. Đây là một tùy chọn nhưng nó có nghĩa là tôi cần phải thay đổi những thứ như URL cơ sở dữ liệu, v.v. –

+0

Ah, đúng vậy, dự đoán tốt nhất của tôi ở đây là, trước hết, chia sẻ tệp giữa máy chủ và VM ảo là (để nói độc đáo) không giỏi lắm; đây là một hạn chế của việc chia sẻ tệp VirtualBox. Thứ hai, VM có thể không được điều chỉnh cho hiệu suất tối đa, có thể tạo ra sự khác biệt về thời gian biên dịch. Bạn đã thử, ví dụ: tăng số lượng bộ nhớ và/hoặc số CPU cho VM? – thaJeztah

Trả lời

3

tôi sẽ làm điều này:

Run docker-compose up nhưng:

  • sử dụng một khối lượng máy chủ cho các thư mục của các biên soạn nhị phân thay vì nguồn
  • sử dụng một entrypoint rằng làm điều gì đó như

entrypoint.sh:

trap "pkill -f the_binary_name" SIGHUP 
trap "exit" SIGTERM 

while [[ 1 ]]; do 
    ./the_binary_name; 
done 

Viết một kịch bản để xây dựng lại nhị phân, và sao chép nó vào khối lượng được sử dụng bởi các dịch vụ trong docker-compose.yml:

# Run a container to compile and build the binary 
docker run -ti -v $SOURCE:/path -v $DEST:/target some_image build_the_binary 

# copy it to the host volume directory 
copy $DEST/... /volume/shared/with/running/container 

# signal the container 
docker kill -s SIGHUP container_name 

Vì vậy, để biên dịch nhị phân bạn sử dụng kịch bản này, trong đó gắn nguồn và một thư mục đích dưới dạng tập. Bạn có thể bỏ qua bước sao chép nếu $DEST giống với thư mục âm lượng được chia sẻ với vùng chứa "chạy". Cuối cùng, tập lệnh sẽ báo hiệu thùng chứa đang chạy để nó có thể giết quá trình cũ (đang chạy tệp nhị phân cũ) và bắt đầu quy trình mới.

Nếu khối lượng chia sẻ đang biên dịch trong vùng chứa quá chậm, bạn cũng có thể chạy bản dịch trên máy chủ và chỉ sao chép và báo hiệu để nó chạy trong vùng chứa.

Giải pháp này có lợi ích bổ sung là hình ảnh "thời gian chạy" của bạn không cần tất cả các phụ thuộc dev. Nó có thể là một hình ảnh rất nạc chỉ với một cơ sở hệ điều hành trần.

+1

Xin chào, cảm ơn câu trả lời sâu này. Điều này đã giải thích rất nhiều. Tôi đã có thể làm cho nó hoạt động nhiều như bạn phác thảo ở đây. Một sự khác biệt, tôi đã không thể có được 'docker kill -s SIGHUP' làm việc, tôi đang sử dụng' docker exec web pkill -f container_name' để thay thế. Điều này có thể không nhanh nhưng việc chuyển sang phương thức này đã giảm đáng kể thời gian cho một lần 'lặp lại' đơn lẻ. Cảm ơn. –

Các vấn đề liên quan