2017-09-30 2 views
0

Docker 컨테이너로 배포하려는 웹 응용 프로그램을 구축 중입니다. 애플리케이션은 별도의 Git 저장소에 저장된 일련의 자산에 따라 달라집니다. 별도의 저장소를 사용하는 이유는 해당 저장소의 기록이 현재의 결제보다 훨씬 크기 때문에 소스 코드가 들어있는 저장소의 기록을 건드리지 않고 해당 기록을 버릴 수있는 방법을 원합니다. 나는 자산을 통과하고있어에만 관련 부분을 포함하는 아래의 예에서 빌드간에 다운로드 된 리소스를 캐시하는 모범 사례

는 파일을 사용하여 빌드 프로세스에 ID를 커밋 리포지토리 :

FROM something:something 

# [install Git and stuff] 

COPY ["assets_git_id", "/root/"] 
RUN git clone --bare git://lala/assets.git /root/assets.git \ 
    && mkdir -p /srv/app/assets 
    && git --git-dir=/root/assets.git --work-tree=/srv/app/assets checkout $(</root/assets_git_id) . 
    && rm -r /root/assets.git 

# [set up the rest of the application] 

여기서 문제는 그 때마다 해당 ID가 변경되면 전체 저장소는 빌드 프로세스 중에 복제되고 대부분의 데이터는 폐기됩니다.

이러한 경우 낭비되는 리소스를 줄이는 표준 방법은 무엇입니까? 이상적으로는 같은 빌드의 여러 실행 사이에 내용이 보관되는 빌드 중에 컨테이너 내부의 디렉토리에 액세스하고 싶습니다. 그런 다음 RUN 스크립트는 저장소를 업데이트하고 매번 전체 저장소를 복제하는 대신 관련 데이터를 복사 할 수 있습니다.

+0

스테이지로 복사되는 것을 제외하고, 1 단계에서 무엇 이건 폐기되며, 최종 이미지에 대한

# Stage 1 FROM something:something as GitSource # [install Git] RUN git clone --bare git://lala/assets.git /root/assets.git COPY ["assets_git_id", "/root/"] RUN git --git-dir=/root/assets.git pull RUN mkdir -p /srv/app/assets RUN git --git-dir=/root/assets.git --work-tree=/srv/app/assets checkout $(</root/assets_git_id) . # Stage 2 FROM something:something COPY --from=GitSource /srv/app/assets /srb/app/assets # [set up the rest of the application] 

를 구축 그런 다음 git에서 해당 파일을 분리해야합니다. 이를 아카이브로 내보내고 아카이브를 추출하고 삭제하십시오. 다음을 참조하십시오 : https://stackoverflow.com/questions/11018411/how-do-i-export-a-specific-commit-with-git-archive – blacklabelops

+0

전체 저장소를 왜 복제하고 있습니까? 'git clone --work-tree =/srv/app/assets --git-dir =/root/assets.git --depth 1 -b git : // lala/assets와 같은 것을 사용하지 않는 이유는 무엇입니까? 자식. 이렇게하면 내역이 제한됩니다. –

+0

@ TarunLalwani 이미지를 업데이트하고 분기 이름을 다시 사용하거나 분기에 새 커밋을 적용하지 않을 때마다 새 분기를 만드는 경우에만 작동합니다. 그렇지 않으면 Docker는 캐시 된 이미지를 사용하고 목적을 무효화합니다. 자식은 커밋 ID에서 얕은 복제본을 만들 수 없습니다. – Feuermurmel

답변

0

를 사용하여 다중 단계는 당신이 단지의 파일을 원하는 경우 2

+0

안녕하세요! 다중 단계 빌드에 익숙합니다. 하지만 그게 어떻게 개선 될지는 모르겠다. AFAICT'assets_git_id'가 바뀔 때마다 전체 저장소를 복제하고 같은 크기의 이미지를 만듭니다. 내가 뭘 놓치고 있니? – Feuermurmel

+0

답변을 수정했습니다. 지금 어떻게 생각하니? – Robert

+0

시도해 주셔서 감사합니다하지만이 솔루션은 피할 수없는 것을 지연시킵니다. 'RUN git clone ... '단계에서 생성 된 캐시 된 이미지의 저장소는 점점 더 오래된 것이되고'RUN git --git-dir = ... pull' 단계는 계속해서 더 많은 내용을 다운로드해야합니다 . – Feuermurmel