1. ホーム
  2. docker

[解決済み] Docker ADDとVOLUMEの比較

2022-07-02 21:22:05

質問

Dockerを学んでいるのですが、いつどこで ADDVOLUME . 以下は、これらの両方が行うことだと思います。

追加

ビルド時にファイルをイメージにコピーします。イメージにはすべてのファイルが含まれているので、非常に簡単にデプロイできます。 一方、毎回ビルドする必要があるのは、開発において良いアイデアとは思えません。ビルドするには、開発者がコンテナを再構築するコマンドを実行する必要があり、さらに、コンテナのビルドには時間がかかる可能性があるからです。

ボリューム

を使用することは理解しています。 docker run -v を使用すると、コンテナ内にホスト フォルダをマウントできます。この方法では、ファイルを簡単に変更でき、コンテナ内のアプリが変更に反応するのを見ることができます。開発では素晴らしいことですが、この方法でファイルをデプロイする方法がよくわかりません。

どのように解決するのですか?

追加

この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 ディレクトリのファイルを使うことはできません。 . ボリュームディレクトリにあるものは ビルド時にアクセスできない しかし は実行時にアクセス可能になります。 .

を使いたい場合のいくつかの例です。 VOLUME :

  • コンテナで実行されているアプリがログインします。 /var/log/my_app . これらのログはホストマシン上でアクセスできるようにし、コンテナが削除されても削除されないようにしたいと思います。これを実現するには、マウント ポイントを /var/log/my_app にマウントポイントを作成し、そこに VOLUME /var/log/my_app をDockerfileに追加し、コンテナを実行する際に 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 が存在することを確認します。