IT

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

lottoking 2020. 6. 9. 07:48
반응형

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


내 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의 현재 동작은이 접근법과 명백히 충돌하는 것 같습니다.


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


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

docker-compose build --no-cache

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


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

docker-compose down

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

docker-compose build --no-cache

드디어:docker-compose up

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


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

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

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

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


$docker-compose build

새로운 것이 있다면 그것은 재건 될 것입니다.

참고 URL : https://stackoverflow.com/questions/32612650/how-to-get-docker-compose-to-always-re-create-containers-from-fresh-images

반응형