2017-02-15 2 views
19

나는 독에 매우 익숙하며, 볼륨의 일부 개념은 나에게 상당히 혼란 스럽다.볼륨에 하나의 파일을 마운트하는 방법

내가하려는 것은 PHP 응용 프로그램을 도킹하는 것입니다. dockerfile에서 압축 파일을 다운로드하고 압축을 풉니 다.

새로운 버전이 출시되고 config.php가 덮어 쓰기 때문에 dockerfile을 업데이트하면 응용 프로그램을 다시 설치해야합니다.

그래서 나는 데이터베이스와 같이 파일을 볼륨으로 마운트 할 수 있다고 생각했습니다.

볼륨과 직접 경로를 사용하여 두 가지 방법을 시도했습니다.

고정 표시기 - 작성 :

version: '2' 
services: 
    app: 
    build: src 
    ports: 
     - "8080:80" 
    depends_on: 
     - mysql 
    volumes: 
     - app-conf:/var/www/html/upload 
     - app-conf:/var/www/html/config.php 
    environment: 
     DB_TYPE: mysql 
     DB_MANAGER: MysqlManager 

    mysql: 
    image: mysql:5.6 
    container_name: mysql 
    volumes: 
     - mysqldata:/var/lib/mysql 
    ports: 
     - 3306:3306 
    environment: 
     MYSQL_ROOT_PASSWORD: 
     MYSQL_DATABASE: 
     MYSQL_USER: 
     MYSQL_PASSWORD: 

volumes: 
    mysqldata: 
    app-conf: 
오류 결과

:

을 내가 마운트 된 볼륨으로, 주어진 경로를 시도했다.

/src/docker/myapp/upload:/var/www/html/upload 
/src/docker/myapp/upload:/var/www/html/config.php 

그러나 두 가지 방법 모두 작동하지 않습니다. 마운트 된 볼륨으로 업로드가 생성되는 것을 볼 수 있습니다.

하지만 디렉토리가 아닌 \\ "\"는 "

내가 /의 SRC와 함께하려고하면"\\ 발생 "

/var/www/html/config.php \\ 실패/고정 표시기/MyApp를/업로드/config.php를 :..

도커는 업로드 폴더와 config.php를 폴더 안 파일

를 만들거나 다른 방법이 /var/www/html/config.php 설정을 완료 하시겠습니까?

답변

35

파일 볼륨은 고정 표시기에서이 방법을 수행() ENV 변수를 사용할 수 있습니다 절대 경로 예를 (, 당신은 파일 이름 언급 할 필요) :

volumes: 
     - /src/docker/myapp/upload:/var/www/html/upload 
     - /src/docker/myapp/upload/config.php:/var/www/html/config.php 

을 또한 수행 할 수 있습니다

volumes: 
     - ${PWD}/upload:/var/www/html/upload 
     - ${PWD}/upload/config.php:/var/www/html/config.php 

당신이 만약 도커 작성 - /src/docker/myapp 폴더

+12

나는 /src/docker/myapp/upload/config.php:/var/www/html/config.php 도커 후 업로드 폴더와 config.php에 폴더를 생성하려고하면 말했듯이. 파일이 아닙니다. –

+4

귀하의 게시물에 당신이 다르게 썼습니다. 파일이 있으면 파일로 마운트해야합니다. – BlackStork

+0

https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-file-as-a-data-volume <- 단호하게 작동해야합니다. – BlackStork

9

에서 문제가 발생했습니다. 이미지를 다시 빌드하지 않고 필요할 때마다 문제를 해결할 수 있도록 컨테이너에 구성 파일을 가져 오려고했습니다.

나는 아래와 같은 명령을 Docker 호스트의 $(pwd)/config.py으로 파일에서 /root/app/config.py을 가져올 것이라고 생각했습니다.

docker run -v $(pwd)/config.py:/root/app/config.py my_docker_image 

그러나 항상 파일이 아닌 config.py이라는 디렉토리가 생성되었습니다.

단서를 찾고있는 동안, 나는 당신이 볼 수 있듯이 내 고정 표시기 호스트가 $(pwd)/config.py이 없기 때문에, 그것은 항상 디렉토리로 생성

If you use -v or --volume to bind-mount a file or directory that does not yet exist on the Docker host, -v will create the endpoint for you. It is always created as a directory.

(here에서) 이유를 발견했다.

도커 호스트에서 config.py를 만들지 만. $(pwd)/config.py 그냥 지나치다 /root/app/config.py/root/app/config.py 아니요.

+2

'Dockerfile'에'touch path/to/file'을 추가했습니다. 그래서 마운트 할 때 여전히 파일이됩니다 (생성 된 dir이 아님) – shadi

관련 문제