5最も一般的なDockerfile間違い
Dockerは素晴らしいです.あなたはそれを否定できない.人気はまだ高まっています、そして、インターネットはあらゆる可能なプログラミング言語、フレームワークと環境の例でいっぱいです.何かを展開するとき、私はDockerfileの例のためにGoogleで検索します.
これはいいですね.残念ながら、オンラインで利用可能なほとんどの例は、デザインによって不安定です.HashNodeの私の最初のポストでは、私は若干の一般的な落とし穴と可能な解決を調査するつもりです.
これはおそらく最も過小評価されている問題です.デフォルトでは、コンテナはrootで実行されます.Ipotethically、コンテナのコントロールを得る場合、それはホストに害を与える可能性があります.
つの簡単で信頼性の高い修正プログラムは、コンテナ内のユーザーを作成し、作業ディレクトリと実行中のユーザーの両方を設定します.
多くの例のベースイメージは最新のタグを使用します.チュートリアルに適していますが、プロダクションのDockerFilesは常に変更されず、ビルドを中断することになっているイメージタグをピンでなければなりません.
最新のタグは、コンテナの新しいバージョンがプッシュされるたびに更新されます.あなたのビルドを突然破ることができます.
Pythonでコンテナを展開しているとします.この時点で最新のPython 3.6を参照してください.数週間後、イメージを再構築する必要がありますが、失敗すると、依存関係が満たされません.なぜ?私は彼らに触れていない!Pythonによると、最近ではPython 3.9を参照しています.
Dockerは242479142 ,
可能な場合は、複数のコマンドを1つのレイヤーにラップします.マルチライン引数をトリガするために
つのコンテナ、1つのサービス.Dockerコンテナは仮想マシンではありません.多くのサービスを展開する場合は、多くのコンテナを作成します.
イメージを構築するとき、Dockerは再利用できるキャッシュのイメージを探します.この方法では、重複したイメージが作成され、連続ビルドが高速です.
しかし、キャッチがあります.依存関係をインストールする前にソースコードをコピーする場合は、コードDockerを更新するたびに、すべての連続した命令を無効にします.言い換えると、同じであっても毎回依存関係をインストールするつもりです.
幸いにも、迅速な修正があります.単に頻繁に変化しない層がそうする層の前にあることを確認してください.
たとえば、ソースコード全体をコピーして
それはそれです!より多くのヒントやトリックDockerFilesを高速化、保守、および安全です.これらは、誰もがASAPを修正する必要があります5最も一般的です.
閉じるこの動画はお気に入りから削除されています.😀
これはいいですね.残念ながら、オンラインで利用可能なほとんどの例は、デザインによって不安定です.HashNodeの私の最初のポストでは、私は若干の一般的な落とし穴と可能な解決を調査するつもりです.
rootとして走る
これはおそらく最も過小評価されている問題です.デフォルトでは、コンテナはrootで実行されます.Ipotethically、コンテナのコントロールを得る場合、それはホストに害を与える可能性があります.
つの簡単で信頼性の高い修正プログラムは、コンテナ内のユーザーを作成し、作業ディレクトリと実行中のユーザーの両方を設定します.
FROM nginx:latest
RUN useradd --create-home dockeruser
WORKDIR /home/dockeruser
USER dockeruser
最新の使用
多くの例のベースイメージは最新のタグを使用します.チュートリアルに適していますが、プロダクションのDockerFilesは常に変更されず、ビルドを中断することになっているイメージタグをピンでなければなりません.
最新のタグは、コンテナの新しいバージョンがプッシュされるたびに更新されます.あなたのビルドを突然破ることができます.
Pythonでコンテナを展開しているとします.この時点で最新のPython 3.6を参照してください.数週間後、イメージを再構築する必要がありますが、失敗すると、依存関係が満たされません.なぜ?私は彼らに触れていない!Pythonによると、最近ではPython 3.9を参照しています.
層の数を最小にする
Dockerは242479142 ,
RUN
, COPY
命令に対してレイヤを作成します.より多くの層は、容器を遅くします.可能な場合は、複数のコマンドを1つのレイヤーにラップします.マルチライン引数をトリガするために
FROM nginx:latest
RUN apt update && apt install -y \
git \
rsync \
&& rm -rf /var/lib/apt/lists/*
巨大コンテナを作成しない
つのコンテナ、1つのサービス.Dockerコンテナは仮想マシンではありません.多くのサービスを展開する場合は、多くのコンテナを作成します.
レイヤのキャッシュを使用する
イメージを構築するとき、Dockerは再利用できるキャッシュのイメージを探します.この方法では、重複したイメージが作成され、連続ビルドが高速です.
しかし、キャッチがあります.依存関係をインストールする前にソースコードをコピーする場合は、コードDockerを更新するたびに、すべての連続した命令を無効にします.言い換えると、同じであっても毎回依存関係をインストールするつもりです.
幸いにも、迅速な修正があります.単に頻繁に変化しない層がそうする層の前にあることを確認してください.
たとえば、ソースコード全体をコピーして
ADD
を実行する代わりに、\
をコピーしてnpm install
を実行し、残りのコードをコピーします.この方法では、ソースへのすべての変更はpackage.json
ではなくキャッシュをトリガしません.それはそれです!より多くのヒントやトリックDockerFilesを高速化、保守、および安全です.これらは、誰もがASAPを修正する必要があります5最も一般的です.
閉じるこの動画はお気に入りから削除されています.😀
Reference
この問題について(5最も一般的なDockerfile間違い), 我々は、より多くの情報をここで見つけました https://dev.to/francescotonini/5-most-common-dockerfile-mistakes-1ja8テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol