2017-10-31 6 views
5

이미지를 사용하는 실행중인 컨테이너의 볼륨을 더 이상 사용하지 않는 새로운 Docker 이미지를 만들려고합니다. Dockerfile이 아닌 docker-compose 파일을 사용하여 볼륨을 만들었습니다. 문제는 새로운 docker-compose.yml 파일을 통해 새 컨테이너를 시작할 때 여전히 볼륨이 매핑되어 있다는 것입니다. 나는 여전히이 볼륨과 그것을 사용하는 원래의 컨테이너/이미지를 유지할 필요가있다. 또한 가능하다면 동일한 도커 이미지를 계속 사용하거나 새 버전을 추가하거나 최신 버전을 추가하고 싶습니다. 저는 여기에 사용되는 단계는 다음과 같습니다Docker가 재사용 볼륨을 구성합니다.

기존 이미지의

새로운 버전 :

docker commit <Image ID> newimage 

없이 볼륨과 함께 새로운 고정 표시기-compose.yml 만들기 :

docker commit <image id> existingImage:new-version 

는 현재 실행중인 컨테이너에서 새 이미지 만들기 도커를 정의하고 실행하고 다른 프로젝트 이름으로 작성하십시오.

docker-compose -p <new project name> 

실행 중

docker run -d -p 8093:80 <img>:<version> 

나는이 볼륨의 모든 조합을 실행할 때마다 상태에서 원래의 이미지에서 매핑됩니다 : 고정 표시기-작성하지 않고, 단지 고정 표시기 실행을 사용합니다. 그래서 내 질문은, 일단 내가 볼륨을 매핑했지만 더 이상 볼륨을 사용하고 싶지 않은 이미지에서 컨테이너를 만드는 것입니다.

편집 : 나는 시도했다 추가 일 :

  • 정지 용기 제거 컨테이너를 다시 시작 고정 표시기, 실행 고정 표시기를 다시 구성한다. 불운.

편집 2 : 이미지를 통해 시작하기로 결정 . 기본 이미지를 사용하여 관련없는 이미지를 사용하는 업데이트 된 고정 점 작성 파일이있는 컨테이너를 시작했습니다. docker-compose -f up -d -> STILL을 실행해도 이미지에 매핑 된 볼륨이없고 이미지가없는 경우에도 동일한 볼륨이 매핑되며 현재 docker-compose.yml 파일은 파일을 매핑하지 않습니다. 그것은 도커가 프로젝트 용으로 매핑되는 볼륨을 캐시로 작성하는 것처럼 보입니다. 보인다 How to get docker-compose to always re-create containers from fresh images? 캐싱 이미지의 문제를 해결하지만 용기 docker-compose에서 사용하는 용기와 함께 볼륨을 제거하려면 볼륨

+0

이미지 빌드에'docker commit'을 사용하지 마십시오. 'Dockerfile'과'docker build'를 사용하십시오. – BMitch

+0

왜 안 되니? 그건 정말로 내 질문에 답하지 않고 완전히 다른 대화의 일부가 될 수도 있습니다. –

+0

유지 관리가 쉽지 않거나 쉽게 재현 할 수 없으므로 이미지가 삭제되거나 잘못된 것을 커밋하면 되돌릴 수 없습니다. 컨테이너를 서버를 설치할 때와 같은 방식으로 유지하려고 시도하는 것이 코드 냄새입니다. 질문에 대한 답변이 아니므로 여기에 의견이 나와 있습니다. – BMitch

답변

2

다른 SO 게시물에 따르면 내가하려는 것은 불가능합니다. 나중에 참조 할 수 있도록 이미지에 볼륨을 첨부 한 다음 나중에 제거하도록 결정할 수는 없습니다. 대신 볼륨없이 새 이미지를 만들어야합니다. 참조 : How to remove configure volumes in docker images

+0

질문을 잘못 해석했지만 이미지 안에 볼륨이 정의되어 있다는 것을 깨닫지 못했습니다. 나는 개인적으로 볼 때 볼 수있는 것을 포함하여 그것이 생성하는 모든 문제로 인해 이러한 관행을 권장하지 않습니다. 일단 이미지에 볼륨이 정의되면이를 정의 할 수 없습니다. https://boxboat.com/2017/01/23/volumes-and-dockerfiles-dont-mix/ – BMitch

1

를 캐싱하기 :

고정 표시기-작성에서 캐싱 옵션을 검색 한 후,이 기사를 건너 왔어요 , docker-compose down -v을 사용하십시오.

