이미지를 깨끗하게 빌드하기 위해 Docker를 강제 실행하는 방법


813

아래 명령을 사용하여 Docker 파일에서 Docker 이미지를 작성했습니다.

$ docker build -t u12_core -f u12_core .

동일한 명령으로 다시 빌드하려고하면 다음과 같은 빌드 캐시를 사용합니다.

Step 1 : FROM ubuntu:12.04
 ---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <pavan.gupta@gmail.com>
 ---> Using cache
 ---> 4354ccf9dcd8
Step 3 : RUN apt-get update
 ---> Using cache
 ---> bcbca2fcf204
Step 4 : RUN apt-get install -y openjdk-7-jdk
 ---> Using cache
 ---> 103f1a261d44
Step 5 : RUN apt-get install -y openssh-server
 ---> Using cache
 ---> dde41f8d0904
Step 6 : RUN apt-get install -y git-core
 ---> Using cache
 ---> 9be002f08b6a
Step 7 : RUN apt-get install -y build-essential
 ---> Using cache
 ---> a752fd73a698
Step 8 : RUN apt-get install -y logrotate
 ---> Using cache
 ---> 93bca09b509d
Step 9 : RUN apt-get install -y lsb-release
 ---> Using cache
 ---> fd4d10cf18bc
Step 10 : RUN mkdir /var/run/sshd
 ---> Using cache
 ---> 63b4ecc39ff0
Step 11 : RUN echo 'root:root' | chpasswd
 ---> Using cache
 ---> 9532e31518a6
Step 12 : RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
 ---> Using cache
 ---> 47d1660bd544
Step 13 : RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
 ---> Using cache
 ---> d1f97f1c52f7
Step 14 : RUN wget -O aerospike.tgz 'http://aerospike.com/download/server/latest/artifact/ubuntu12'
 ---> Using cache
 ---> bd7dde7a98b9
Step 15 : RUN tar -xvf aerospike.tgz
 ---> Using cache
 ---> 54adaa09921f
