2014-09-22 6 views
8

다음 Dockerfile을 고려하십시오 작동하지 않는 고정 표시기합니다 :쓰기는 Dockerfile에서 볼륨

FROM phusion/baseimage 
VOLUME ["/data"] 
RUN touch /data/HELLO 
RUN ls -ls /data 

문제 : "/ 데이터"디렉토리는 "HELLO"파일이 포함되어 있지 않습니다. 게다가, 볼륨 디렉토리 (echo, mv, cp, ... 등)에 쓰려고 시도하는 다른 시도는 실패합니다. 디렉토리는 항상 비어 있습니다. 오류 메시지가 표시되지 않습니다.

문서 또는이 문제와 관련하여 stackoverflow에서 아무것도 찾을 수 없습니다.

잘 알려진 점이나 새로운 점이 있습니까?

docker version 반환 :

Dockerfile의 각 단계는 그 단계가 완료되면 삭제하고, (이 경우에만 해당) 컨테이너 마지막으로 그 사용하면 볼륨이 삭제됩니다 그것의 자신의 컨테이너에서 실행되는
Client version: 1.2.0 
Client API version: 1.14 
Go version (client): go1.3.1 
Git commit (client): fa7b24f 
OS/Arch (client): linux/amd64 
Server version: 1.2.0 
Server API version: 1.14 
Go version (server): go1.3.1 
Git commit (server): fa7b24f 

답변

8

명령이 완료되면 삭제됩니다. 이렇게하면 볼륨이 Dockerfiles에서 사용하기에 적합하지 않게됩니다. Docker 파일은 어디서나 실행할 수 있도록 고안되었으며, 지속되는 Volumes를 사용하면 더 어려워 질 것입니다. 반면에 정말로 이것을 원하면 호스트의 디렉토리로 볼륨을 백업하십시오.

추신 : 호스트의 데이터 디렉토리를 초기화하는 것이 Docker 파일 외부에서 수행하는 것이 가장 좋습니다.

이 단계의 아이디어는 호스트이 Dockerfile에 의해 생성 된 이미지를 실행하도록 준비하기 때문에 마지막으로 나는 이것을 필요로했습니다. 그런 다음 도커가 달린 컨테이너를 만들었고 그 컨테이너 내에서 일반적인 DB 설정을 실행했습니다. 이 컨테이너는 데이터가 어느 DIR 함께 가져, 또는 호스트에 동일한 프로세스를 사용하여 생성 될 수 있다는 새로운 호스트로 이동하기

docker run -v /var/lib/mysql:/raid/.../mysql ... 
/usr/bin/mysql_install_db 
mysql_secure_installation 

. 또는 나의 예제에서와 같이 다른 애플리케이션을 위해 또 다른 mysql db를 원한다면 컨테이너 생성을 반복 할 필요가 없다.

중요한 개념은 컨테이너 생성과 호스트 설정을 별도로 유지하는 것입니다.

+0

문제의 원인에 대한 아주 좋은 설명에 감사드립니다. "빌드 할 때"디렉토리에 볼륨을 백업하는 방법은 무엇입니까? 예를 들어, 데이터베이스 초기화는 빌드 중에 수행됩니다. – akhikhl

+0

나는 이것을 편집 할 것이다. –