[docker] 볼륨에 단일 파일을 마운트하는 방법

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

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

그러나 실패

/var/www/html/config.php \\ “는 \\”디렉토리가 아닙니다 \\ “\” “

내가 시도하면

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

Docker는 업로드 폴더와 config.php 폴더를 만듭니다. 파일이 아닙니다.

또는 구성을 유지하는 다른 방법이 있습니까?



답변

TL; DR / 공지 사항 :

마운트하려는 파일 대신 디렉토리가 작성되는 경우 유효 하고 절대 경로 를 제공하지 않았을 수 있습니다 . 이는 조용하고 혼란스러운 실패 모드에서 흔히 발생하는 실수입니다.

파일 볼륨은 docker에서 이런 방식으로 수행됩니다 (절대 경로 예제 (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폴더 에서 docker-compose를 실행하면


답변

나는 비슷한 문제로 고통 받고 있었다. 이미지를 다시 작성하지 않고 필요할 때마다 수정할 수 있도록 구성 파일을 컨테이너로 가져 오려고했습니다.

아래 명령이 $(pwd)/config.pyDocker 호스트 /root/app/config.py에서 컨테이너로 파일로 매핑 될 것이라고 생각했습니다 .

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

그러나 항상 config.py파일이 아닌 이라는 디렉토리를 작성했습니다 .

단서를 찾는 동안 이유를 찾았습니다 ( 여기에서 )

-v 또는 –volume을 사용하여 Docker 호스트에없는 파일 또는 디렉토리를 바인드 마운트하면 -v가 엔드 포인트를 작성합니다.
항상 디렉토리로 작성됩니다 .

따라서 도커 호스트에는이 없기 때문에 항상 디렉토리로 생성됩니다 $(pwd)/config.py.

도커 호스트에서 config.py를 생성하더라도.
$(pwd)/config.py그냥 /root/app/config.py수출하지 않는 것보다 큽니다 /root/app/config.py.


답변

볼륨 ( ) 대신 마운트 ( --mount)를 사용하십시오.-v

자세한 정보 : https://docs.docker.com/storage/bind-mounts/

예:

/tmp/a.txt가 docker host에 있는지 확인하십시오.

docker run -it --mount type=bind,source=/tmp/a.txt,target=/root/a.txt alpine sh


답변

나와 같은 Windows 컨테이너를 사용하는 사람은 Windows 컨테이너를 사용하여 단일 파일을 바인딩하거나 마운트 할 수 없습니다.

컨테이너 내부의 볼륨 또는 바인드 마운트 대상은 존재하지 않거나 비어있는 디렉토리 중 하나 여야하므로 Windows 기반 컨테이너를 사용할 때 다음 예제는 실패합니다. 또는 C : 이외의 드라이브 또한 바인드 마운트의 소스는 파일이 아닌 로컬 디렉토리 여야합니다 .

net use z: \\remotemachine\share

docker run -v z:\foo:c:\dest ...

docker run -v \\uncpath\to\directory:c:\dest ...

docker run -v c:\foo\somefile.txt:c:\dest ...

docker run -v c:\foo:c: ...

docker run -v c:\foo:c:\existing-directory-with-contents ...

발견하기는 어렵지만 거기에 있습니다.

파일을 Windows 컨테이너에 매핑하는 것과 관련된 Github 문제에 연결


답변

나를 위해 일한 방법은 bind마운트 를 사용하는 것입니다

  version: "3.7"
  services:
  app:
    image: app:latest
    volumes:
      - type: bind
        source: ./sourceFile.yaml
        target: /location/targetFile.yaml

대답을 주셔서 감사합니다 마이크 품종에서 이상 : 고정 표시기-작성을 사용하여 볼륨에서 마운트 하나의 파일

bind마운트 를 표현하려면 “긴 구문”을 사용해야합니다 . https://docs.docker.com/compose/compose-file/#long-syntax


답변

다음 docker-compose.yml과 같이 파일 의 상대 경로를 사용할 수도 있습니다 (Windows 호스트, Linux 컨테이너에서 테스트).

 volumes:
      - ./test.conf:/fluentd/etc/test.conf


답변

docker-compose 파일 버전 3.2부터는 기본 파일 “volume”대신 “bind”유형의 볼륨 마운트를 지정 하여 단일 파일을 컨테이너에 마운트 할 수 있습니다. docker-compose 볼륨 문서에서 “바인드 마운트”를 검색 하십시오 .
https://docs.docker.com/compose/compose-file/#volumes

필자의 경우 로컬 개발 및 테스트 용 비밀 만 포함 된 단일 “.secrets”파일을 내 응용 프로그램에 마운트하려고했습니다. 프로덕션 환경에서는 애플리케이션이 대신 이러한 비밀 정보를 AWS에서 가져옵니다.

약식 구문을 사용하여이 파일을 볼륨으로 마운트 한 경우 :

volumes:
 - ./.secrets:/data/app/.secrets

Docker는 컨테이너 외부의 파일에 매핑하는 대신 컨테이너 내에 “.secrets” 디렉토리를 만듭니다 . 내 코드는 “IsADirectoryError : [Errno 21] 디렉토리가 ‘.secrets'”와 같은 오류를 발생시킵니다.

읽기 전용 “바인드”볼륨 마운트를 사용하여 비밀 파일을 지정하는 대신 긴 구문을 사용하여이 문제를 해결했습니다.

volumes:
 - type: bind
   source: ./.secrets
   target: /data/app/.secrets
   read_only: true

이제 Docker는 내 .secrets 파일을 컨테이너에 올바르게 마운트하여 디렉토리 대신 컨테이너 내부에 파일을 만듭니다. 다른 사람들이이 예가 도움이 되길 바랍니다!