[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.py
Docker 호스트 /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 ...
발견하기는 어렵지만 거기에 있습니다.
답변
나를 위해 일한 방법은 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 파일을 컨테이너에 올바르게 마운트하여 디렉토리 대신 컨테이너 내부에 파일을 만듭니다. 다른 사람들이이 예가 도움이 되길 바랍니다!