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

아래 명령을 사용하여 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가 캐시없이 깨끗한 이미지를 다시 작성하도록하려면 어떻게해야합니까?



답변

있다 --no-cache옵션 :

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

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


답변

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

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]

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


답변

이 명령 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에 대한 모범 사례


답변

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

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

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

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

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

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

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


답변

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

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

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

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

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


답변

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


답변

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

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

권장 접근법 :

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 빌드에 부작용을 일으킬 수 있는지 신중하게 생각 하고이 컨테이너를 종료하여 명령으로 제거 할 수 있도록하십시오.