web-dev-qa-db-ja.com

Windowsボリューム上のdocker-composeが機能しない

私はこの1週間Dockerで遊んでおり、コンテナのアイデアは非常に便利だと思いますが、過去3日間にできることをすべて読んだにもかかわらず、ボリュームマッピングを機能させることができません

get docker-compose to use my existing volume.

    Docker Version: 18.03.1-ce
    docker-compose version 1.21.1, build 7641a569

I created a volume using the following via a Dockerfile

    # Reference SQL image
    FROM Microsoft/mssql-server-windows-developer

    # Create directory within SQL container for database files mapped to the    volume
    VOLUME sqldata:c:/MSSQL

and here it shows:
    C:\ProgramData\Docker\volumes>docker volume ls
    local               sqldata

Now I've tried probably 60+ different "solutions" based on StackOverflow and Docker forums, but none of them work. (Note despite the names below with Azure I am simply trying to get this to run locally, Azure is next hurdle)

    Docker-compose.yaml:

    version: '3.4'
    services:
      ws:
        image: wsManager
        container_name: Azure-wcf
        ports:
           - "80"
        depends_on:
            - db

      db:
        image: dbimage:latest
        container_name: Azure-db
        volumes:
             - \sqldata:/mssql
#            - type: volume
#              source: sqldata
#              target: /mssql
        ports:
            - "1433"

I've added a volumes section but it does not help, 

    volumes:
        sqldata:
            external:
                name: sqldata

    changed the - \sqldata:/mssql
    to every possible slash .. . ~ whatever.  Moved the file to yaml file 

c:\ ProgramData\Docker\volumes-基本的に私の検索結果に表示された提案。 dbImageは、データを永続化するために必要なSQL Serverイメージですが、私が試したことがないので何が魔法なのか疑問に思っています。どんな助けも大歓迎です。

Windows 10 Proビルド1803で実行しています。

なぜこれがそんなに難しくなければならないのですか?これを実際に機能させる方法を知っている人なら誰よりも。

6
Maui_Ed

解決策は、以下のようにvolumes:オプションを使用して、Windows上のトゥルーパスを参照することです。

sqldb:
    image: sqlimage 
    container_name: Azure-db
    volumes:
      - "C:\\ProgramData\\Docker\\volumes\\sqldata:c:\\mssql"

データを永続化するために、次を使用しました。

environment:
   - "sa_password=ddsql2017@@"
   - "ACCEPT_EULA=Y"
   - 'attach_dbs= {"dbName":"MyDb","dbFiles":"C:\\MSSQL\\MyDb.mdf","C:\\MSSQL\\MyDb.ldf"]}]'

SOと他の場所で検索した例の多くが私には役に立たず、Dockerフォーラムにはボリュームのマウントが役に立たないという多くの投稿があります。ウィンドウズ。

7
Maui_Ed

Windowsマシンの特定のパスにボリュームをマウントしようとすると、同様の問題に苦労していました。基本的には機能しなかったため、Dockerインスタンスを再起動するたびにすべてのDBデータが失われます。 Docker for WindowsがデフォルトでWindowsパスを解釈できないため、フラグCOMPOSE_CONVERT_WINDOWS_PATHSをアクティブにする必要があるためだとわかりました。そうするには:

  • コマンド「set COMPOSE_CONVERT_WINDOWS_PATHS = 1」を実行します
  • Dockerを再起動します
  • [設定]> [共有ドライブ]> [資格情報のリセット]に移動し、ドライブを選択して適用します
  • コマンドラインから、コンテナを強制終了します(docker container rm -f)
  • コンテナを再実行します

それが役に立てば幸い

2
flavio

Windowsアカウントの資格情報が変更された場合は、共有ドライブの資格情報もリセットする必要があります。 ([設定]> [共有ドライブ]> [資格情報のリセット])

私の場合、パスワードは会社のセキュリティポリシーによって変更されました。

2
kimreik

Ubunto WSLを使用している場合:

  • Sudo mkdir /c
  • Sudo mount --bind /mnt/c /c
  • 新しいパスを使用してプロジェクトファイルに移動します(/ mnt/c/your-project-pathではなく/ c/your-project-path)
  • docker-compose.ymlを編集し、ボリュームの相対パスを使用します(c/your-project-path/srcの代わりに./srcのように)
  • docker-compose up
0
aPa

Windowsには資格情報とDockerが使用している仮想マシン(Hyper-V、VirtualBox-Dockerのバージョンと設定に依存)に制限があるため、Windows上のDockerには奇妙な動作があります。

基本的に、フォルダをマップするのは正しいです

ボリューム:

サービスのセクション:

パスは

version: '3.4'
services:
  db:
    image: dbimage:latest
    container_name: Azure-db
    volumes:
         - c:/Temp/sqldata:/mssql

ボリュームセクションでボリュームを明示的に作成する必要はありませんが、docker-compose upで作成することが重要です(docker runでも同じです)。

奇妙なことは、それが決して現れないということです

dockerボリュームls

しかし、Windowsディレクトリ内とコンテナパス/ mssql内の同じファイルで使用できます

以下でテストできます:

docker run --rm -v c:/Temp/sqldata:/data Alpine ls /data

または

docker run --rm -v c:/Temp:/data Alpine ls /data

消える場合は、おそらく資格情報を失い、Docker->設定->共有ドライブ->資格情報のリセットでリセットします。

それが明確であり、あなたのためにすべての側面をカバーしたことを願っています。

0
zhrist

デフォルトでは、WindowsにDockerをインストールした後、ドライバーの共有が無効になっているように見えます-そのため、(ディスクに保存されている)ボリュームを使用することはできません

このような共有を有効にする:Docker in tray - right click - Settings、私を助けて、ボリュームが正常に動作し始めました。 enter image description here

0
Alex Efimov