docker-compose으로 컨테이너를 시작하려면 기존 볼륨을 그대로두고 해당 볼륨을 사용하지 말고 프로젝트 이름을 변경해야합니다. 이 경우 docker-compose -p new_project_name up -d을 사용할 수 있습니다.


편집 : 여기에 고정 표시기-작성 다른 프로젝트 사이라는 이름의 볼륨을 재사용하지 않는 방법을 보여주는 예입니다,하지만 당신은이 down -v하지 않는 한 재사용하고 볼륨을 유지 않습니다

$ docker-compose -p proj1 -f docker-compose.vol-named.yml up -d 
Creating network "proj1_default" with the default driver 
Creating volume "proj1_data" with default driver 
Creating proj1_test_1 ... 
Creating proj1_test_1 ... done 

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
71f2eb516f71  busybox    "tail -f /dev/null"  5 seconds ago  Up 2 seconds         proj1_test_1 

$ docker exec -it 71f /bin/sh 
/# ls /data 
/# echo "Hello proj1" >/data/data.txt 
/# exit 

볼륨 지금 채워진 상태로 새 컨테이너를 중지하고 시작하여 지속되도록 표시합니다.

$ docker-compose -p proj1 -f docker-compose.vol-named.yml down 
Stopping proj1_test_1 ... done 
Removing proj1_test_1 ... done 
Removing network proj1_default 

$ docker-compose -p proj1 -f docker-compose.vol-named.yml up -d 
Creating network "proj1_default" with the default driver 
Creating proj1_test_1 ... 
Creating proj1_test_1 ... done 

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
311900fd3d27  busybox    "tail -f /dev/null"  5 seconds ago  Up 3 seconds         proj1_test_1 

$ docker exec -it 311 /bin/sh 
/# cat /data/data.txt 
Hello proj1 
/# exit 

예상되는 영구 볼륨이 있습니다. 다른 프로젝트를 실행할 수 있습니다. 볼륨을 표시하는 동일한 시간은 독립적 일 것입니다 :

$ docker-compose -p proj2 -f docker-compose.vol-named.yml up -d 
Creating network "proj2_default" with the default driver 
Creating volume "proj2_data" with default driver 
Creating proj2_test_1 ... 
Creating proj2_test_1 ... done 

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
d39e6fc51436  busybox    "tail -f /dev/null"  4 seconds ago  Up 2 seconds         proj2_test_1 
311900fd3d27  busybox    "tail -f /dev/null"  33 seconds ago  Up 32 seconds        proj1_test_1 

$ docker exec -it d39 /bin/sh 
/# ls -al /data 
total 8 
drwxr-xr-x 2 root  root   4096 Nov 6 19:56 . 
drwxr-xr-x 1 root  root   4096 Nov 6 19:56 .. 
/# exit 

볼륨이 새 프로젝트에서 완전히 비어 있습니다. 정리하자.

$ docker-compose -p proj2 -f docker-compose.vol-named.yml down -v 
Stopping proj2_test_1 ... 
Stopping proj2_test_1 ... done 
Removing proj2_test_1 ... done 
Removing network proj2_default 
Removing volume proj2_data 

$ docker volume ls 
DRIVER    VOLUME NAME 
local    proj1_data 

볼륨은 이전보다 proj1에 있습니다.

$ docker-compose -p proj1 -f docker-compose.vol-named.yml down -v 
Stopping proj1_test_1 ... done 
Removing proj1_test_1 ... done 
Removing network proj1_default 
Removing volume proj1_data 

$ docker volume ls 
DRIVER    VOLUME NAME 

그러나 down -v을 삭제하면 볼륨이 삭제됩니다.

+0

프로젝트 이름 변경이 작동하지 않습니다. 이미지를 커밋하고 완전히 분리하면 I.E. 새로운 도커 작성 파일, 다른 폴더 또는 도커 실행 만해도 볼륨은 여전히 ​​존재합니다. –

+0

나는 같은 것을 경험하지 않는다. 아마도 당신은 [mcve] (http://stackoverflow.com/help/mcve)를 공유 할 수 있습니다. – BMitch

+0

게시자가 docker-compose를 실행해도 볼륨이 유지되지 않는다는 것을 이해합니다. 그러나 문제는 아닙니다. 내가 가지고있는 문제는 도커 이미지가 도커 커밋을 사용할 때 매핑 된 볼륨 정보를 유지한다는 것입니다. –

관련 문제