web-dev-qa-db-ja.com

コンテンツを上書きするフォルダーへのDockerマウント

Configというフォルダーの下に構成ファイルを持つ.net Core web Apiがあります。イメージとそこからコンテナを作成しましたが、ターミナルを使用すると、コンテナにフォルダと構成ファイルが含まれていることが正しくわかります。

私の問題は、これまでのところ、要件に従って、Configフォルダを物理パスにマウント/バインドする同じコンテナを作成する方法を見つけることができなかったことです:

1)Configフォルダーを特定のホストの場所にマウントします

2)コンテナーの作成時に、Configフォルダーにイメージ内のファイルを入力する必要があります

3)コンテナの作成時に、フォルダ内に既に存在する既存のファイルを画像内のファイルで上書きします

4)ホストからフォルダー内の構成ファイルをカスタマイズできるようにする

私の作成コマンド:

    docker --tls -H="$containerUrl" `
        create `
        --hostname $hostname `
        --name $containerName `
        --mac-address=$containerMacAddress `
        --ip $containerIpAddress `
        --net "bridged-network" `
        --workdir '/app' `
        --mount type=bind,src=$configVolumePath,target=/app/Config `
        --publish "0.0.0.0::80" `
        -t `
        -i $imageName":"$script:buildversion    

ドキュメントで指定されているように、-mountとtypebindを使用して、フォルダ内にファイルがある場合、それらはコンテナ内から隠され、アプリケーションはデプロイされたファイルを見ることになります。 このソリューションの問題は、ホストからconfigフォルダー内のファイルを更新できないことです。

今、type = bindを削除すると同じ結果が得られ、混乱を招きます。

ボリューム-volume $ configVolumePath ":/ app/Config:rw"を使用しようとしましたが、そうするとHostディレクトリ内の既存のファイルはオーバーライドされず、これらはコンテナ内で使用されます。

追加のメモ、Dockerfileまたはボリュームのマウントに関連する構成には何も指定せず、ボリュームを作成してソースとして使用しようとしませんでしたが、違いはないと思います。

コンテナサーバーはNASで実行されており、これはバージョンです:

 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   781516c
 Built:        Thu Aug  3 16:04:05 2017
 OS/Arch:      linux/AMD64

明らかに私は何かが欠けているので、ドッカーについてもっと学ばなければなりません。

私の参照:

1) https://docs.docker.com/engine/admin/volumes/bind-mounts/

2) https://docs.docker.com/engine/admin/volumes/volumes/

10
Norcino

まず、Dockerボリュームまたはバインドマウントは、Linuxマウントのように動作します。

ホストボリューム/マウントが存在し、ファイルが含まれている場合、コンテナ内にあるものはすべて「オーバーライド」されます。そうでない場合、コンテナファイルはホストボリューム/マウントにミラーリングされ、コンテナフォルダとホストは同期します。どちらの場合も、ホスト上のファイルの編集は常にコンテナー内で反映されます。

あなたの場合、次のことができます:

docker volume create --driver local \
    --opt type=none \
    --opt device=$configVolumePath \
    --opt o=bind \
    config_vol

これにより、ホスト上の$ configVolumePathに保持されるボリュームが作成されます。

コンテナを作成するときは、そのボリュームを使用します:

docker create --volume config_vol:/app/Config

起動時に取得されるのは、ホストフォルダーが空になり、イメージのファイルがホストフォルダーに「コピー」されることです。 $configVolumePathの編集ファイルはコンテナ内で反映され、同様にコンテナ/app/Config内で編集されたファイルはホストの$configVolumePathに反映されます。

17
yamenk