DockerFileビルドプロセス分析

DockerFileビルドプロセス分析

1. 概要

Dockerfile は、Docker イメージを構築するために使用されるテキスト ファイルです。イメージを構築するために必要な命令とパラメータで構成されるスクリプトです。

Docker の一般的なコマンドでは、イメージをビルドする 2 つの方法 (export\import と commit) がすでにわかっています。どちらの方法も、最初にコンテナを実行して作成し、次にコンテナに vim や ifconfig などのコマンドをインストールし、イメージの拡張バージョンを再構築する必要があり、より面倒です。 Dockerfile はファイルを書き込むことによってイメージを直接構築し、ファイルにインストールする必要があるコマンドを記述するだけで済みます。

公式サイト: Dockerfile リファレンス | Docker ドキュメント

2. 構築手順

  • Dockerfile のエンコード
  • Dockerビルドコマンドはイメージをビルドします
  • docker runはイメージに基づいてコンテナインスタンスを実行します

3. 解析プロセスを構築する

(1)Dockerfileの内容に関する基礎知識

  • 各予約語ディレクティブは大文字で記述する必要があり、その後に少なくとも 1 つのパラメータが続く必要があります。
  • 命令は上から下へ順番に実行されます。
  • # はコメントを示します。
  • 各命令は新しいイメージ レイヤーを作成し、イメージをコミットします。

(2)DockerがDockerfileを実行する一般的なプロセス

  • (1)Dockerはベースイメージからコンテナを実行する
  • (2)命令を実行しコンテナを変更する
  • (3)docker commitと同様の操作を実行して新しいイメージレイヤーを送信する
  • (4)Dockerは送信されたイメージに基づいて新しいコンテナを実行します。
  • (5)すべての命令が実行されるまで、dockerfile内の次の命令を実行する

4. 共通コマンドの詳細な説明

