2014-09-24 1 views
5

도커 이미지의 캐싱/레이어링을 활용하여 대역폭, 디스크 공간 및 소요 시간을 절약하고 싶습니다.커밋을 사용하여 작은 변화가있는 도커 이미지 업데이트

하자 말 :

  • 내가 웹 응용 프로그램 고정 표시기 이미지를 설치하고 몇 가지 고정 표시기 호스트에 배포했습니다.
  • docker 이미지에 내 웹 앱의 소스 코드가 포함되어 있습니다.
  • 나는 코드 작업을했는데 이제는 새로운 버전의 코드를 가지고있다.

어떻게 만 버그 수정을 포함하는 새로운 고정 표시기가 마지막 이미지 위의 커밋 의 생성을 자동화해야합니까?

내 목표는 이미 이전 이미지를 다운로드 한 docker 호스트에 대한 새 이미지를 얻으려면 작은 bugfix diff 만 다운로드해야한다는 것입니다.

  • 아마 이미지에 업데이 트를 저장 어떻게 든 docker commit를 사용하는 겁니다 :

    그것에 대해 내 현재 감상의 물리게입니다.
  • 그러나 어떻게 이미지 콘텐츠에 액세스 할 수 있습니까?
  • 그럼에도 불구하고 웹 앱 서비스와 관련이없는 다양한 도구 (자식 및 셸 스크립트)를 사용하여 원래의 이미지를 혼란시키지 않으면 서 변경 사항을 어떻게 가져올 수 있습니까?
  • 나는 코드를 업데이트 할 수있는 다른 도커와 코드를 공유하기 위해 볼륨을 조사했습니다. 그러나 볼륨은 커밋되지 않습니다.

이것을 달성하는 방법에 대한 통찰력을 가져 주셔서 감사합니다!

편집 : Dockerfile을 여러 개 사용하면 유사한 문제가 발생하여이 작업을 수행하는 것처럼 보일 수 있습니다 (thx http://jpetazzo.github.io/2013/12/01/docker-python-pip-requirements/). 비행 중에 내 독커 파일을 생성해야 할 것 같습니다.

+0

이미지에 코드를 어떻게 추가합니까? – Behe

+0

@Behe 내 문제의 일부라고 진술 했으므로 귀하의 질문을 이해할 수 없습니다. 귀하의 질문에 대한 첫 번째 장소에서 (응용 프로그램을 업데이트하기 전에) 코드를 추가하는 경우, 잘 나는 자동화 된 빌드에서 ADD를 사용하여 http://dockerfile.github.io/#/python-runtime에서 생각하고있었습니다. – vaab

+0

Dockerfile을 사용하고 끝에 ADD 명령을 넣으면 변경된 내용이 추가 될 때까지 캐시에 도달 한 다음 새 내용에 대한 새 레이어를 만들어야합니다. 그게 도움이 되겠습니까? – Behe

답변

2

기존 이미지를 docker commit으로 업데이트하는 방법은 다음과 같습니다.

  1. 출시 수정할 이미지와 용기 :

    : 당신은 아마 일부 호스트 파일에 액세스 할 수 있습니다

    docker run -t -i IMAGE /bin/bash 
    

    주/디렉토리는 컨테이너에 변화를 가져

    docker run -t -i -v /host/location:/mnt/share IMAGE /bin/bash 
    

    그런 다음 Ctrl-D 또는 exit을 사용하여 종료하십시오.

    스크립트에서 이것을 자동화하려면 ID 다음 단계를 위해 컨테이너를 가져와야합니다.

    docker commit CONTAINER_ID IMAGE_NAME 
    

    참고 : 당신이 할 수

    container_id=$(docker run -d -v /host/location:/mnt/share IMAGE /bin/bash -c " 
         ## any bash code 
         rsync -av --delete --exclude .git /mnt/share /my/app/ 
         cd /my/app 
         ./autogen.sh 
        ") 
    
  2. 새로운 이미지로 수정 된 컨테이너 파일 시스템을 커밋 : 그리고 당신은 배쉬의 대화 형 세션을 직접적으로 호출 대신 명령을 발행 할 수 있습니다 첫 번째로 가져온 이미지와 동일한 IMAGE_NAME을 (를) 사용하여 컨테이너를 사용하십시오. 이렇게하면 효과적으로 이미지가 업데이트됩니다.

추가 문제 :

  • 이전 이미지를 수행 모든 수정은 마지막 이미지에 만든 새 레이어를 최소화하기 위해 노력해야한다. 규칙은 BTRFS (블록 수준 수정은 실제로 '계층'에 있음) 또는 AUFS (파일 수준 수정)를 사용하는 경우에 따라 달라질 수 있습니다. 가장 좋은 방법은 전체 소스 파일을 동일한 파일로 바꾸지 않는 것입니다 (cp -a, git checkout-index, rsync 또는 git checkout은 사용하지 말 것).

  • 업데이트 할 수 있도록 일부 도구를 설치해야합니다 (아마도 git, rsync ...). 그러나 마운트 된 호스트 볼륨 덕분에 스크립트 (또는 완벽한 도구)를 제공 할 수도 있다는 것을 잊지 마십시오.

  • 생성 된 이미지는 정통이 아니며 Dockerfile에서 가져온 것이 아닙니다. 공식적으로 Dockerfile에서 완전히 새로운 이미지를 완전히 다시 빌드해야합니다. 또는 적어도 하나의 공식 이미지를 기반으로 모든 이미지를 갖춤으로써 레이어를 최소화하십시오.