ADD
私は Docker を学習中ですが、と をいつどこで使用するべきか疑問に思っていますVOLUME
。これら 2 つの機能は、次のようになっていると思います。
追加
ビルド時にファイルをイメージにコピーします。イメージにはすべてのファイルが含まれているため、簡単にデプロイできます。一方、毎回ビルドする必要があるのは、開発においては良いアイデアとは思えません。ビルドには、開発者がコマンドを実行してコンテナを再構築する必要があり、さらにコンテナのビルドには時間がかかる可能性があるからです。
音量
コンテナー内にホスト フォルダーをマウントして、ファイルを簡単に変更し、コンテナー内のアプリが変更に反応するのを確認できると理解しています。docker run -v
開発中は素晴らしいように見えますが、この方法でファイルをデプロイする方法がわかりません。
ベストアンサー1
追加
これら2つの基本的な違いは、ADD
追加するものがフォルダであろうとファイルであろうと、実際にはあなたのイメージの一部. その後、あなたがビルドしたイメージを使用する人は誰でも、あなたが作成したものすべてにアクセスできますADD
。これは、後でイメージを削除した場合でも当てはまります。Docker はレイヤーで動作し、レイヤーADD
はイメージの一部として存在し続けるためです。明確に言うと、ビルド時にのみ何かを行うことができ、実行時にADD
行うことはできません。ADD
使用したいケースの例をいくつか挙げますADD
:
- requirements.txtファイルにいくつかの要件があり、それを参照してDockerfileにインストールしたいとします。その後、次
ADD ./requirements.txt /requirements.txt
のようにします。RUN pip install -r /requirements.txt
アプリ コードを Dockerfile 内のコンテキストとして使用したい場合、たとえば、アプリ ディレクトリをイメージ内の作業ディレクトリとして設定し、イメージから実行されるコンテナー内のデフォルト コマンドで実際にアプリを実行する場合は、次のようにします。
ADD ./ /usr/local/git/my_app
WORKDIR /usr/local/git/my_app
CMD python ./main.py
音量
一方、ボリュームは、イメージから実行されるコンテナが、コンテナが実行されているローカルマシン上のパスにアクセスできるようにするだけです。VOLUME
Dockerfile 内のディレクトリのファイルを使用できませんボリュームディレクトリ内のものはビルド時にアクセスできないしかし実行時にアクセス可能。
使用したいケースの例をいくつか挙げますVOLUME
:
- コンテナ内で実行されているアプリは にログを記録します
/var/log/my_app
。これらのログがホストマシン上でアクセス可能であり、コンテナが削除されたときに削除されないようにする必要があります。これを行うには、 をDockerfile に/var/log/my_app
追加してにマウントポイントを作成しVOLUME /var/log/my_app
、コンテナを次のように実行します。docker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tag
- コンテナ内のアプリがアクセスできるようにしたいローカル設定ファイルがいくつかあります。おそらく、それらの設定ファイルはローカルマシン、開発環境、本番環境で異なります。特にそれらの設定ファイルが秘密である場合は、絶対にあなたのイメージには入れたくないその場合の良い戦略は、
VOLUME /etc/settings/my_app_settings
Dockerfile に を追加し、 を使用してコンテナを実行しdocker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tag
、アプリが実行される予定のすべての環境に /host/settings/dir が存在することを確認することです。