webdevqa.jp.net

Windowsでのdocker composeを使用したボリュームバインディング

最近、Windows 10でDocker Toolboxをアップグレードしましたが、ボリュームマウントが機能しなくなりました。私はすべてを試しました。現在のマウントパスは次のとおりです。

volumes:
  - C:\Users\Joey\Desktop\backend:/var/www/html

無効なバインドマウントエラーが表示されます。

12
9997

C:\Users dir内にある絶対パスを使用しているようですが、Docker-Toolboxを使用している場合は、これも機能しません。下記を参照してください。

概観

./相対パスをvolumesセクションに転送すると、docker-composeによってdocker-compose.ymlファイルを含むディレクトリに自動的に解決されます(たとえば、プロジェクトが%UserProfile%/my-projectにある場合、./:/var/www/html/c/Users/my-name/my-project:/var/www/htmlを取得します)。

問題は、現在(DockerToolbox-19.03.1を使用して)/c/Usersディレクトリのみが仮想マシンと共有されることです(ツールボックスはVMにdocker自体を配置します。つまり、マウントされた共有ディレクトリを除いて、ファイルシステムにアクセスできません。 )。

結論

したがって、基本的にプロジェクトをそこに配置する(C:\Users\YOUR_USER_NAME)と、./が機能するはずです。しかしそれでもうまくいかなかった私にとっては、以下の_prepare.shスクリプトで終わりました:

#!/bin/bash

VBoxManage='/c/Program Files/Oracle/VirtualBox/VBoxManage'

# Defines variables for later use.
ROOT=$(dirname $0)
ROOT=$(cd "$ROOT"; pwd)
MACHINE=default
PROJECT_KEY=shared-${ROOT##*/}

# Prepares machine (without calling "docker-machine stop" command).
#
if [ $(docker-machine status $MACHINE 2> /dev/null) = 'Running' ]; then
    echo Unmounting volume: $ROOT
    docker-compose down
    docker-machine ssh $MACHINE <<< '
        Sudo umount "'$ROOT'";
    '
    "$VBoxManage" sharedfolder remove $MACHINE --name "$PROJECT_KEY" -transient > /dev/null 2>&1
else
    docker-machine start $MACHINE
fi
eval $(docker-machine env $MACHINE)

set -euxo pipefail
"$VBoxManage" sharedfolder add $MACHINE --name "$PROJECT_KEY" --hostpath "$ROOT" -automount -transient


docker-machine ssh $MACHINE <<< '
    echo Mounting volume: '$ROOT';
    Sudo mkdir -p "'$ROOT'";
    Sudo mount -t vboxsf -o uid=1000,gid=50 "'$PROJECT_KEY'" "'$ROOT'";
'

docker-compose up -d
docker-machine ssh $MACHINE
bash

使用法:

  • そのコピーを各プロジェクトのdocker-compose.ymlファイルの横に配置します。
  • システムの電源がオンになるたびに実行します(単にそれまたはそのショートカットをダブルクリックします)。
  • できた!プロジェクトが別のドライブ(遠く、C:\Users dirの外)にある場合でも、相対パスが機能するようになりました。

注:

  • 少し編集すれば、docker-composeがなくても機能するはずです。
  • docker system Pruneを実行してディスク領域を解放することを検討してください(または、上記のスクリプトのmountコマンドの直後の新しい行でdocker system Prune --forceを追加します)。
1
Top-Master

同じ問題に直面しました(Docker Desktopを使用しています)。

私の手順は:

1)フォルダをドライブ「C」の下に配置します

2)Dockerデスクトップの「設定」を開きます->「共有ドライブ」->「資格情報のリセット」->ドライブ「C」を選択->「適用」

3)ターミナルを開いて実行します(Docker Desktopによって提案されています)。
docker run --rm -v c:/Users:/data Alpine ls /data

4)docker-compose.ymlを開き、-volumesのパスを更新します。

volumes:
  - /data/YOUR_USERNAME/projects/my_project/jssecacerts:/usr/lib/jvm/Java-1.8-openjdk/jre/lib/security/jssecacerts/

5)Dockerコンテナーを再起動します

1
Leonid Dashko

これはサービスセクションですか?ボリュームセクションで必要になるため、削除した場合は削除してください。

0
zhrist