docker-compose를 가져와 저장소에서 최신 이미지를 사용하는 방법


89

내가 뭘 잘못하고 있는지 모르겠지만 docker-compose up먼저 시스템에서 오래된 컨테이너를 완전히 제거하지 않으면 레지스트리에서 최신 이미지를 사용할 수 없습니다 . docker-compose pull이 최신 이미지를 가져 왔음에도 compose가 이전에 시작된 이미지를 사용하는 것처럼 보입니다.

항상 새로운 이미지에서 컨테이너를 다시 생성하기 위해 docker-compose를 얻는 방법을 살펴 보았습니다 . 내 문제와 비슷해 보이지만 프로덕션 서버에서 사용할 수있는 솔루션을 찾고 있기 때문에 제공된 솔루션 중 어느 것도 나를 위해 작동하지 않으며 시작하기 전에 모든 컨테이너를 제거하고 싶지 않습니다. 다시 (가능한 데이터 손실?). 변경된 이미지의 새 버전을 감지하고 가져 와서 해당 새 이미지로 서비스를 다시 시작하기 위해서만 작성하고 싶습니다.

나는 이것을 위해 간단한 테스트 프로젝트를 만들었는데, 유일한 목표는 각각의 새로운 빌드에서 증가 할 버전 nr을 얻는 것입니다. 생성 된 nginx 서버로 이동하면 버전 nr이 표시됩니다 (로컬에서 예상대로 작동 함).

docker 버전 : 1.11.2 docker-compose 버전 : 1.7.1 OS : docker-toolbox를 사용하여 CentOS 7 및 OS X 10.10에서 테스트되었습니다.

내 docker-compose.yml :

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

젠킨스 서버에서 다음을 실행하여 이미지를 빌드하고 태그를 지정합니다.

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

빌드가 완료되고 버전 nr이 충돌 할 때마다 저장소에서 새 버전 태그를 얻었 기 때문에 이것은 예상대로 작동하는 것 같습니다.

내가 지금 달리면

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

내 컴퓨터의 폴더에서 콘텐츠가 docker-compose.yml 및 nginx 및 php 서비스를 빌드하는 데 필요한 Dockerfiles 인 경우, 내가 얻은 출력은 레지스트리에 태그가 지정된 최신 버전 번호가 아니거나 표시됩니다. docker-compose.yml (0.1.8)에 있지만 그 이전 버전은 0.1.7입니다. 그러나 pull 명령의 출력은 이미지의 새 버전을 가져 왔음을 나타냅니다.

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

내가 달리면

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

그런 다음 docker-compose up명령 을 실행하면 예상대로 화면에 새 버전이 표시됩니다.

이것은 도커 작성의 의도 된 동작입니까? 즉 , 프로덕션 서버에서도 다시 docker-compose rm -f실행하기 전에 항상 a 를 수행 up해야합니까? 아니면 여기서 곡물에 대해 뭔가를하고 있는데 이것이 작동하지 않는 이유입니까?

목표는 빌드 프로세스가 docker-compose.yml에 필요한 이미지의 태그가 지정된 버전을 빌드하고 생성하고,이를 개인 레지스트리로 푸시 한 다음 "release to production-step"에서 단순히 docker-compose를 복사하도록하는 것입니다. yml을 프로덕션 서버에 추가하고 프로덕션 docker-compose pull && docker-compose -f docker-compose.yml up -d에서 새 이미지를 시작 하려면 a 를 실행하십시오 . 누구든지 이것에 대한 팁이 있거나 이러한 종류의 설정에 대한 모범 사례 자습서를 가리킬 수 있다면 많은 도움이 될 것입니다.


2
docker-compose up -d --force-recreate작동하지 않았습니까?
BMitch

컨테이너를 제거 / 다시 생성 할 때 데이터 손실 위험을 방지하려면 호스트 또는 명명 된 볼륨을 사용하십시오. 이미 다른 컨테이너에 호스트 볼륨을 사용하고있는 것 같습니다. 비어있는 명명 된 볼륨은 처음 사용할 때 이미지 볼륨의 내용으로 초기화됩니다.
BMitch