(1) まず、tomcat8のDockerfileファイルの内容を見てみましょう。

 # 继承至eclipse-temurin:8-jdk-focal FROM eclipse-temurin:8-jdk-focal # 设置环境变量ENV CATALINA_HOME /usr/local/tomcat ENV PATH $CATALINA_HOME/bin:$PATH RUN mkdir -p "$CATALINA_HOME" # 设置工作目录WORKDIR $CATALINA_HOME # let "Tomcat Native" live somewhere isolated ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR # see https://www.apache.org/dist/tomcat/tomcat-8/KEYS # see also "versions.sh" (https://github.com/docker-library/tomcat/blob/master/versions.sh) ENV GPG_KEYS 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 5C3C5F3E314C866292F359A8F3AD5C94A67F707E 765908099ACF92702C7D949BFA0C35EA8AA299F1 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23 ENV TOMCAT_MAJOR 8 ENV TOMCAT_VERSION 8.5.84 ENV TOMCAT_SHA512 e595e906d62ff16545318108478aa101103181569dc6f4549dd0cdf8744147f7e9ba8a88cab6d33237b22981acb1085de86e7b2a4f1659efdbd4804df1303561 # 执行相关指令RUN set -eux; \ \ savedAptMark="$(apt-mark showmanual)"; \ apt-get update; \ apt-get install -y --no-install-recommends \ ca-certificates \ curl \ dirmngr \ gnupg \ ; \ \ ddist() { \ local f="$1"; shift; \ local distFile="$1"; shift; \ local mvnFile="${1:-}"; \ local success=; \ local distUrl=; \ for distUrl in \ # https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394 "https://www.apache.org/dyn/closer.cgi?action=download&filename=$distFile" \ # if the version is outdated (or we're grabbing the .asc file), we might have to pull from the dist/archive :/ "https://downloads.apache.org/$distFile" \ "https://www-us.apache.org/dist/$distFile" \ "https://www.apache.org/dist/$distFile" \ "https://archive.apache.org/dist/$distFile" \ # if all else fails, let's try Maven (https://www.mail-archive.com/[email protected]/msg134940.html; https://mvnrepository.com/artifact/org.apache.tomcat/tomcat; https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/) ${mvnFile:+"https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/$mvnFile"} \ ; do \ if curl -fL -o "$f" "$distUrl" && [ -s "$f" ]; then \ success=1; \ break; \ fi; \ done; \ [ -n "$success" ]; \ }; \ \ ddist 'tomcat.tar.gz' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz" "$TOMCAT_VERSION/tomcat-$TOMCAT_VERSION.tar.gz"; \ echo "$TOMCAT_SHA512 *tomcat.tar.gz" | sha512sum --strict --check -; \ ddist 'tomcat.tar.gz.asc' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc" "$TOMCAT_VERSION/tomcat-$TOMCAT_VERSION.tar.gz.asc"; \ export GNUPGHOME="$(mktemp -d)"; \ for key in $GPG_KEYS; do \ gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \ done; \ gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz; \ tar -xf tomcat.tar.gz --strip-components=1; \ rm bin/*.bat; \ rm tomcat.tar.gz*; \ command -v gpgconf && gpgconf --kill all || :; \ rm -rf "$GNUPGHOME"; \ \ # https://tomcat.apache.org/tomcat-9.0-doc/security-howto.html#Default_web_applications mv webapps webapps.dist; \ mkdir webapps; \ # we don't delete them completely because they're frankly a pain to get back for users who do want them, and they're generally tiny (~7MB) \ nativeBuildDir="$(mktemp -d)"; \ tar -xf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1; \ apt-get install -y --no-install-recommends \ dpkg-dev \ gcc \ libapr1-dev \ libssl-dev \ make \ ; \ ( \ export CATALINA_HOME="$PWD"; \ cd "$nativeBuildDir/native"; \ gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \ aprConfig="$(command -v apr-1-config)"; \ ./configure \ --build="$gnuArch" \ --libdir="$TOMCAT_NATIVE_LIBDIR" \ --prefix="$CATALINA_HOME" \ --with-apr="$aprConfig" \ --with-java-home="$JAVA_HOME" \ --with-ssl \ ; \ nproc="$(nproc)"; \ make -j "$nproc"; \ make install; \ ); \ rm -rf "$nativeBuildDir"; \ rm bin/tomcat-native.tar.gz; \ \ # reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies apt-mark auto '.*' > /dev/null; \ [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \ find "$TOMCAT_NATIVE_LIBDIR" -type f -executable -exec ldd '{}' ';' \ | awk '/=>/ { print $(NF-1) }' \ | xargs -rt readlink -e \ | sort -u \ | xargs -rt dpkg-query --search \ | cut -d: -f1 \ | sort -u \ | tee "$TOMCAT_NATIVE_LIBDIR/.dependencies.txt" \ | xargs -r apt-mark manual \ ; \ \ apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ rm -rf /var/lib/apt/lists/*; \ \ # sh removes env vars it doesn't support (ones with periods) # https://github.com/docker-library/tomcat/issues/77 find ./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +; \ \ # fix permissions (especially for running as non-root) # https://github.com/docker-library/tomcat/issues/35 chmod -R +rX .; \ chmod 777 logs temp work; \ \ # smoke test catalina.sh version # verify Tomcat Native is working properly RUN set -eux; \ nativeLines="$(catalina.sh configtest 2>&1)"; \ nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')"; \ nativeLines="$(echo "$nativeLines" | sort -u)"; \ if ! echo "$nativeLines" | grep -E 'INFO: Loaded( APR based)? Apache Tomcat Native library' >&2; then \ echo >&2 "$nativeLines"; \ exit 1; \ fi # 暴露端口EXPOSE 8080 # 执行命令就是执行catalina.sh 启动tomcat CMD ["catalina.sh", "run"]

(2)共通指示事項の説明

命令

例示する

から

ベースイメージ、新しいイメージはどのイメージに基づいていますか?既存の画像をテンプレートとして指定します。最初の項目はFROMである必要があります

メンテナー

イメージ管理者の名前とメールアドレス

走る

コンテナを構築するときに実行する必要があるコマンド。 shell format および exec format コマンドを実行します。 RUNはdockerビルド中に実行されます

さらす

現在のコンテナによって公開されているポート

ワークディレクトリ

コンテナを作成した後、ターミナルがログインするデフォルトの作業ディレクトリを指定します。

ユーザー

イメージを実行するユーザーを指定します。指定しない場合は、デフォルトは root になります。

環境

イメージ構築中に環境変数を設定するために使用します

追加

ホストディレクトリ内のファイルをイメージにコピーし、URLを自動的に処理してtarballを解凍します。

コピー

ADD と同様に、ファイルとディレクトリをイメージにコピーします。
ビルド コンテキスト ディレクトリ内の <ソース パス> から新しいレイヤーのイメージ内の <宛先パス> の場所にファイル/ディレクトリをコピーします。

2つの方法 1: COPY src dest 2: COPY ["src", "dest"]

src: ホストファイルまたはディレクトリ

desc: コンテナ内のディレクトリ

音量

データの保存と永続化に使用されるコンテナデータボリューム

CMDF

Dockerfile には複数の CMD 命令を含めることができますが、最後の命令のみが有効になります。 CMDはdocker実行後にパラメータに置き換えられます

docker を実行すると CMD が実行されます。

