cách tải docker-comp để sử dụng hình ảnh mới nhất từ ​​kho lưu trữ


81

Tôi không biết mình đang làm gì sai, nhưng tôi chỉ đơn giản là không thể docker-compose upsử dụng hình ảnh mới nhất từ ​​sổ đăng ký của chúng tôi mà không xóa hoàn toàn các vùng chứa cũ khỏi hệ thống trước. Có vẻ như tính năng soạn thư đang sử dụng hình ảnh đã bắt đầu trước đó mặc dù tính năng kéo của trình soạn thư đã tải xuống hình ảnh mới hơn.

Tôi đã xem Làm cách nào để có được trình soạn nhạc để luôn tạo lại các vùng chứa từ hình ảnh mới? điều này dường như tương tự với vấn đề của tôi, nhưng không có giải pháp nào được cung cấp ở đó phù hợp với tôi, vì tôi đang tìm giải pháp mà tôi có thể sử dụng trên máy chủ sản xuất và ở đó tôi không muốn xóa tất cả các vùng chứa trước khi bắt đầu chúng một lần nữa (có thể mất dữ liệu?). Tôi chỉ muốn soạn thảo để phát hiện phiên bản mới của những hình ảnh đã thay đổi, kéo chúng và sau đó khởi động lại dịch vụ với những hình ảnh mới đó.

Tôi đã tạo một dự án thử nghiệm đơn giản cho việc này, trong đó mục tiêu duy nhất là có được phiên bản nr để tăng lên trên mỗi bản dựng mới. Phiên bản nr được hiển thị nếu tôi duyệt đến máy chủ nginx được tạo (điều này hoạt động như mong đợi cục bộ).

phiên bản docker: 1.11.2 Docker-soạn phiên bản: 1.7.1 Hệ điều hành: được thử nghiệm trên cả CentOS 7 và OS X 10.10 bằng cách sử dụng docker-toolbox

Docker-compos.yml của tôi:

version: '2'
services:
  application:
    image: ourprivate.docker.reg:5000/ourcompany/buildchaintest:0.1.8-dev
    volumes:
      - /var/www/html
    tty: true

  nginx:
    build: nginx
    ports:
      - "80:80"
    volumes_from:
      - application
    volumes:
      - ./logs/nginx/:/var/log/nginx
  php:
    container_name: buildchaintest_php_1
    build: php-fpm
    expose:
      - "9000"
    volumes_from:
      - application
    volumes:
      - ./logs/php-fpm/:/var/www/logs

trên máy chủ jenkins của chúng tôi, tôi chạy phần sau để xây dựng và gắn thẻ hình ảnh

cd $WORKSPACE && PROJECT_VERSION=$(cat VERSION)-dev
/usr/local/bin/docker-compose rm -f
/usr/local/bin/docker-compose build
docker tag ourprivate.docker.reg:5000/ourcompany/buildchaintest ourprivate.docker.reg:5000/ourcompany/buildchaintest:$PROJECT_VERSION
docker push ourprivate.docker.reg:5000/ourcompany/buildchaintest

điều này dường như đang làm những gì nó phải như vậy vì tôi nhận được thẻ phiên bản mới trong kho lưu trữ của chúng tôi mỗi khi quá trình xây dựng hoàn thành và phiên bản nr đã bị thay đổi.

Nếu bây giờ tôi chạy

docker-compose pull && docker-compose -f docker-compose.yml up -d

trong một thư mục trên máy tính của tôi, nơi nội dung chỉ là docker-compo.yml và các Dockerfiles cần thiết để xây dựng các dịch vụ nginx và php, đầu ra tôi nhận được không phải là số phiên bản mới nhất như đã được gắn thẻ trong sổ đăng ký hoặc được hiển thị trong docker-compost.yml (0.1.8), nhưng là phiên bản trước đó, 0.1.7. Tuy nhiên, đầu ra của lệnh pull sẽ gợi ý rằng một phiên bản mới của hình ảnh đã được tìm nạp:

Pulling application (ourprivate.docker.reg:5000/ourcompany/buildchaintest:latest)...
latest: Pulling from ourcompany/buildchaintest
Digest: sha256:8f7a06203005ff932799fe89e7756cd21719cccb9099b7898af2399414bfe62a
Status: Downloaded newer image for docker.locotech.fi:5000/locotech/buildchaintest:0.1.8-dev

Chỉ khi tôi chạy

docker-compose stop && docker-compose rm -f

và sau đó chạy docker-compose uplệnh để tôi nhận được phiên bản mới hiển thị trên màn hình như mong đợi.

Đây có phải là hành vi dự định của docker-soạn không? tức là tôi có nên luôn thực hiện docker-compose rm -ftrước khi chạy uplại, ngay cả trên máy chủ sản xuất không? Hay tôi đang làm gì đó chống lại hạt ở đây, đó là lý do tại sao nó không hoạt động?

Mục tiêu là để quy trình xây dựng của chúng tôi xây dựng và tạo các phiên bản được gắn thẻ của những hình ảnh cần thiết trong docker-compos.yml, đẩy chúng vào sổ đăng ký riêng tư của chúng tôi và sau đó cho "bước phát hành đến bước sản xuất" để chỉ cần sao chép docker-soạn. yml đến máy chủ sản xuất và chạy một docker-compose pull && docker-compose -f docker-compose.yml up -dhình ảnh mới để bắt đầu sản xuất. Nếu ai đó có mẹo về điều này hoặc có thể chỉ ra hướng dẫn thực hành tốt nhất cho loại thiết lập này cũng sẽ được đánh giá cao.


1
docker-compose up -d --force-recreatekhông hoạt động?
BMitch

Để tránh rủi ro mất dữ liệu khi xóa / tạo lại vùng chứa, hãy sử dụng máy chủ lưu trữ hoặc ổ đĩa đã đặt tên. Có vẻ như bạn đang sử dụng khối lượng máy chủ lưu trữ cho các vùng chứa khác. Ổ đĩa trống có tên sẽ khởi tạo với nội dung của ổ đĩa hình ảnh khi bạn sử dụng lần đầu.
BMitch

