web-dev-qa-db-ja.com

Dockerマシンにローカルボリュームをマウントする方法

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:no such file or directory

ローカルボリュームはリモートマシンにマウントされません。 webappsのコードでローカルボリュームをマウントするための推奨戦略は何ですか?

78
jdcaballerov

また、この問題に遭遇し、docker-machineを使用するとローカルボリュームがマウントされていないようです。ハックソリューションは

  1. docker-machineインスタンスの現在の作業ディレクトリを取得しますdocker-machine ssh <name> pwd

  2. 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になります

注意:リモートシステムのパスワードを入力する必要があります。 sshを使用してリモートシステムにすばやく作成し、パスワードを作成できます。

  1. docker-compose.ymlファイルのボリュームマウントポイントを.:/appから/root/<name_of_folder>:/appに変更します

  2. docker-compose up -dを実行します

注:ローカルで変更が行われた場合、rsyncを再実行して変更をリモートシステムにプッシュすることを忘れないでください。

完全ではありませんが、機能します。問題は進行中です https://github.com/docker/machine/issues/179

これを解決しようとする他のプロジェクトには、 docker-rsync が含まれます

26
gbozee

Docker-machineはユーザーディレクトリを自動マウントします...しかし、時にはそれだけでは十分ではありません。

Docker 1.6については知りませんが、1.8では、docker-machineに追加のマウントを追加できますできます

