docker-compose를 사용하여 항상 새로운 이미지에서 컨테이너를 다시 만드는 방법은 무엇입니까?


198

내 docker 이미지는 Jenkins CI 서버에 구축되어 개인 Docker Registry로 푸시됩니다. 내 목표는 항상 원래 빌드 된 이미지 상태를 시작하는 docker-compose 환경을 프로비저닝하는 것입니다.

현재 다른 컴퓨터에서 docker-compose 1.3.2와 1.4.0을 사용하고 있지만 이전 버전도 사용했습니다.

항상 docker-compose pull && docker-compose up -d명령을 사용하여 레지스트리에서 새로운 이미지를 가져 와서 시작했습니다. 나는 내가 선호하는 행동이 특정 시점까지 예상대로 작동했다고 생각하지만 그 이후 docker-compose up매번 원래 빌드 된 이미지를 시작하는 대신 이전에 중지 된 컨테이너를 다시 실행하기 시작했습니다.

이 행동을 제거 할 수있는 방법이 있습니까? 그렇게하면 docker-compose.yml 구성 파일에 연결되어 호출 할 때마다 명령 줄에 무언가를 "잊지 않는"것이 아닙니다.

추신. 목표를 달성 할 수있는 방법을 찾는 것 외에도이 행동의 배경에 대해 조금 더 알고 싶습니다. Docker의 기본 아이디어는 불변 인프라를 구축하는 것입니다. docker-compose의 현재 동작은이 접근법과 명백히 충돌하는 것 같습니다.

답변:


232

docker-compose up --force-recreate하나의 옵션이지만 CI에 사용하는 docker-compose rm -f경우 컨테이너와 볼륨을 중지하고 제거하기 위해 빌드를 시작합니다 (그런 다음 끌어 당깁니다).

이것이 내가 사용하는 것입니다 :

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

컨테이너가 재생성되는 이유는 사용될 수있는 모든 데이터 볼륨을 보존하기위한 것입니다 (그리고 up훨씬 더 빠르게 수행 되기도합니다 ).

CI를 사용하는 경우에는 원하지 않으므로 모든 것을 제거하면 원하는 것을 얻을 수 있습니다.

업데이트 : 1.7 up --build에 추가 된 사용docker-compose


1
예, 실제로 이것은 CI에서도 수행하는 작업입니다. 내가 왜 그런 말을했는지 모르겠다 ...
Adrian Mouat

@dnephin docker-compose run -d이 존재하지 않습니까? 당신은 docker-compose up -d아니오 라고 말하고 싶 습니까?
기 illa 빈센트

2
당신은 실행하면 docker-compose pull전에 docker-compose rm -f당신이 더 많은 시간을 절약 할 수 있습니다
stephanlindauer

2
마지막에 -d 플래그는 무엇입니까?
David J. Davis

3
"단독 모드 -d : 실행 컨테이너를 배경으로,"
dnephin

135

나를 위해 일한 유일한 해결책은 다음 명령이었습니다.

docker-compose build --no-cache

이렇게하면 저장소에서 새로운 이미지가 자동으로 가져오고 이전에 사용한 매개 변수로 사전 빌드 된 캐시 버전을 사용하지 않습니다.


1
또한 Windows 10에서는 DNS 서버를 자동에서 고정 또는 고정에서 자동으로 설정하는 데 도움이 될 수 있습니다.
qräbnö

2
고정 표시기 - comopse 버전 2와 OS X 건물에 나를 위해 일한
RoboBear

1
OS X 도커에서 작업했습니다.
HelloWorld

55

현재 공식 문서에 따르면 컨테이너, 네트워크, 볼륨 및 이미지가 이미 중지되었거나 부분적으로 제거 된 경우 컨테이너, 네트워크, 볼륨 및 이미지를 중지하고 제거하는 바로 가기가 있습니다.

docker-compose down

그런 다음 이미지 또는 Dockerfile에 새로운 변경 사항이 있으면 다음을 사용하십시오.

docker-compose build --no-cache

드디어:docker-compose up

하나의 명령으로 : docker-compose down && docker-compose build --no-cache && docker-compose up


2
docker-compose build --no-cacheDockerfile에 변경 사항이있는 경우에만 필요합니다.
Victor Timoftii

실제로 빅터. 감사! 컨테이너가 시작될 때 실행되는 모듈 / 응용 프로그램을 업데이트 한 후에도 필요하다고 생각했습니다. 이 경우을 (를) 실행 docker-compose up하여 서비스를 다시 빌드해야합니다 docker-compose build.
ivanleoncz

18

당신은 전달할 수 --force-recreatedocker compose up신선한 용기를 사용해야한다.

컨테이너를 재사용하는 이유는 개발 중에 변경 사항을 유지하는 것이라고 생각합니다. Compose는 볼륨과 비슷한 작업을 수행하며 컨테이너 재생 간에도 지속됩니다 (다시 생성 된 컨테이너는 이전 볼륨에 연결됨). 예를 들어 Redis 컨테이너를 캐시로 사용하고 약간 변경할 때마다 캐시를 ​​잃고 싶지 않은 경우에 유용합니다. 때로는 혼란 스럽습니다.

Compose 파일에서 이것을 강제 할 수있는 방법이 없다고 생각합니다.

아마도 그것은 불변의 인프라 원칙과 충돌합니다. 반대 주장은 아마도 프로덕션 환경에서 Compose를 사용하지 않는 것입니다. 또한 불변의 인프라가 Docker의 기본 아이디어이지만 확실하게 유스 케이스 / 판매 지점이지만 동의합니다.


답변 해주셔서 감사합니다. 예를 들어 구성 수준에서 강제 실행하는 것이 실제로 유용 할 것이라고 생각합니다. 응용 프로그램 컨테이너 기본적으로 데이터베이스 컨테이너 및 비활성화 휴양을 위해 그것을 집행 ..
크리스토프 Jozsa에게

8
--force-recreate나를 위해 작동하지 않습니다 ... 최신 버전이 있지만 이미지가
풀리지 않습니다

1
@lisak 나는 그것이 새로운 이미지를 뽑았다 고 결코 말하지 않았다. 그렇지 않습니다. 로컬로 사용 가능한 이미지를 사용하여 새 컨테이너를 시작합니다. docker pull을 수동으로 실행해야합니다.
Adrian Mouat

2
docker-compose up --build

또는

docker-compose build --no-cache

1
가능하면 코드 대신 추가 설명을 제공하기 위해 노력하십시오. 이러한 답변은 커뮤니티 회원, 특히 새로운 개발자가 솔루션의 추론을 더 잘 이해하고 후속 질문을 처리 할 필요성을 방지하는 데 도움이되므로 더욱 유용합니다.
라잔

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