エントリーポイント

CMD 命令と似ていますが、docker run 後のコマンドによって ENTRYPOINT は上書きされません。
そして、これらのコマンドラインパラメータは、ENTRYPOINT命令で指定されたプログラムにパラメータとして送信されます。

コマンド形式: ENTRYPOINT は CMD と一緒に使用できます。通常、CMD はパラメータを変更する場合にのみ使用されます。ここで、CMD は ENTRYPOINT にパラメータを渡すことに相当します。 ENTRYPOINT を指定すると、CMD の意味が変わります。コマンドを直接実行する代わりに、CMD の内容が ENTRYPOINT 命令にパラメータとして渡されます。

これら 2 つを組み合わせると、次のようになります。

nginx:test イメージが Dockerfile を通じてビルドされていると仮定します。パラメータを渡すかどうか? Dockerfileに従って記述して実行します。パラメータを渡して Docker コマンドを実行します。 docker run nginx:testdocker run nginx:test -c /etc/nginx/new.conf実際のコマンドはnginx -cから派生した
/etc/nginx/nginx.confnginx -c /etc/nginx/new.conf

利点: docker run を実行するときに、ENTRYPOINT の実行に必要なパラメータを指定できます。

欠点: Dockerfile 内に複数の ENTRYPOINT 命令がある場合、最後の命令のみが有効になります。

<<:  クラウドコンピューティングの8つのメリット

>>:  コンピューティングパワーの「発電所」が次々と建設されています。プラグアンドプレイのコンピューティングパワーはどれくらい遠いのでしょうか?

推薦する

racknerd San Jose VPS は年間 18.88 ドルから、高性能ハードウェア構成 - AMD Ryzen 9 7950X/DDR5/NVMe (Gen4) アレイ

racknerdは、米国西海岸のサンノゼデータセンターにAMDシリーズの高性能VPSをリリースしまし...

Google、全製品のCNNICルート証明書の失効を発表

Google はセキュリティ ブログで声明を発表し、CNNIC 証明書インシデントの調査後、Goog...

Pacificrack VPS はいかがでしょうか? 24時間連続評価データを提供!

PacificrackのVPSはどうですか? ここでは、スクリプトを使用して、オフピーク時間と夕方の...

スマートルーターの時代が来るのか?

モバイルインターネットの発展に伴い、スマートホームはますます一般大衆に身近なものになり、多くの伝統的...

thaihosting: タイの VPS は月額 9.64 ドルから、タイの専用サーバーは月額 245 ドルから、PayPal での支払い

Thaihosting Co., Ltd は 1995 年に設立されたと主張していますが、関連するデ...

現在、企業ウェブサイトのコンテンツの質は依然としてSEO最適化の鍵であり、難しい問題である。

企業ウェブサイトのコンテンツソースは、誰もが直面する共通の問題であることはよく知られています。企業ウ...

extravm: 初月 30% オフ/更新 30% オフ、米国 VPS は月額 1.65 ドルから、AMD Ryzen 高性能 VPS、無制限のトラフィック、100G の高防御保護

現在、extravmではアメリカ中部のダラスデータセンターのVPSを対象に初月30%オフ/更新30%...

ウェブサイトのデザイン: ウェブナビゲーションデザインに関する2、3のポイント

Web 上のナビゲーションは、「私は誰なのか?」「私はどこから来たのか?」「私はどこへ行くのか?」と...

ウェブサイト構築はSEOを満たすサイトを構築するためのブレークスルーを求めています

SEO 最適化を満たすウェブサイトを構築することは、SEO 担当者の夢ですが、実現するのはそれほど簡...

Kubernetes以降の時代におけるK8Sの12の主要機能を紹介します

導入: Kubernetes は最近大流行しており、すべての主要なクラウド サービス プロバイダーが...

サーバーレスコンピューティングはクラウドネイティブの次の開発方向になりつつある

新しい技術が登場すると、最初に注目を集めるのはその技術的な価値であることが多いです。技術の価値が証明...

2015 Google サンフランシスコ旅行記

序文Google トップ コントリビューター サミットに参加してから 1 か月以上が経ち、これまでの...

最も効率的な分散トランザクション処理ソリューションはどれですか?それはきっと…

[[421456]]前回の記事では、Song Ge が Seata の 4 つの分散トランザクション...

2021年のクラウドコンピューティングの主な開発動向

多くの人がクラウド コンピューティング テクノロジーの利点を理解しています。今後の展開について言えば...

越境電子商取引でSEOを効果的に行うにはどうすればいいでしょうか?

この記事では、越境ECにおけるSEO戦略についてお話しします。 4つの側面から説明してください。 E...