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-recreate
에 docker compose up
신선한 용기를 사용해야한다.
컨테이너를 재사용하는 이유는 개발 중에 변경 사항을 유지하는 것이라고 생각합니다. Compose는 볼륨과 비슷한 작업을 수행하며 컨테이너 재생 간에도 지속됩니다 (다시 생성 된 컨테이너는 이전 볼륨에 연결됨). 예를 들어 Redis 컨테이너를 캐시로 사용하고 약간 변경할 때마다 캐시를 잃고 싶지 않은 경우에 유용합니다. 때로는 혼란 스럽습니다.
Compose 파일에서 이것을 강제 할 수있는 방법이 없다고 생각합니다.
아마도 그것은 불변의 인프라 원칙과 충돌합니다. 반대 주장은 아마도 프로덕션 환경에서 Compose를 사용하지 않는 것입니다. 또한 불변의 인프라가 Docker의 기본 아이디어이지만 확실하게 유스 케이스 / 판매 지점이지만 동의합니다.
$docker-compose build
새로운 것이 있다면 그것은 재건 될 것입니다.
'IT' 카테고리의 다른 글
django MultiValueDictKeyError 오류, 어떻게 처리합니까 (0) | 2020.06.09 |
---|---|
경고 : 'characters'는 더 이상 사용되지 않습니다 : String 또는 Substring을 직접 사용하십시오 (0) | 2020.06.09 |
클래스 내에서 정적 메소드를 호출합니까? (0) | 2020.06.09 |
자바에서 문자열의 바이트 (0) | 2020.06.08 |
Java에서 &와 &&의 차이점은 무엇입니까? (0) | 2020.06.08 |