2016-08-04 26 views
5

Tôi đã được hỏi bởi các nhà phát triển của công ty tôi đang làm việc để làm điều gì đó hơi khác với Docker sau đó tôi cũng được sử dụng. Mục tiêu là có 2 thùng chứa với các trách nhiệm sau:Khối lượng Docker được đặt tên để chia sẻ bản dựng không cập nhật

Vùng chứa A: Vùng chứa nút sẽ tạo ứng dụng phản ứng giao diện người dùng và đặt bó vào thư mục có tên app/dist/. Khi quá trình này hoàn tất, vùng chứa sẽ ngừng chạy.

Vùng chứa B: Vùng chứa nginx alpine sẽ lưu trữ tệp tĩnh từ /usr/share/nginx/html/app.

Các tệp đã được tạo trong Vùng chứa A sẽ được cung cấp cho Vùng chứa B bằng cách sử dụng ổ đĩa sẽ gắn <Container A>/app/dist đến <Container B>/usr/share/nginx/html/app.

Xin lưu ý rằng có một lớp HAProxy giữa cổng có thể truy cập công cộng và thùng chứa nginx là vùng chứa được gọi là app.

Các nhiệm vụ trên đang được sắp đặt sử dụng một file soạn Docker trông giống như sau:

version: '2' 
volumes: 
    webapp_build_volume: {} 
services: 
    webapp_build: 
    build: 
     context: . 
     dockerfile: 'config/nginx/dockerfile-builder' 
    volumes: 
     - webapp_build_volume:/app/dist 
     - webapp_static_volume:/app/src/app/static 
    app: 
    build: 
     context: 'config/haproxy' 
     dockerfile: 'dockerfile-app-haproxy' 
    links: 
     - web 
    volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
    ports: 
     - '80:80' 
     - '1936:1936' 
    web: 
    build: 
     context: . 
     dockerfile: 'config/nginx/dockerfile-web' 
    environment: 
     - EXCLUDE_PORTS=443 
     - VIRTUAL_HOST=* 
    depends_on: 
     - webapp_build 
    volumes: 
     - webapp_build_volume:/usr/share/nginx/html/app 

này hiện đang làm việc chỉ là lần đầu tiên các tập tin soạn Docker được xây dựng. Các tệp trong ổ đĩa không còn cập nhật sau khi tập đã được tạo. Tôi đã đọc rằng khối lượng được đặt tên không thể được cập nhật sau khi chúng được thiết lập nhưng tôi không thể xác nhận điều này. Tôi đã tìm thấy xung quanh công việc liên quan đến việc chạy docker-compose rm --force && docker volume webapp_build rm nhưng tôi không muốn phải loại bỏ các thùng chứa được lưu trong bộ nhớ cache nếu có thể vì dịch vụ CI sẽ trở nên quá chậm.

Vui lòng cho tôi biết nếu tôi có thể làm rõ bất kỳ điều gì (tôi hiểu có rất nhiều phần chuyển động ở đây). Xin lưu ý tôi cũng đang sử dụng docker 2 beta mặc dù tôi không thấy làm thế nào mà có thể thay đổi bất cứ điều gì tôi đã làm ở đây.

Trả lời

4

Hơi khó để theo dõi, nhưng có vẻ như bạn đang xây dựng một hình ảnh, xuất các tệp vào những gì bạn cho là một khối lượng và cố gắng sử dụng nó để điền vào một ổ đĩa đã được sử dụng bởi một vùng chứa đang chạy khác.

Rất có thể sự nhầm lẫn của bạn là việc tạo vùng chứa không gắn khối lượng, khối lượng chỉ được gắn trong các vùng chứa đang chạy. Khối lượng được đặt tên không có tính năng mà nó sẽ được phổ biến bởi nội dung của một hình ảnh, nhưng chỉ khi bạn gắn kết một ổ đĩa có tên trống. Có vẻ như bạn đang tận dụng lợi thế của tính năng này trên phiên bản build + đầu tiên, nhưng nó sẽ không hoạt động trở lại trên các bản dựng sau này. Nếu bạn chạy vùng chứa xây dựng của mình mà không có khối lượng, bạn sẽ thấy rằng tệp của mình ở đó như mong đợi.

Bạn có thể dễ dàng cập nhật âm lượng được đặt tên. Hai lựa chọn đến với tâm trí. Một là sử dụng quy trình hiện tại của bạn, nhưng thay đổi điểm gắn kết khối lượng thành một cái gì đó như "/ target" và làm CMD của vùng chứa xây dựng của bạn, sao chép nội dung nguồn của bạn sang "/ target". Điều đó sẽ trông giống như:

Dockerfile

... 
RUN compile-cmd --output-to /local/build/dir 

entrypoint.sh:

cp -a /local/build/dir/* /target/ 

Docker-soạn.yml:

version: '2' 
services: 
    webapp_build: 
    build: 
     context: . 
     dockerfile: 'config/nginx/dockerfile-builder' 
    volumes: 
     - webapp_build_volume:/target 
... 

Lựa chọn thứ hai là không làm điều này trong việc xây dựng chứa ở tất cả, mà là làm cho một container với ứng dụng của bạn soạn thảo điều kiện tiên quyết. Sau đó gắn mã ứng dụng của bạn dưới dạng một ổ đĩa vào vùng chứa này với một số CMD hoặc ENTRYPOINT có nội dung về khối lượng mã, biên dịch nó và xuất ra khối lượng được đặt tên cũng được gắn kết. Sau đó, thay vì xây dựng thùng chứa xây dựng, bạn chỉ cần chạy vùng chứa biên dịch với hai khối được gắn kết.

entrypoint.sh:

compile-cmd --input-src=/source --output-to /target 

Docker-compose.yml:

version: '2' 
services: 
    webapp_build: 
    volumes: 
     - app/source:/source 
     - webapp_build_volume:/target 
... 
+0

Cố gắng giải pháp 1 bây giờ. Sẽ cho bạn biết ngay! – Shawn

+0

cảm ơn bạn. Giải pháp đầu tiên của bạn làm việc ở đó. Tại sao điều này làm cho khối lượng cập nhật nhưng xây dựng vào thư mục không? – Shawn

+3

Bạn đã xây dựng vào thư mục, nhưng trong khi xây dựng khối lượng của bạn không được gắn kết, điều đó xảy ra khi bạn chạy vùng chứa. Khi bạn gắn ổ đĩa vào thùng chứa đang hoạt động, Docker chỉ sao chép nội dung từ hình ảnh của bạn vào ổ đĩa khi ổ đĩa của bạn trống và sau đó, bước khởi tạo này không được thực hiện (nếu không bạn sẽ hủy nội dung khi bạn cố gắng sử dụng khối lượng của mình trong vùng chứa thứ hai). – BMitch

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