Step 16 : RUN dpkg -i aerospike-server-community-*/*.deb
 ---> Using cache
 ---> 11aba013eea5
Step 17 : EXPOSE 22 3000 3001 3002 3003
 ---> Using cache
 ---> e33aaa78a931
Step 18 : CMD /usr/sbin/sshd -D
 ---> Using cache
 ---> 25f5fe70fa84
Successfully built 25f5fe70fa84

캐시는 에어로 스파이크가 설치되었음을 보여줍니다. 그러나이 이미지에서 생성 된 컨테이너 내부에서 찾을 수 없으므로 캐시를 사용하지 않고이 이미지를 다시 작성하고 싶습니다. Docker가 캐시없이 깨끗한 이미지를 다시 작성하도록하려면 어떻게해야합니까?


10
따로, 일반적으로 RUN지시문 수를 최소화하려고 노력해야합니다 .
— tripleee

4
@tripleee 왜 설명 할 수 있습니까?
— 예.

9
@당신. Docker는 항상 각 RUN지시문 에 대해 별도의 계층을 만들었 으므로 지시문이 Dockerfile많은 경우 RUN엄청난 양의 디스크 공간이 소비됩니다. 그러나 이것은 최근 버전에서 다소 개선되었습니다.
— tripleee 2019

시도 할 때 docker-compose up -d어디에서 사용할 수 --no-cache있습니까?
— 우

@Oo 불가능합니다. 먼저해야 할 docker-compose build --no-cache다음과docker-compose up -d
— 마틴 Melka

답변:


1440

있다 --no-cache옵션 :

docker build --no-cache -t u12_core -f u12_core .

Docker의 이전 버전에서는을 전달해야 --no-cache=true했지만 더 이상 그렇지 않습니다.


88
또한 --no-cache작동합니다 docker-compose build.
— Blackus

42
을 사용할 수도 있습니다 --pull. 이것은 docker에게 최신 버전의 기본 이미지를 얻도록 지시합니다. 이 외에도 필요하다 --no-cache: 당신은 이미 (예 : 기본 이미지가 있다면 ubuntu/latest당신은 마지막으로 가져온 이후 기본 이미지가 업데이트되었습니다). 여기 에서 문서를 참조 하십시오 .
— Collin Krawll

2
@ CollinKrawll : --pull옵션이 나를 위해 트릭을했습니다. 그냥 --no-cache빌드가 여전히 중단되었습니다. 넣어도 --pull효과가 있었다! 감사합니다!
— Erdős-Bacon

1
누군가 도커 빌드를 호출하는 경우 캐시없이 다시 빌드한다고 가정하지 않습니까? 어떤 유스 케이스에서 누군가 이미지를 만들고 이전에 빌드 한 이미지를 사용하고 싶습니까? <rant> 이전 빌드가 자동으로 실패했지만 "성공"으로 완료되어 하루가 지났습니다. 빌드 스크립트 업데이트가 작동하지 않는 이유를 이해하지 못하는 깨진 이미지를 사용하고있었습니다. </ rant>
— Jeff

3
@Jeff 도커 이미지를 개발할 때 도커 빌드는 수정 된 레이어 / 단계 만 다시 실행합니다. 5 단계가 있고 인덱스 3에서 새 단계를 추가하면 1 단계 및 2 단계와 연관된 레이어를 재사용 할 수 있습니다. 이것은 개발 과정의 속도를 크게 향상시킵니다.
— 플레이크

130

극단적 인 경우 반복적 인 빌드 실패를 해결하는 유일한 방법은 다음을 실행하는 것입니다.

docker system prune

명령은 확인을 요청합니다.

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all networks not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N]

물론이 질문에 대한 직접적인 대답은 아니지만 생명을 구할 수도 있습니다.


8
-a -f를 추가하면 더 좋아집니다
— Ravi

1
@IulianOnofrei 저를 위해 일합니다Docker version 17.09.0-ce, build afdb6d4
— Per Lundberg

1
@ PerLundberg, docker같은 버전으로 업데이트 했으며 작동합니다. 감사합니다.
— Iulian Onofrei

1
이것은이 시나리오에서 과도하게 사용되며 모든 것을 삭제하지 않으려는 경우 유용한 대답이 아닙니다.
— M_dk

1
이렇게하면 중지 된 컨테이너의 이미지가 삭제 될 수도 있습니다. 최신 버전의 도커에는 docker builder prune캐시 된 빌드 계층을 지우라는 명령 이 있습니다. 스택 오버플로에서 명령을 맹목적으로 복사 한 후 함정에 빠졌습니다.
— Evil Azrael

59

이 명령 docker build --no-cache .은 비슷한 문제를 해결했습니다.

Dockerfile은 다음과 같습니다.

RUN apt-get update
RUN apt-get -y install php5-fpm

그러나 다음과 같아야합니다.

RUN apt-get update && apt-get -y install php5-fpm

업데이트 캐싱을 방지하고 별도로 설치하십시오.

참조 : 쓰기 Dockerfiles에 대한 모범 사례


10
"있어야만한다"는 오해의 소지가있다. Docker가 캐시 된 사본이 있음 RUN apt-get update && apt-get -y install php5-fpm을 발견하면 여전히 오래된 내용으로 재사용되는 것을 볼 수 있습니다.
— tripleee

10
실제로 설치 라인을 변경하면 여전히 오래된 패키지 캐시를 사용하므로 캐시가 오래되면 문제가 발생합니다 (일반적으로 파일은 404).
— John Chadwick

18

업데이트에 대한 기본 이미지 확인을 포함하여 빌드가 완전히 다시 빌드되도록하려면 빌드 할 때 다음 옵션을 사용하십시오.

--no-cache -이미 사용 가능한 레이어를 강제로 다시 빌드합니다.

--pull -FROM을 사용하여 참조 된 기본 이미지를 가져와 최신 버전을 얻습니다.

따라서 전체 명령은 다음과 같습니다.

docker build --pull --no-cache --tag myimage:version .

docker-compose에 동일한 옵션을 사용할 수 있습니다.

docker-compose build --no-cache --pull

13

나는 사용하지 않는 것이 좋습니다 --no-cache귀하의 경우에는 .

3 단계에서 9 단계까지 두 개의 설치를 실행하고 있습니다 (물론 하나의 라이너 사용을 선호합니다). 이미지를 작성할 때마다 이러한 단계를 다시 실행하는 오버 헤드를 원하지 않으면 당신의 Dockerfile앞에 임시 단계로 당신 을 수정wget 지시 .

나는 같은 RUN ls .것을하고 RUN ls ./그때로 변경하는 데 사용RUN ls ./. 는 tarball에서 검색 한 각 수정 사항에 대해wget

물론 각 반복마다 RUN echo 'test1' > test && rm test숫자를 늘리는 것과 같은 작업을 수행 할 수 있습니다 'test1.

더러워 보이지만, 내가 아는 한 Docker의 캐시 시스템을 계속 사용하는 가장 효율적인 방법이므로 많은 레이어가있을 때 시간을 절약 할 수 있습니다 ...


3
특정 시점 이후 캐시를 사용하지 할 수있는 능력은 (참조 많은 요청하는 기능입니다 github.com/moby/moby/issues/1996 캐시 무효화에 대한 대안을)
— leszek.hanusz

13

도커 작성 시도 docker-compose up -d --build --force-recreate


5

여기에있는 대부분의 정보가 정확합니다.
여기에 그것들을 편집하고 사용하는 방법이 있습니다.

아이디어는 권장 접근법 (빌드 특정 및 다른 저장된 도커 객체에 영향을 미치지 않음)을 고수하고 더 급진적 인 접근법 (빌드하지 않고 다른 저장된 도커 객체에 영향을 미침)을 시도하는 것입니다.

권장 접근법 :

1) Dockerfile에서 각 단계 / 명령을 강제로 실행하십시오.

docker build --no-cache 

또는 함께 docker-compose build:

docker-compose build --no-cache

또한 up모든 컨테이너를 재생성 하는 하위 명령 과 결합 할 수도 있습니다 .

docker-compose build --no-cache &&
docker-compose up -d --force-recreate 

이 방법은 캐시를 사용하지 않고 도커 빌더 및 FROM명령 과 참조되는 기본 이미지에 사용합니다.

2) 도커 빌더 캐시를 닦으십시오 (Buildkit을 사용하는 경우 필요할 것입니다).

docker builder prune -af

3) 부모 이미지의 캐시를 사용하지 않으려면 다음과 같이 이미지를 삭제하려고 할 수 있습니다.

docker image rm -f fooParentImage

대부분의 경우,이 3 가지 사항은 이미지를 깔끔하게 구축 할 수있을 정도로 완벽합니다.
그래서 우리는 그것에 충실하려고 노력해야합니다.

더 급진적 인 접근 방식 :

도커 캐시의 일부 객체가 빌드 중에 여전히 사용되고 반복 가능한 것으로 보이는 코너 부분에서는 누락 된 부분을 매우 구체적으로 지울 수있는 원인을 이해해야합니다. 처음부터 다시 작성하는 방법을 찾지 못하면 다른 방법이 있지만 일반적으로 필요한 것보다 훨씬 많은 것을 삭제한다는 것을 기억하는 것이 중요합니다. 따라서 로컬 / 개발 환경에 있지 않을 때는 전체적으로 신중하게 사용해야합니다.

1) 하나 이상의 컨테이너와 관련된 모든 이미지를 제거하십시오.

docker image prune -a

2) 더 많은 것들을 제거하십시오 :

docker system prune -a

그것은 말한다 :

경고! 제거됩니다 :
  -모든 정지 된 용기
  -하나 이상의 컨테이너에서 사용하지 않는 모든 네트워크
  -컨테이너가 하나 이상없는 모든 이미지
  -모든 빌드 캐시

수퍼 삭제 명령을 사용하면 컨테이너 상태 (실행 여부)에 크게 의존하므로 충분하지 않을 수 있습니다. 그 명령이 충분하지 않으면, 어떤 docker 컨테이너가 docker 빌드에 부작용을 일으킬 수 있는지 신중하게 생각 하고이 컨테이너를 종료하여 명령으로 제거 할 수 있도록하십시오.


3

당신은 빌더 캐시를 관리 할 수 ​​있습니다 docker builder

프롬프트없이 모든 캐시를 정리하려면 다음을 수행하십시오. docker builder prune -af

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