아래 명령을 사용하여 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
업데이트 캐싱을 방지하고 별도로 설치하십시오.
답변
업데이트에 대한 기본 이미지 확인을 포함하여 빌드가 완전히 다시 빌드되도록하려면 빌드 할 때 다음 옵션을 사용하십시오.
--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 빌드에 부작용을 일으킬 수 있는지 신중하게 생각 하고이 컨테이너를 종료하여 명령으로 제거 할 수 있도록하십시오.
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)