docker-compose와 함께 docker-machine을 사용하려고합니다. docker-compose.yml 파일에는 다음과 같은 정의가 있습니다.
web:
build: .
command: ./run_web.sh
volumes:
- .:/app
ports:
- "8000:8000"
links:
- db:db
- rabbitmq:rabbit
- redis:redis
실행할 때 docker-compose up -d
모든 잘 명령을 실행하려고 할 때까지 이동하고 오류가 생성됩니다
컨테이너 b58e2dfa503b696417c1c3f49e2714086d4e9999bd71915a53502cb6ef43936d : [8] 시스템 오류 : exec : “./run_web.sh”: stat ./run_web.sh : 해당 파일 또는 디렉토리가 없습니다.
로컬 볼륨은 원격 시스템에 마운트되지 않습니다. 웹앱의 코드로 로컬 볼륨을 마운트하는 데 권장되는 전략은 무엇입니까?
답변
Docker-machine은 사용자 디렉토리를 자동 마운트합니다.하지만 때로는 그것만으로는 충분하지 않습니다.
도커 1.6에 대해서는 잘 모르지만 1.8에서는 도커 머신에 추가 마운트를 추가 할 수 있습니다.
가상 머신 마운트 지점 추가 (1 부)
CLI : (기계가 정지 된 경우에만 작동)
VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <host_dir> --automount
따라서 Windows의 예는
/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe sharedfolder add default --name e --hostpath 'e:\' --automount
GUI : (기계를 중지 할 필요가 없습니다)
- “Oracle VM VirtualBox Manager”를 시작합니다.
- 오른쪽 클릭
<machine name>
(기본값) - 설정 …
- 공유 폴더
- 오른쪽의 폴더 + 아이콘 (공유 추가)
- 폴더 경로 :
<host dir>
(e 🙂 - 폴더 이름 :
<mount name>
(e) - “Auto-mount”및 “Make Permanent”를 선택합니다 (원하는 경우 읽기 전용 …) (자동 마운트는 현재 무의미합니다 …)
boot2docker에 장착 (2 부)
boot2docker에 수동으로 마운트하십시오 .
- 로그인, “Oracle VM VirtualBox Manager”에서 “Show”를 사용하거나 IP 주소로 docker에 ssh / putty를 사용하는 등 다양한 방법이 있습니다
docker-machine ip default
. sudo mkdir -p <local_dir>
sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
그러나 이것은 컴퓨터를 다시 시작하고 마운트가 손실 될 때까지만 좋습니다.
boot2docker에 자동 마운트 추가 :
기기에 로그인되어있는 동안
- (루트로) 편집 / 만들기
/mnt/sda1/var/lib/boot2docker/bootlocal.sh
, sda1은 당신을 위해 다를 수 있습니다 … -
더하다
mkdir -p <local_dir> mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
이러한 변경으로 새 마운트 지점이 있어야합니다. 이것은 부팅시 호출되고 영구적 인 몇 안되는 파일 중 하나입니다. 더 나은 솔루션이있을 때까지 작동합니다.
이전 방법 : 덜 권장 되지만 대안으로 남음
- 편집 (루트)
/mnt/sda1/var/lib/boot2docker/profile
, sda1은 다를 수 있습니다 … -
더하다
add_mount() { if ! grep -q "try_mount_share $1 $2" /etc/rc.d/automount-shares ; then echo "try_mount_share $1 $2" >> /etc/rc.d/automount-shares fi } add_mount <local dir> <mount name>
A와 최후의 수단 , 당신은 약간 지루한 대안을 취할 수 있고, 당신은 단지 부팅 이미지를 수정할 수 있습니다.
git -c core.autocrlf=false clone https://github.com/boot2docker/boot2docker.git
cd boot2docker
git -c core.autocrlf=false checkout v1.8.1
# 또는 적절한 버전- 편집하다
rootfs/etc/rc.d/automount-shares
-
try_mount_share <local_dir> <mount_name>
끝에 fi 바로 앞에 줄을 추가 합니다. 예를 들면try_mount_share /e e
/ bin 등과 같이 os에 필요한 것으로 설정하지 마십시오.
docker build -t boot2docker .
# 처음에는 약 1 시간 정도 소요됩니다 🙁docker run --rm boot2docker > boot2docker.iso
- 이전 boot2docker.iso를 백업하고 ~ / .docker / machine / machines /의 그 자리에 새 파일을 복사하십시오.
이것은 작동합니다. 길고 복잡합니다.
docker 버전 1.8.1, docker-machine 버전 0.4.0
답변
또한이 문제가 발생했으며 docker-machine을 사용할 때 로컬 볼륨이 마운트되지 않은 것 같습니다. 해킹 솔루션은
-
docker-machine 인스턴스의 현재 작업 디렉토리를 가져옵니다.
docker-machine ssh <name> pwd
-
rsync
원격 시스템에 폴더 복사 와 같은 명령 줄 도구 사용rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:<result _of_pwd_from_1>.
기본 pwd는 / root이므로 위의 명령은 다음과 같습니다. rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/root
NB : 원격 시스템에 대한 암호를 제공해야합니다. ssh를 사용하여 원격 시스템에 빠르게 만들고 암호를 만들 수 있습니다.
-
볼륨은 마운트 지점을 달라
docker-compose.yml
에서 파일.:/app
을/root/<name_of_folder>:/app
-
운영
docker-compose up -d
NB 로컬에서 변경이 이루어지면 변경 rsync
사항을 원격 시스템에 푸시 하기 위해 다시 실행 하는 것을 잊지 마십시오 .
완벽하지는 않지만 작동합니다. 문제가 진행 중입니다. https://github.com/docker/machine/issues/179
이를 해결하려는 다른 프로젝트로는 docker-rsync가 있습니다.
답변
현재로서는 머신에 볼륨을 마운트하는 방법을 실제로 볼 수 없으므로 지금까지 필요한 파일을 머신에 복사하거나 동기화하는 방법이 있습니다.
docker-machine의 github repo에서이 문제를 해결하는 방법에 대한 대화 가 있습니다 . 누군가 docker-machine에서 scp 를 구현 하는 pull request를 만들었고 이미 master에 병합되었으므로 다음 릴리스에 포함될 가능성이 큽니다.
아직 출시되지 않았기 때문에 지금까지 코드가 github에 호스팅되어 있다면 앱을 실행하기 전에 저장소를 복제하는 것이 좋습니다.
web:
build: .
command: git clone https://github.com/my/repo.git; ./repo/run_web.sh
volumes:
- .:/app
ports:
- "8000:8000"
links:
- db:db
- rabbitmq:rabbit
- redis:redis
업데이트 : 더 자세히 살펴보면이 기능이 이미 최신 바이너리 에서 사용 가능하다는 것을 알았습니다.이 기능 을 받으면 다음과 같은 명령을 실행하는 로컬 프로젝트를 복사 할 수 있습니다.
docker-machine scp -r . dev:/home/docker/project
이것이 일반적인 형태이기 때문에 :
docker-machine scp [machine:][path] [machine:][path]
따라서 컴퓨터간에 파일을 복사 할 수 있습니다.
건배! 1
답변
2017 년 10 월 이후로 트릭을 수행하는 docker-machine에 대한 새로운 명령이 있지만 실행하기 전에 디렉토리에 아무것도 없는지 확인하십시오. 그렇지 않으면 손실 될 수 있습니다.
docker-machine mount <machine-name>:<guest-path> <host-path>
자세한 정보는 문서를 확인하십시오 : https://docs.docker.com/machine/reference/mount/
답변
docker-machine과 함께 rsync 옵션을 선택하면 다음 docker-machine ssh <machinename>
과 같은 명령과 결합 할 수 있습니다 .
rsync -rvz --rsh='docker-machine ssh <machinename>' --progress <local_directory_to_sync_to> :<host_directory_to_sync_to>
이 명령 형식의 rsync를 사용하며 HOST
비워 둡니다 .
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
답변
마지막으로 Windows Docker Toolbox를 v1.12.5로 업그레이드하고 Oracle VM VirtualBox
관리자에 공유 폴더를 추가하고 경로 변환을 비활성화 하여 볼륨을 계속 작동시키는 방법을 알아 냈습니다 . Windows 10 이상이있는 경우 최신 Windows 용 Docker를 사용하는 것이 가장 좋습니다.
첫 번째 업그레이드 문제 :
- 먼저 VirtualBox를 제거하십시오.
- 예, Android Studio와 같은 다른 도구에서 문제가 발생할 수 있습니다. 감사합니다 Docker 🙁
- 새 버전의 Docker Toolbox를 설치합니다.
Redis 데이터베이스 예 :
redis:
image: redis:alpine
container_name: redis
ports:
- "6379"
volumes:
- "/var/db/redis:/data:rw"
Docker 빠른 시작 터미널에서 ….
- 실행
docker-machine stop default
-VM이 손상되었는지 확인
Oracle VM VirtualBox Manager에서 …
default
또는 명령 줄을 통해 VM에공유 폴더 추가
D:\Projects\MyProject\db
=>/var/db
에서 docker-compose.yml
…
- redis 볼륨을 다음과 같이 매핑했습니다.
"/var/db/redis:/data:rw"
Docker 빠른 시작 터미널에서 ….
- 설정
COMPOSE_CONVERT_WINDOWS_PATHS=0
(Toolbox 버전> = 1.9.0) docker-machine start default
VM을 다시 시작하려면 실행 하십시오.cd D:\Projects\MyProject\
docker-compose up
지금 작동합니다.
이제 redis 데이터베이스를 생성합니다. D:\Projects\MyProject\db\redis\dump.rdb
상대 호스트 경로를 피하는 이유는 무엇입니까?
나는 상대 호스트 경로 회피 가 유효하지 않은 ‘\’문자를 소개 할 수 있습니다로 Windows 도구 상자에 대한합니다. 상대 경로를 사용하는 것만 큼 좋지는 docker-compose.yml
않지만 적어도 동료 개발자는 docker-compose.yml
파일 을 해킹하지 않고도 프로젝트 폴더가 다른 곳에 있더라도 쉽게 할 수 있습니다 (SCM에 좋지 않음).
원래 문제
참고로 … 다음은 이전 버전에서 잘 작동하는 깨끗한 상대 경로를 사용할 때 얻은 원래 오류입니다. 내 볼륨 매핑은"./db/redis:/data:rw"
ERROR: for redis Cannot create container for service redis: Invalid bind mount spec "D:\\Projects\\MyProject\\db\\redis:/data:rw": Invalid volume specification: 'D:\Projects\MyProject\db\redis:/data
이것은 두 가지 이유로 중단됩니다 ..
D:
드라이브에 액세스 할 수 없습니다.- 볼륨 경로에는
\
문자를포함 할 수 없습니다.
docker-compose
그들을 추가하고 그것에 대해 당신을 비난합니다!COMPOSE_CONVERT_WINDOWS_PATHS=0
이 말도 안되는 소리를 중지하는 데 사용 합니다.
docker-compose.yml
VirtualBox를 다시 제거하고 공유 폴더를 재설정해야 할 수 있으며 어쨌든 동료 개발자가 당신을 좋아할 것이므로 파일 에 추가 VM 공유 폴더 매핑을 문서화하는 것이 좋습니다 .
답변
다른 모든 답변은 당분간 좋았지 만 이제는 (Docker Toolbox v18.09.3) 모두 즉시 작동합니다. VirtualBox VM에 공유 폴더를 추가하기 만하면됩니다.
Docker Toolbox는 Virtual Box 공유 폴더 기능을 사용하여 가상 Linux 시스템 아래에 C:\Users
공유 폴더로 자동 추가 /c/Users
하므로 docker-compose.yml
파일이이 경로 아래에 있고이 경로 아래에만 호스트 시스템의 디렉토리를 마운트하면 모든 것이 즉시 작동합니다.
예를 들면 :
C:\Users\username\my-project\docker-compose.yml
:
...
volumes:
- .:/app
...
.
경로 자동 절대 경로로 변환한다 C:\Users\username\my-project
으로 다음과 /c/Users/username/my-project
. 그리고 이것은 Linux 가상 머신의 관점에서이 경로가 정확히 어떻게 보이는지입니다 (확인할 수 있습니다 : docker-machine ssh
그런 다음 ls /c/Users/username/my-project
). 따라서 최종 마운트는 /c/Users/username/my-project:/app
.
모두 투명하게 작동합니다.
그러나 호스트 마운트 경로가 C:\Users
경로 아래에 있지 않으면 작동하지 않습니다 . 예를 들어, 동일한 넣어 docker-compose.yml
아래를 D:\dev\my-project
.
이것은 쉽게 고칠 수 있습니다.
- 가상 머신 (
docker-machine stop
)을 중지합니다 . -
Virtual Box GUI를 열고 이름이라는 가상 머신의 설정을
default
열고Shared Folders
섹션을 열고 새 공유 폴더를 추가합니다.- 폴더 경로 :
D:\dev
- 폴더 이름:
d/dev
OK
두 번 누르고 Virtual Box GUI를 닫습니다. - 폴더 경로 :
- 가상 머신 (
docker-machine start
)을 시작합니다 .
그게 다야. 호스트 시스템의 모든 경로는 D:\dev
이제 docker-compose.yml
마운트 에서 작동 합니다.