仮想マシンのマウントポイントの追加(パート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:(マシンを停止する必要はありません)

  1. 「Oracle VM VirtualBox Manager」を起動します
  2. <machine name>を右クリック(デフォルト)
  3. 設定...
  4. 共有フォルダー
  5. 右側のFolder +アイコン(共有の追加)
  6. フォルダーパス:<Host dir>(e :)
  7. フォルダー名:<mount name>(e)
  8. 「自動マウント」と「永続的にする」をチェックします(必要な場合のみ読み取ります)(自動マウントは現在無意味です...)

Boot2dockerでのマウント(パート2)

boot2dockerで手動でマウント

  1. ログイン、「Oracle VM VirtualBox Manager」の「Show」、またはIPアドレスdocker-machine ip defaultなどでdockerにssh/PuTTYを使用するなど、さまざまな方法があります。
  2. Sudo mkdir -p <local_dir>
  3. Sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>

しかし、これはマシンを再起動してからマウントが失われるまで有効です...

boot2dockerへの自動マウントの追加

マシンにログイン中

  1. 編集/作成(ルートとして)/mnt/sda1/var/lib/boot2docker/bootlocal.sh、sda1は異なる場合があります...
  2. 追加する

    mkdir -p <local_dir>
    mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
    

これらの変更により、新しいマウントポイントが必要になります。これは、ブート時に呼び出され、永続的であることがわかっている数少ないファイルの1つです。より良い解決策が見つかるまで、これは機能するはずです。


古い方法:推奨しない、ただし代替として残しました

  • 編集(ルートとして)/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>
    

最後の手段として、もう少し面倒な代替手段を取ることができ、ブートイメージを変更するだけです。

  • 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を編集
  • 最後にfiの直前にtry_mount_share <local_dir> <mount_name>行を追加します。例えば

    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

91
Andy

現時点では、マシンにボリュームをマウントする方法が実際にはわかりません。そのため、今のところ、必要なファイルを何らかの方法でマシンにコピーまたは同期する方法です。

Docker-machineのgithubリポジトリでこの問題を解決する方法について 会話 があります。誰かが プルリクエスト 実装 scp をdocker-machineで作成し、すでに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

更新:さらに見ると、この機能は latest binaries で既に利用可能であることがわかりました。それらを取得すると、次のようなコマンドを実行してローカルプロジェクトをコピーできます。

docker-machine scp -r . dev:/home/docker/project

これが一般的な形式であること:

docker-machine scp [machine:][path] [machine:][path]

そのため、マシン間、マシン間でファイルをコピーできます。

乾杯!1

14
claudevandort

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

http://linuxcommand.org/man_pages/rsync1.html

4
dmh

2017年10月以降、この操作を行うdocker-machineの新しいコマンドがありますが、実行する前にディレクトリに何もないことを確認してください。

docker-machine mount <machine-name>:<guest-path> <Host-path>

詳細については、ドキュメントを確認してください: https://docs.docker.com/machine/reference/mount/

変更を伴うPR: https://github.com/docker/machine/pull/4018

3
Jorge

最後に、Windows Docker Toolboxをv1.12.5にアップグレードし、Oracle VM VirtualBox managerに共有フォルダーを追加してパス変換を無効にすることで、ボリュームを機能させる方法を見つけました。 Windows 10以降をお持ちの場合は、新しいDocker for Windowsを使用することをお勧めします。

最初のアップグレードの痛み:

  1. 最初にVirtualBoxをアンインストールします。
    • Android Studioのような他のツールでは問題が発生する可能性があります。ありがとうDocker :(
  2. Docker Toolboxの新しいバージョンをインストールします。

Redisデータベースの例:redis: image: redis:Alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"

Dockerクイックスタートターミナルで....

  1. docker-machine stop defaultを実行します-VMが確実に格納されるようにします

Oracle VM VirtualBox Managerで...

  1. またはコマンドライン経由でdefault VMに共有フォルダーを追加しました
    • D:\Projects\MyProject\db => /var/db

docker-compose.yml...で.

  1. マップされたredisボリューム:"/var/db/redis:/data:rw"

Dockerクイックスタートターミナルで....

  1. COMPOSE_CONVERT_WINDOWS_PATHS=0を設定(ツールボックスバージョン> = 1.9.0の場合)
  2. docker-machine start defaultを実行してVMを再起動します。
  3. cd D:\Projects\MyProject\
  4. docker-compose upが動作するはずです。

D:\Projects\MyProject\db\redis\dump.rdbにredisデータベースを作成します

なぜ相対ホストパスを避けるのですか?

IWindows Toolboxの相対的なホストパスは、無効な '\'文字を導入する可能性があるため回避しました。 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

これは2つの理由で壊れます。

  1. D:ドライブにアクセスできません
  2. ボリュームパスに\文字を含めることはできません
    • docker-composeはそれらを追加し、それをあなたのせいにします!!
    • COMPOSE_CONVERT_WINDOWS_PATHS=0を使用して、このナンセンスを停止します。

VirtualBoxを再度アンインストールして共有フォルダーをリセットする必要がある場合があるため、追加のVM共有フォルダーマッピングをdocker-compose.ymlファイルに文書化することをお勧めします。

1
Tony O'Hagan

Windows 10で18.03.1-ce-win65(17513)を使用していることに触れただけで、以前にドライブを共有して資格情報をキャッシュしていた場合、パスワードを変更するとドッカーがコンテナー内にブランクとしてマウントされたボリューム。

実際に何が起こっているのかは、古いキャッシュされた資格情報で共有にアクセスできなくなっていることを示すものではありません。このシナリオの解決策は、UI([設定]-> [共有ドライブ])を使用して資格情報をリセットするか、ドライブの共有を無効にしてから新しいパスワードを入力することです。

これらの状況でdocker-composeがエラーを出した場合に役立ちます。

0
nrjohnstone

run_web.shファイルはdocker-compose.ymlファイルと同じディレクトリにあると仮定します。その場合、コマンドはcommand: /app/run_web.shになります。

Dockerfile(開示していない)がrun_web.shファイルをDockerイメージに入れることを処理しない限り。

0
Thomasleveil

ここに投稿を要約した後、Virtualboxの再起動時に追加のホストマウントポイントと自動マウントを作成するための更新されたスクリプトを添付しました。作業環境の概要は次のとおりです。-Windows 7-docker-machine.exeバージョン0.7.0-VirtualBox 5.0.22

    #!env bash

    : ${NAME:=default}
    : ${SHARE:=c/Proj}
    : ${MOUNT:=/c/Proj}
    : ${VBOXMGR:=C:\Program Files\Oracle\VirtualBox\VBoxManage.exe}
    SCRIPT=/mnt/sda1/var/lib/boot2docker/bootlocal.sh

    ## set -x
    docker-machine stop $NAME
    "$VBOXMGR" sharedfolder add $NAME --name c/Proj --hostpath 'c:\' --automount 2>/dev/null || :
    docker-machine start $NAME
    docker-machine env $NAME

    docker-machine ssh $NAME 'echo "mkdir -p $MOUNT" | Sudo tee $SCRIPT'
    docker-machine ssh $NAME 'echo "Sudo mount -t vboxsf -o rw,user $SHARE $MOUNT" |  Sudo tee -a $SCRIPT'
    docker-machine ssh $NAME 'Sudo chmod +x /mnt/sda1/var/lib/boot2docker/bootlocal.sh'
    docker-machine ssh $NAME 'Sudo /mnt/sda1/var/lib/boot2docker/bootlocal.sh'
    #docker-machine ssh $NAME 'ls $MOUNT'
0
Jesse

ローカルマシンのvirtualboxドライブでdocker-machine 0.12.2を使用しています。ローカルファイルにアクセスできるディレクトリ/hosthome/$(user name)があることがわかりました。

0

他のすべての回答は当時は良かったが、現在(Docker Toolbox v18.09.3)はすべてそのまま使用できます。 VirtualBox VMに共有フォルダーを追加するだけです。

Docker Toolboxは自動的にC:\Usersを共有フォルダー/c/Usersとして仮想Linuxマシンの下に追加します(Virtual Box共有フォルダー機能を使用)。したがって、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を配置した場合。

ただし、これは簡単に修正できます。

  1. 仮想マシンを停止します(docker-machine stop)。
  2. Virtual Box GUIを開き、defaultという名前の仮想マシンの設定を開き、Shared Foldersセクションを開いて、新しい共有フォルダーを追加します。

    • フォルダーパス:D:\dev
    • フォルダー名:d/dev

    OKを2回押して、Virtual Box GUIを閉じます。

  3. 仮想マシンを起動します(docker-machine start)。

それで全部です。 D:\devの下のホストマシンのすべてのパスは、docker-compose.ymlマウントで動作するはずです。

0