[解決済み] Docker ADDとVOLUMEの比較
質問
Dockerを学んでいるのですが、いつどこで
ADD
と
VOLUME
. 以下は、これらの両方が行うことだと思います。
追加
ビルド時にファイルをイメージにコピーします。イメージにはすべてのファイルが含まれているので、非常に簡単にデプロイできます。 一方、毎回ビルドする必要があるのは、開発において良いアイデアとは思えません。ビルドするには、開発者がコンテナを再構築するコマンドを実行する必要があり、さらに、コンテナのビルドには時間がかかる可能性があるからです。
ボリューム
を使用することは理解しています。
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 が存在することを確認します。
関連
-
[解決済み] Dockerイメージを1つのコンテナにまとめる方法はありますか?
-
[解決済み] Dockerfileの'COPY'と'ADD'コマンドの違いは何ですか?
-
[解決済み] Docker Dockerコンテナからホストへのファイルコピー
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み] Dockerコンテナのシェルに入るにはどうしたらいいですか?
-
[解決済み] Dockerでデータベースなどの永続的なストレージを扱う方法
-
[解決済み] Dockerコンテナのランタイムパフォーマンスコストとは何ですか?
-
[解決済み] 既存のDockerコンテナにボリュームを追加するにはどうすればよいですか?
-
[解決済み】Dockerは仮想マシンとどう違うの?
-
[解決済み】Dockerにボリュームを追加しても、サブフォルダを除外してしまう。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】apt-get でインストールしても docker コマンドが見つからない。
-
[解決済み】ドッカーコンテナがすぐに終了してしまう理由
-
[解決済み] System.InvalidOperationException: Failed to deploy distro docker-desktop to C:\UserslenovaAppDataLocal╱distro: exit code: -1
-
[解決済み] docker-compose down default_network エラー
-
[解決済み] docker run --initに相当するdocker-composeは何ですか?
-
[解決済み] Dockerfileの "RUN chmod "が有効でない。
-
[解決済み] DockerでPillowを使用する
-
[解決済み] docker の多段ビルド Go イメージ - x509: 証明書は不明な機関によって署名されました。
-
httpコード中にdocker registry apiのインタラクションを呼び出す コード詳細
-
kubernetesの後に参加した作業ノードが "NotReady "状態である。