sourcetip

도커가 이미지를 새로 빌드하도록 강제하는 방법

fileupload 2023. 8. 16. 22:33
반응형

도커가 이미지를 새로 빌드하도록 강제하는 방법

아래 명령을 사용하여 도커 파일에서 도커 이미지를 빌드했습니다.

$ 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

캐쉬에는 에어스파이크가 설치된 것으로 표시됩니다.그러나 컨테이너 내부에서 이 이미지를 찾을 수 없으므로 캐시를 사용하지 않고 이 이미지를 다시 빌드하려고 합니다.어떻게 하면 도커가 캐시 없이 깨끗한 이미지를 재구축하도록 할 수 있습니까?

이 있습니다.--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]

물론 이 질문에 대한 직접적인 대답은 아니지만, 몇 명의 생명을 구할 수도 있습니다.제 목숨을 구했어요.

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

--no-cache 이미 가능한 로 재구성할 수 .

--pull이렇게 하면 FROM을 사용하여 참조된 기본 이미지를 끌어와 최신 버전을 확인할 수 있습니다.

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

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

도커 합성에도 동일한 옵션을 사용할 수 있습니다.

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

도커 합성 파일이 이미지를 참조하는 경우 --pull 옵션은 이미 이미지가 있는 경우 실제로 이미지를 풀하지 않습니다.

도커 합성을 강제로 실행하여 이를 다시 당기려면 다음을 실행할 수 있습니다.

docker-compose pull

docker build --no-cache .우리의 비슷한 문제를 해결했습니다.

Docker 파일은 다음과 같습니다.

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

하지만 그랬어야 했습니다.

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

업데이트 및 설치를 별도로 캐시하지 않도록 합니다.

참고: 도커 파일 작성 모범 사례

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

이 아이디어는 권장되는 접근 방식(특정 빌드로 다른 저장된 도커 개체에 영향을 미치지 않음)을 고수하고 충분하지 않을 때 보다 급진적인 접근 방식(특정 빌드가 아니라 다른 저장된 도커 개체에 영향을 미치지 않음)을 시도하는 것입니다.

권장 접근 방식:

도커 파일의 각 단계/명령을 강제로 실행합니다.

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설명.

Docker Builder 캐시를 삭제합니다(Buildkit를 사용하는 경우 필요할 수 있음).

docker builder prune -af

상위 이미지의 캐시를 사용하지 않으려는 경우 다음과 같은 캐시를 삭제할 수 있습니다.

docker image rm -f fooParentImage

대부분의 경우, 이 세 가지는 우리의 이미지를 깨끗하게 구축하기에 완벽하게 충분합니다.
그래서 우리는 그것을 고수하려고 노력해야 합니다.

보다 급진적인 접근 방식:

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

하나 이상의 용기가 연결되지 않은 상태에서 모든 이미지를 제거합니다.

docker image prune -a

더 많은 항목을 제거합니다.

docker system prune -a

다음과 같습니다.

경고! 그러면 다음 항목이 제거됩니다.중지된 모든 컨테이너모든 네트워크가 하나 이상의 컨테이너에서 사용되지 않음하나 이상의 컨테이너가 연결되지 않은 모든 이미지전체 빌드 캐시

super delete 명령을 사용하는 것은 컨테이너의 상태(실행 중인지 여부)에 따라 크게 달라지기 때문에 충분하지 않을 수 있습니다.명령어가 충분하지 않을 때, 저는 어떤 도커 컨테이너가 우리의 도커 빌드에 부작용을 일으킬 수 있는지 신중하게 생각하고 이러한 컨테이너를 종료하여 명령어로 제거할 수 있도록 합니다.

시도 콤지-포션포함도커docker-compose up -d --build --force-recreate

는 사하지않것좋다습니이는용다를 사용하는 것을 추천하지 않습니다.--no-cache당신의 경우에는

9단계까지 몇 개의 하는 것을합니다). 원하지 3단계를 할 수 .Dockerfile당신에 앞서 일시적인 조치로.wget설명.

저는 이런 일을 하곤 했습니다.RUN ls .로 변경합니다.RUN ls ./그리고나서RUN ls ./. 의 해 검 된 타 르 볼 대 대 해 수 에 정 등 등 각 된 수 행 해 에 색 ▁and ▁by ball 등해 등 ▁retrieved ▁each 대 ▁mod ification ▁so ▁done ▁the ▁tar 에 ▁on▁for ▁on 에 정 해 의wget

물론 당신은 다음과 같은 것을 할 수 있습니다.RUN echo 'test1' > test && rm test수 증가'test1각 반복에 대해

더러워 보이지만, 여러 레이어가 있을 때 시간을 절약하는 도커의 캐시 시스템을 지속적으로 활용할 수 있는 가장 효율적인 방법으로 알고 있습니다...

다음을 사용하여 작성기 캐시를 관리할 수 있습니다.docker builder

프롬프트 없이 모든 캐시를 정리하려면:docker builder prune -af

가끔씩docker build --no-cache그리고 심지어 시스템의 모든 컨테이너와 이미지를 제거한다고 해서 모든 도커 물건이 지워지는 것은 아닙니다. 이런 경우에 당신은 사용해야 합니다.docker system prune사용하지 않는 모든 컨테이너, 네트워크, 이미지 및 볼륨을 제거합니다.이렇게 하면 매달린 이미지나 컨테이너를 포함하여 캐시된 모든 데이터가 제거됩니다. 강제로 새로 빌드하려면 다음 명령을 실행하십시오.

//remove all containers
1- docker rm -f $(docker ps -aq) 

//remove all images
2- docker image rm $(docker images -q)  

/remove all unused containers, networks, images, and volumes
3- docker system prune  /

그래서 이제 도커와 관련된 모든 것이 사라지고 도커 캐시가 완전히 삭제됩니다. 마치 도커가 새로 설치된 것처럼 말입니다.

GUI 기반 접근 방식: 도커 데스크톱 도구를 엽니다(일반적으로 도커와 함께 제공됨).

  1. "컨테이너/앱"에서 해당 이미지의 실행 중인 모든 인스턴스 중지
  2. "Images"에서 빌드 이미지를 제거합니다(컨텍스트 메뉴를 보려면 상자 이름 위로 이동). 결국 기본 기본 이미지도 제거합니다.

언급URL : https://stackoverflow.com/questions/35594987/how-to-force-docker-for-a-clean-build-of-an-image

반응형