--force-recreated가 작동하지 않았습니다. 아니요 :( 데이터 저장을 위해 볼륨을 사용하고 있으므로 데이터 손실 부분은 그다지 적절하지 않습니다.하지만 이전에 docker-compose rm을 수행해야하는 것에 대해 여전히 혼란 스럽습니다. 컨테이너를 다시 시작합니다. 특히 force-recreate 명령을 사용하여 새 이미지를 인식하고 대신 사용하여 새 이미지를 인식해야하지 않습니까? 프로덕션 서버에서 강제로 제거해야한다는 것은 잘못된 느낌입니다
Jens Wegar

--force-recreate컨테이너를 다시 생성하지 않는 경우 에서 버그 보고서를 제출해야 할 수 있습니다 docker-compose. 새 이미지를 사용하면 컨테이너가 다시 생성되어 제거된다는 점에 유의하세요. 그리고 프로세스에서 컨테이너 특정 볼륨을 제거하지 않으면에서 다시 사용하지 않는 다소 긴 데이터 목록을 얻을 수 있습니다 docker volume ls -f dangling=true. 따라서 수정 사항은 docker-compose 가해 야 할 일의 전반부입니다.
BMitch

네, 감사합니다! 프로세스를 이해했는지 확인하기 위해 좀 더 조작해야하지만 (Docker에 관해서는 여전히 초보자 임), 빌드하기 전에 docker-compose rm -f처럼 보입니다.
옌스 Wegar

답변:


68

:latest레지스트리 (예 : 도커 허브)에서 태그에 최신 버전을 사용하고 있는지 확인 하려면 최신 태그도 다시 가져와야합니다. 변경된 경우 diff가 다운로드되어 docker-compose up다시 시작됩니다 .

그래서 이것이 갈 길입니다.

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

나는 이것을 Docker-compose를 시작하고 이미지가 최신 상태로 유지되도록 실행하는 이미지에 붙였습니다 .https : //hub.docker.com/r/stephanlindauer/docker-compose-updater/


40
docker-compose pull && docker-compose up -d충분합니다. 그것은 자동으로 검사를 실행 컨테이너는 구식하고 그런 경우가 있다면, 최신 이미지를 다시 작성하는 경우
Mindaugas의 Varkalys을

@MindaugasVarkalys 귀하의 의견은 수락 된 답변이어야합니다. 매력처럼 작동합니다.
Yuriy Pozniak

37

최신 이미지를 얻으려면 docker-compose build --pull을 사용하십시오.

나는 실제로 3 in 1 인 아래 명령을 사용합니다.

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

이 명령은 서비스를 중지하고 최신 이미지를 가져온 다음 서비스를 시작합니다.


어쩌면 당신은 추가해야합니다 docker-compose pull지역 : 대신 빌드의 : 이미지와 서비스에 대한 업데이트 이미지 docker-compose.yml또는 것 docker-compose build --pull이렇게?
oceanBT

내가 얻을 nginx uses an image, skipping--pull 따라서 고정 표시기-작성 빌드를 사용하여 이미지를 업데이트하지 않는 경우.
Antonio Araujo

23

이 질문을 끝내기 위해 효과가 있었던 것처럼 보이는 것이 실제로 실행 중입니다.

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

즉, up다시 실행하기 전에 컨테이너를 제거 하십시오.

이렇게 할 때 명심해야 할 점은 rm -f.을 실행하면 데이터 볼륨 컨테이너도 제거된다는 것 입니다. 제거 할 각 컨테이너를 명시 적으로 지정하는 것을 방지하려면 다음을 수행하십시오.

docker-compose rm -f application nginx php

내 질문에서 말했듯이 이것이 올바른 프로세스인지 모르겠습니다. 그러나 이것은 우리의 사용 사례에서 작동하는 것처럼 보이므로 더 나은 솔루션을 찾을 때까지이 솔루션을 사용할 것입니다.


이전 컨테이너 버전으로 롤백하려면 어떻게해야합니까? 헹구고 반복 하시겠습니까?
EightyEight

1
시도하지 않았지만 그래, 나는 많이 가정합니다. 컨테이너 버전은 docker-compose.yml (예 : myimage : 2.0.1)에 정의되어야하므로 롤백하려면 docker-compose.yml을 롤백하려는 버전 (예 : 2.0)으로 업데이트해야합니다. .0) 동일한 헹굼 과정을 다시 반복합니다.
옌스 Wegar

