이미지를 깨끗하게 빌드하기 위해 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.