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つのメリット

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

推薦する

JD.comには驚くべき抜け穴があり、36万元分の電話料金を無料で手に入れたと主張する人もいる。

エコノミック・ボイス「ワールド・カンパニー」の報道によると、一部のネットユーザーが10月30日午後1...

Weiboから大量のユーザーをコンバージョンするEコマースサイトの4つの特徴

編集者注: この記事の著者は、Tencent Weibo Open Platform の Xu Zh...

dogyun: 特別価格の香港 VPS、168 元/年、1G メモリ/1 コア/10g SSD/500g トラフィック/20M 帯域幅

Dogyun は現在、香港データセンターの VPS で大々的なプロモーションを行っており、商品の大量...

Pinduoduoの成功がもたらしたウェブサイトSEO最適化におけるユーザーエクスペリエンスについて考える

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています大学に入学...

古い格言: オリジナルのランキングは一時的なものに過ぎないのでしょうか?

百度が重複コンテンツの取り締まりを強化したことで、「世の中のほとんどの記事はコピーされている」という...

Kubernetes でサーバーレスを実現する 5 つの方法

[51CTO.com クイック翻訳] よく耳にする「サーバーレス」は、「イベント駆動型コンピューティ...

domain.com ビッグプロモーション: .Com ドメイン名 5 ドル/年、最長 5 年間の登録

domain.com からメールを受信しました: .com ドメイン名のプロモーション、.com +...

v.ps: 安価なドイツの VPS、年間 9.95 ユーロ、1G メモリ/1 コア/15g SSD/1T トラフィック/1Gbps 帯域幅

v.ps は本日、オランダのアムステルダムにある元のデータセンターをベースにした Nano KVM ...

Appleの記者会見がランキングやASOなどに与えた目に見える影響をまとめました。

まず、iOS11、ランキング、 ASO 、 ASMなど、長らく話題となっていたものが、実はApple...

3種類の外部リンクの重要性

誰でも外部リンクを投稿できますし、外部リンクに関しても人それぞれ独自の見解を持っていると思います。今...

2021 Dell Technologies Summit プレビュー | Dell Technologies は、クラウドネイティブのアジャイルな創造性を構築し、「未来の企業」を強化します。

[[414055]] 「ソフトウェアがすべてを定義する」とき激流が押し寄せ、人々はこう答えた。将来の...

urpadの紹介

urpad は FTNhosting () のブランドであり、2008 年に設立され、同社のチームは...

Baiduのリソースを合理的に活用することがプロモーションへの近道

プロモーションを行っているSEO担当者は、プロモーションの初期段階ではプラットフォームの問題に頭を悩...