2015-01-08 18 views
5

Tôi đang sử dụng đế cắm trong Ubuntu. Trong giai đoạn phát triển, tôi đã nhân bản tất cả mã nguồn từ Git trong máy chủ, chỉnh sửa chúng trong WebStorm và chúng chạy với Node.js bên trong một vùng chứa docker với -v /host_dev_src:/container_src để tôi có thể kiểm tra.Sao chép tệp từ máy chủ lưu trữ vào vùng chứa docker rồi cam kết và đẩy

Sau đó, khi tôi muốn gửi chúng để thử nghiệm: Tôi đã cam kết vùng chứa và đã đẩy phiên bản mới. Nhưng khi tôi kéo và chạy hình ảnh trên máy thử nghiệm, mã nguồn bị thiếu. Điều đó có ý nghĩa như trong máy thử nghiệm không có sẵn /host_src.

Giải pháp khắc phục hiện tại của tôi là sao chép mã nguồn trên máy thử nghiệm và chạy trình neo với -v /host_test_src:/container_src. Nhưng tôi muốn biết nếu nó có thể sao chép mã nguồn trực tiếp vào thùng chứa và tránh thao tác đó. Tôi chỉ muốn sao chép, dán và chạy tệp hình ảnh với mã nguồn, đặc biệt là vì không có kết nối Internet trên các máy thử nghiệm của chúng tôi.

PS: Có vẻ docker cp chỉ hỗ trợ sao chép tệp từ vùng chứa đến máy chủ lưu trữ.

Trả lời

2

Một giải pháp là phải có một bước git clone trong Dockerfile thêm mã nguồn vào hình ảnh. Trong quá trình phát triển, bạn có thể ghi đè mã này bằng đối số -v của mình thành docker run để bạn có thể thực hiện thay đổi mà không cần tạo lại. Khi nói đến thử nghiệm, bạn chỉ cần kiểm tra các thay đổi của mình và tạo một hình ảnh mới. Bây giờ bạn có một hình ảnh hoàn toàn độc lập để thử nghiệm.

Lưu ý rằng nếu bạn có hướng dẫn VOLUME trong Dockerfile, bạn sẽ cần phải chắc chắn rằng nó xảy ra sau bước git clone.

Vấn đề với cách tiếp cận này là nếu bạn đang sử dụng ngôn ngữ được biên dịch, bạn chỉ muốn tệp nhị phân của mình hiển thị trong hình ảnh cuối cùng. Trong trường hợp này, git clone cần được thay thế bằng một số mã tìm nạp hoặc biên dịch các tệp nhị phân.

+0

Cảm ơn lời khuyên về thứ tự VOLUME. Tôi luôn luôn giả định rằng bạn không thể viết cho khối lượng từ một Dockerfile bởi vì tôi chỉ cố gắng bước VOLUME đầu tiên (mà có vẻ hợp lý hơn với tôi). – seanmcl

+0

Vâng, khối lượng khá tinh tế. Nó có ý nghĩa khi bạn hiểu cách họ làm việc. Blog của tôi có thể giúp http://container-solutions.com/2014/12/understanding-volumes-docker/ –

1

Hãy đối xử với mã nguồn của bạn là dữ liệu, sau đó gói chúng như nơi chứa dữ liệu, xem https://docs.docker.com/userguide/dockervolumes/

Bước 1 Tạo app_src Docker ảnh

Đặt một Dockerfile bên repo git của bạn như

FROM BUSYBOX 
ADD . /container_src 
VOLUME /container_src 

Sau đó, bạn có thể tạo hình ảnh nguồn như

docker build -t app_src . 

Trong giai đoạn phát triển, bạn luôn có thể sử dụng giải pháp cũ -v /host_dev_src:/container_src.

Bước 2 Chuyển ảnh Docker này như hình ảnh ứng dụng

Bạn có thể chuyển app_src hình ảnh này để kiểm tra hệ thống tương tự như hình ảnh ứng dụng của bạn, có lẽ thông qua registry Docker

Bước 3 Run as chứa dữ liệu

Trong hệ thống thử nghiệm, hãy chạy app vùng chứa phía trên nó. (Tôi sử dụng ubuntu cho bản demo)

docker run -d -v /container_src --name code app_src 
docker run -it --volumes-from code ubuntu bash 
[email protected]:/# ls /container_src 
Dockerfile hello.c 
[email protected]:/# 

Hy vọng nó làm giúp

(cung cấp cho các khoản tín dụng để https://github.com/toffer/docker-data-only-container-demo, mà tôi lấy ý tưởng chi tiết)

+0

do đó bạn vẫn không mang tệp nguồn với vùng chứa và người thử nghiệm sẽ lấy hình ảnh riêng biệt và nguồn riêng biệt –

+0

mã nguồn đóng gói bên trong hình ảnh ứng dụng cũng là giải pháp tốt cho phân phối nội bộ (phiên bản gỡ lỗi a.k.a). Tôi cố gắng tách nó ở đây. –

0

Bạn có thể thử và có hai Dockerfiles. base người ta biết cách chạy ứng dụng của bạn từ một thư mục được xác định trước, nhưng không phải là khai báo một ổ đĩa. Khi phát triển, bạn sẽ chạy vùng chứa này với thư mục lưu trữ được gắn dưới dạng ổ đĩa. Một số khác, số package, sẽ kế thừa số base và sao chép/thêm tệp từ thư mục lưu trữ của bạn, một lần nữa không có số lượng để bạn có thể mang tất cả tệp đến máy chủ của người kiểm tra.

+0

Dockerfile 'gói' có thể sẽ phải nằm ở gốc của' host_dev_src' của bạn để có thể lấy các tệp từ máy chủ lưu trữ của bạn. –

1

Thêm vào câu trả lời Adrian, tôi làm git clone, và sau đó làm

CMD git pull && start-my-service 

để mã mới nhất tại chi nhánh kiểm tra ra được chạy. Điều này rõ ràng không dành cho tất cả mọi người, nhưng nó hoạt động trong một số mô hình phát hành phần mềm.

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