2017-10-25 19 views
1

하자 supposse 나는이 같은 Dockerfile 있습니다빌드에서 "바이 패스"된 도커 레이어 일 수 있습니까?

FROM debian:stretch 

RUN apt update 
RUN apt install -y wget 

RUN wget https://stackoverflow.com/ 
# I know the wget is useless. Is just an example :) 
CMD ["echo", "hello-world"] 

내가 wget과 문, 새로운 RUN 문을 통해 넣어합니다. 이 변경 후, 내가 다시 만들 때, 내 수정에서 내려온 모든 명령을 다시 실행하므로 wget이 다시 실행됩니다. 문제는 wget 명령이 실제 파일에서 매우 큰 파일이므로 완료하는 데 많은 시간이 걸린다는 점입니다.

문제는 wget 레이어의 실행을 다시 빌드하지 않으려면 어딘가에 도커가 "조정"될 수 있습니까? 만약 내가 이미 그것을 구축했다면, 그 레이어는 그 위에있는 문장을 변경하더라도 다시 사용될 수 있습니까?

감사합니다.

답변

2

AFAIK 도커는 변경 사항이 적용될 때까지 레이어를 재사용하고 거기에서 다시 빌드하기 시작하므로이 작업은 불가능합니다.

새로운 레이어가 이전에 빌드 된 레이어에서 테스트되기 때문에 (RUN wget 레이어는 FROM에서 RUN apt install -y wget까지의 레이어에서 테스트되고 빌드 됨) 때문입니다. 따라서 RUN wget 명령어 위에 다른 RUN 명령어를 입력하면 RUN wget 명령어의 환경이 변경되므로 다시 실행해야합니다.

"수동"으로 바꾸면 "다른"환경에 빌드 된 레이어가 재사용 될 것이라고 생각하지 않으며 권장하지도 않습니다.

1

도커 작성 또는 docker run을 실행할 때 -v 플래그를 사용하면 실행간에 지속될 볼륨을 마운트 할 수 있습니다. 파일이 없을 때 조건부로 실행되는 스크립트로 wget을 변경하십시오.

나중에 캐시하지 않지만 더 빨리 수행 할 것입니다.

나머지 스크립트 및 환경 설정에 따라 파일을 저장할 폴더를 수정해야 할 수 있습니다.

나는 볼륨이 여기에 장착 구도를 사용하고 있습니다 : bash는 예를 들어 그 환매 특약의 bin/download-files.sh 파일에서 https://github.com/jaydorsey/ghgvcR/blob/master/docker-compose.yml

봐.