롤백하려면 커밋을 되돌리고 도커 허브가 빌드되도록 한 다음 업데이터가 선택할 때까지 기다립니다. 아마도 가장 정교한 시스템은 아니지만 여가 시간 프로젝트에 적합합니다.
stephanlindauer

모든 것을 제거하는 것은 해결책이 아닌 어리석은 것 같습니다.
PierrickM

3

나는 이것이 우리의 7-8 도커 프로덕션 시스템에서 발생하는 것을 보았습니다. 프로덕션에서 저에게 도움이 된 또 다른 솔루션은

docker-compose down
docker-compose up -d

이것은 컨테이너를 제거하고 최신 이미지에서 새 컨테이너를 만드는 '구성'하는 것처럼 보입니다.

이것은 아직 각 변경된 컨테이너 당 down + up에 대한 나의 꿈을 해결하지 못하지만 (연속적으로, 다운 타임 감소), 컨테이너를 업데이트하기 위해 강제로 작동합니다.


docker-compose downafaik은 실행중인 컨테이너에 연결된 모든 데이터 볼륨 컨테이너도 제거합니다. 따라서 데이터 볼륨에 실행중인 컨테이너에서 다시 생성 할 수있는 항목 만 포함되어 있어도 문제가되지 않습니다. 그러나 볼륨에 유지하려는 데이터가 포함되어 있으면주의해야합니다.
Jens Wegar

1
down기본 및 현재 문서 (컨테이너, 네트워크 및 기본 네트워크)를 제거합니다. Doc은 '외부로 정의 된 네트워크와 볼륨은 절대 제거되지 않습니다'라고 말합니다. 이름이 지정된 볼륨으로 저에게 적합합니다 (이름이 지정된 네트워크에서도 마찬가지입니다).
arminfro

3

down이 문제를 해결하는 옵션

내 작성 파일을 실행합니다.

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

그런 다음 모두 삭제 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

3

나는이 문제로 반나절을 보냈다. 그 이유는 볼륨이 녹음 된 위치를 확인하기 때문입니다.

볼륨 :-api-data : / src / patterns

하지만 사실은 여기에 우리가 변경 한 코드가있었습니다. 그러나 도커를 업데이트 할 때 코드는 변경되지 않았습니다.

따라서 다른 사람의 코드를 확인하고 어떤 이유로 업데이트하지 않는 경우이를 확인하십시오.

따라서 일반적으로이 접근 방식은 다음과 같이 작동합니다.

docker-compose down

도커 작성 빌드

도커 구성 -d


0

'up' 명령에 대한 docker-compose 문서 는 마지막 'up'이 수행 된 이후 이미지가 변경되면 컨테이너를 업데이트한다고 명확하게 명시합니다.

서비스에 대한 기존 컨테이너가 있고 컨테이너 생성 후 서비스의 구성 또는 이미지가 변경된 경우 docker-compose up 은 컨테이너를 중지하고 다시 생성 (마운트 된 볼륨 유지)하여 변경 사항을 선택합니다.

따라서 '중지', '풀', '업'을 차례로 사용하면 이미지가 업데이트 된 컨테이너를 제외하고 실행중인 컨테이너의 볼륨 손실 문제를 방지 할 수 있습니다.

현재이 프로세스를 실험 중이며 곧이 의견에 결과를 포함 할 것입니다.


심지어 단지 고정 표시기-작성 풀은 첫 번째는 정지하지 않고 작동 고정 표시기-작성까지 다음
jflsitecore

0

docker compose 구성이 파일에 있으면 다음을 실행하십시오.

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


-3

최신 이미지를 얻기 위해 다음 명령을 사용하고 있습니다.

sudo docker-compose down -rmi all

sudo docker-compose up -d

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.