ボリュームをホストディレクトリへのリンクとしてマウントするのは好きではないので、Dockerコンテナーを完全にDockerで管理されたコンテナーにアップグレードするパターンを思いつきました。で新しいdockerコンテナーを作成する--volumes-from <container>
と、更新されたイメージを含む新しいコンテナーにdocker管理ボリュームの所有権が共有されます。
docker pull mysql
docker create --volumes-from my_mysql_container [...] --name my_mysql_container_tmp mysql
my_mysql_container
元のコンテナをすぐに削除しないことにより、アップグレードされたコンテナに適切なデータがない場合、または正常性テストに失敗した場合に、既知の正常なコンテナに戻すことができます。
この時点で、私は通常、何か問題が発生した場合に備えて自分自身にセーフティネットを提供するために、コンテナ用のバックアップスクリプトを実行します。
docker stop my_mysql_container
docker start my_mysql_container_tmp
これで、新しいコンテナーにあると予想されるデータが存在することを確認し、健全性チェックを実行する機会が得られました。
docker rm my_mysql_container
docker rename my_mysql_container_tmp my_mysql_container
コンテナーがそれらを使用している限り、Dockerボリュームは残りますので、元のコンテナーを安全に削除できます。元のコンテナが削除されると、新しいコンテナは元のコンテナの名前を引き継ぎ、すべてを開始時と同じようにきれいにできます。
このパターンを使用してDockerコンテナーをアップグレードすることには、2つの大きな利点があります。まず、ボリュームをアップグレードされたコンテナに直接転送できるようにすることで、ボリュームをホストディレクトリにマウントする必要がなくなります。第2に、Dockerコンテナーが機能していない位置にいることはありません。そのため、アップグレードが失敗した場合は、元のDockerコンテナーを再度スピンアップすることで、以前の状態に簡単に戻すことができます。