--force-recreate không hoạt động, không :( Tôi đang sử dụng khối lượng để lưu trữ dữ liệu, vì vậy phần mất dữ liệu có lẽ không liên quan đến mức đó. Nhưng tôi vẫn bối rối khi phải thực hiện docker-compile rm trước đây khởi động lại các vùng chứa. Không nên up, ra lệnh, đặc biệt là với cưỡng chế tạo lại, thay vào đó hãy quan tâm đến việc thông báo một hình ảnh mới bằng cách sử dụng nó? Có cảm giác sai khi tôi buộc phải xóa trên máy chủ sản xuất
Jens Wegar

Nếu --force-recreatekhông tạo lại các vùng chứa, thì bạn có thể cần phải gửi báo cáo lỗi docker-compose. Hãy nhớ rằng việc sử dụng hình ảnh mới sẽ tạo lại vùng chứa, điều này sẽ loại bỏ nó. Và nếu bạn không loại bỏ bất kỳ khối lượng cụ thể của vùng chứa nào trong quá trình này, bạn có thể nhận được một danh sách dữ liệu khá dài mà bạn không bao giờ sử dụng lại docker volume ls -f dangling=true. Vì vậy, cách khắc phục của bạn là nửa đầu tiên của những gì docker-soạn sẽ làm cho bạn.
BMitch

Ok, cảm ơn bạn! Tôi sẽ phải tìm hiểu thêm một chút để đảm bảo rằng tôi hiểu quy trình (vẫn là một người mới khi nói đến Docker), nhưng có vẻ như docker-compile rm -f trước khi xây dựng là điều tôi cần làm sau đó.
Jens Wegar

Câu trả lời:


65

để đảm bảo rằng bạn đang sử dụng phiên bản mới nhất cho :latestthẻ từ sổ đăng ký của mình (ví dụ: trung tâm docker), bạn cũng cần phải kéo lại thẻ mới nhất. trong trường hợp nó thay đổi, khác biệt sẽ được tải xuống và bắt đầu lại khi bạn thực hiện docker-compose uplại.

vì vậy đây sẽ là cách để đi:

docker-compose stop
docker-compose rm -f
docker-compose pull   
docker-compose up -d

tôi đã dán cái này vào một hình ảnh mà tôi chạy để bắt đầu docker-compose và đảm bảo hình ảnh luôn được cập nhật: https://hub.docker.com/r/stephanlindauer/docker-compose-updater/


27
docker-compose pull && docker-compose up -dLà đủ. Nó tự động kiểm tra xem các vùng chứa đang chạy có lỗi thời hay không và nếu đúng như vậy, hãy tạo lại chúng bằng những hình ảnh mới nhất
Mindaugas Varkalys

@MindaugasVarkalys Nhận xét của bạn đáng lẽ phải là câu trả lời được chấp nhận, thưa ông. Hoạt động như sự quyến rũ.
Yuriy Pozniak

37

Để có những hình ảnh mới nhất, hãy sử dụng bản dựng docker-comp --pull

Tôi sử dụng lệnh dưới đây thực sự là 3 trong 1

docker-compose down && docker-compose build --pull && docker-compose up -d

Lệnh này sẽ dừng các dịch vụ, kéo hình ảnh mới nhất và sau đó khởi động các dịch vụ.


Có lẽ bạn nên thêm docker-compose pullđể cập nhật hình ảnh cho các dịch vụ có image: thay vì build: in docker-compose.ymlhay sẽ docker-compose build --pulllàm điều này?
OceanBT

Tôi nhận được nginx uses an image, skippingkhi sử dụng docker-compile build --pull Do đó không cập nhật hình ảnh.
Antonio Araujo

23

Để kết thúc câu hỏi này, những gì dường như đã hoạt động thực sự đang chạy

docker-compose stop
docker-compose rm -f
docker-compose -f docker-compose.yml up -d

Tức là loại bỏ các thùng chứa trước khi chạy uplại.

Điều cần lưu ý khi làm như vậy là các vùng chứa khối lượng dữ liệu cũng bị loại bỏ nếu bạn chỉ chạy rm -f. Để ngăn điều đó, tôi chỉ định rõ ràng từng vùng chứa để loại bỏ:

docker-compose rm -f application nginx php

Như tôi đã nói trong câu hỏi của mình, tôi không biết đây có phải là quy trình chính xác hay không. Nhưng điều này dường như phù hợp với trường hợp sử dụng của chúng tôi, vì vậy cho đến khi chúng tôi tìm thấy giải pháp tốt hơn, chúng tôi sẽ sử dụng giải pháp này.


Điều gì sẽ xảy ra nếu bạn muốn khôi phục về phiên bản vùng chứa trước đó? Rửa sạch, lặp lại?
EightyEight

1
Đã không thử nó nhưng có, tôi cho là nhiều. Vì phiên bản vùng chứa phải được xác định trong docker-compost.yml (ví dụ: myimage: 2.0.1), nếu bạn muốn khôi phục, bạn sẽ cập nhật docker-compos.yml lên phiên bản bạn muốn khôi phục (ví dụ: 2.0 .0) và thực hiện lại quy trình rửa lại tương tự.
Jens Wegar

nếu tôi muốn khôi phục, tôi chỉ cần hoàn nguyên cam kết, hãy để trung tâm docker xây dựng và sau đó chờ trình cập nhật nhận nó. có lẽ không phải là hệ thống phức tạp nhất nhưng nó hoạt động cho các dự án lúc rảnh rỗi của tôi.
stephanlindauer

Xóa mọi thứ dường như không phải là một giải pháp mà giống như một giải pháp tinh ranh hơn.
PierrickM

3

Tôi đã thấy điều này xảy ra trong hệ thống sản xuất 7-8 docker của chúng tôi. Một giải pháp khác phù hợp với tôi trong quá trình sản xuất là chạy

docker-compose down
docker-compose up -d

điều này loại bỏ các vùng chứa và dường như 'tạo' tạo ra những cái mới từ hình ảnh mới nhất.

Điều này vẫn chưa giải quyết được ước mơ của tôi về việc giảm + lên trên mỗi MỖI vùng chứa được thay đổi (theo thứ tự, ít thời gian ngừng hoạt động hơn), nhưng nó hoạt động để buộc 'lên' để cập nhật các vùng chứa.


docker-compose downafaik cũng xóa mọi vùng chứa khối lượng dữ liệu được liên kết với các vùng chứa đang chạy. Vì vậy, không có vấn đề gì nếu khối lượng dữ liệu chỉ chứa những thứ có thể được tạo lại từ một vùng chứa đang chạy. Nhưng bạn nên cẩn thận nếu các ổ chứa dữ liệu bạn muốn giữ lại.
Jens Wegar

downloại bỏ, theo mặc định và tài liệu hiện tại: vùng chứa, mạng và mạng mặc định. Doc cho biết 'Các mạng và ổ đĩa được xác định là bên ngoài không bao giờ bị xóa ". Phù hợp với tôi với các tập được đặt tên (và tôi đoán điều đó cũng đúng với các mạng được đặt tên).
arminfro 20/07/19

3

Tùy chọn downgiải quyết vấn đề này

Tôi chạy tệp soạn thảo của mình:

docker-compose -f docker/docker-compose.yml up -d

sau đó tôi xóa tất cả với down --rmi all

docker-compose -f docker/docker-compose.yml down --rmi all

Stops containers and removes containers, networks, volumes, and images
created by `up`.

By default, the only things removed are:

- Containers for services defined in the Compose file
- Networks defined in the `networks` section of the Compose file
- The default network, if one is used

Networks and volumes defined as `external` are never removed.

Usage: down [options]

Options:
    --rmi type          Remove images. Type must be one of:
                        'all': Remove all images used by any service.
                        'local': Remove only images that don't have a custom tag
                        set by the `image` field.
    -v, --volumes       Remove named volumes declared in the `volumes` section
                        of the Compose file and anonymous volumes
                        attached to containers.
    --remove-orphans    Remove containers for services not defined in the
                        Compose file

2

Tôi đã dành nửa ngày cho vấn đề này. Lý do là hãy nhớ kiểm tra nơi ghi âm lượng.

khối lượng: - api-data: / src / pattern

Nhưng thực tế là ở nơi này là mã mà chúng tôi đã thay đổi. Nhưng khi cập nhật docker, mã không thay đổi.

Do đó, nếu bạn đang kiểm tra mã của người khác và vì lý do nào đó bạn không cập nhật, hãy kiểm tra điều này.

Và nói chung, phương pháp này hoạt động:

docker-soạn xuống

bản dựng docker-soạn

docker-soạn up -d


0

Tài liệu trình soạn thảo docker cho lệnh 'up' nói rõ rằng nó cập nhật vùng chứa nếu hình ảnh được thay đổi kể từ khi thực hiện lệnh 'up' cuối cùng:

Nếu có các vùng chứa hiện có cho một dịch vụ và cấu hình hoặc hình ảnh của dịch vụ đã bị thay đổi sau khi tạo vùng chứa, thì docker-soạn thư sẽ chọn các thay đổi bằng cách dừng và tạo lại các vùng chứa (giữ nguyên các ổ đĩa được gắn kết).

Vì vậy, bằng cách sử dụng 'dừng', sau đó là 'kéo' và sau đó 'lên', do đó, điều này sẽ tránh được các vấn đề về khối lượng bị mất đối với các vùng chứa đang chạy, tất nhiên, ngoại trừ các vùng chứa có hình ảnh đã được cập nhật.

Tôi hiện đang thử nghiệm quy trình này và sẽ sớm đưa kết quả của tôi vào bình luận này.


0

Nếu cấu hình soạn docker nằm trong một tệp, chỉ cần chạy:

docker-compose -f appName.yml down && docker-compose -f appName.yml pull && docker-compose -f appName.yml up -d


-3

Tôi đang sử dụng lệnh sau để nhận hình ảnh mới nhất

sudo docker-compose down -rmi all

sudo docker-compose up -d

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.