web-dev-qa-db-ja.com

Dockerは匿名ボリュームを名前付きボリュームに変換します

ボリュームの名前を指定せずにdockerコマンドラインを使用してdockerイメージを試しました。今、私はこのコンテナ/イメージを引き続き使用したいが、Docker Composeでコンテナを定義することで見つけました。

匿名/無名ボリュームからのデータを保持し、それらをdocker composeによって作成された新しいコンテナーで使用するためのベストプラクティスとは何ですか?

  • 名前なしボリュームを名前付きボリュームに変換できますか?
  • または、名前付きボリュームを含むdocker composeを使用して新しいコンテナーを作成し、データをコピーする必要がありますか?
  • または他のオプション?
7
freiheitsnetz

現在、既存のボリュームの名前を変更することはできません。 (これは、以前に名前が付けられていても名前が付けられておらず、名前が自動生成されていても同じです。)

この機能の実装の詳細については この問題 を参照し、「+ 1」/「賛成」を追加して、開発者にそのことを知らせてください。

それがなければ、私の知る限り、新しい名前付きボリュームを作成してデータをコピーするのが唯一の良い方法です。

3
Moshe Katz

これを書いている時点では、唯一のオプションはデータをコピーすることです。詳細は、特定のセットアップによって異なる場合があります。実行されるステップの一般的なリストは次のとおりです。

  1. ソースコンテナーを停止して削除し、手順3で新しいボリュームを作成します。

    docker stop NAME
    docker rm NAME
    # or
    docker-compose stop SERVICE
    docker-compose rm SERVICE
    

    場合によっては、ソースコンテナの削除を延期できることがあります。 docker-compose匿名ボリュームからdocker-compose名前付きボリュームに切り替えるとき。この場合、upは新しいボリュームを作成します。そして、データのコピーを続行できます。ただし、この場合でも、コピー中にデータが変更されないように、コンテナーを停止することをお勧めします。また、docker-composeのソースコンテナーを削除して、新しいボリュームに切り替える必要があります(警告に注意してください)。

    場合によっては、それは本当に必要ではありません。スタンドアロンコンテナーからdocker-composeに切り替える場合。

  2. 該当する場合はdocker-compose.ymlを変更します。

  3. 作成する新しいボリュームの新しいコンテナーを開始します。

    スタンドアロンコンテナ:

    docker run ...
    # or
    docker-compose up -d
    
  4. データが変更されないように、新しいコンテナーを停止します。

    docker stop ...
    # or
    docker-compose stop
    

    に移行する場合など。名前付きボリュームを持つスタンドアロンコンテナーでは、コンテナーの開始/停止の代わりにボリュームを作成できます。

  5. データをコピーします。

    docker run --rm -v "SRC_VOLUME:/from" -v "DST_VOLUME:/to" \
        bash -c '
            shopt -s dotglob
            # rm -r /to/*  # e.g. pg might have populated the new volume
            cp -r /from/* /to
        '
    

    SRC_VOLUME、DST_VOLUME-ボリューム名、ID、またはホスト上のディレクトリへの絶対パス。

    コンテナーに接続されているボリュームを一覧表示するには、次のコマンドを使用します。

    docker inspect CONTAINER --format '{{json .Mounts}}' | jq
    

    ここでCONTAINER-コンテナ名またはID。

  6. 新しいコンテナを起動します。

    docker run ...
    # or
    docker-compose up -d
    
  7. 喜んでください:)

さまざまな設定を試してみたい場合は、次の Gist を確認してください。

1
x-yuri