Dockerfile 内の予約語命令の解析処理

Dockerfile 内の予約語命令の解析処理

以前、プロジェクトを迅速にデプロイするために Docker について簡単に学習したことがあります。プロセスは非常に速く進みましたが、Dockerfile ファイルの記述には多少慣れていませんでした。

そこでこの記事を書きました。これが皆さんのお役に立てれば幸いです! ! !

1. Dockerfile とは何ですか?

コンセプト:

Dockerfile は、Docker イメージをビルドするために使用されるビルド ファイルです。一連のコマンドとパラメータで構成されるスクリプトです。

構築するには 3 つの手順が必要です。

  • Dockerfileの作成
  • ドッカービルド
  • ドッカー実行

Centos の例:

CentOS の例:

ゼロから #実際のベースイメージ、
centos-7-x86_64-docker.tar.xz を追加します /

# ラベルの説明 LABEL \  
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS ベースイメージ" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20201113" \
    org.opencontainers.image.title="CentOS ベースイメージ" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0のみ" \
    org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

CMD ["/bin/bash"] #最後の行で実行されたコマンド

どこで見つけたのでしょうか? hub.docker.com の centos で見つけました。

やり方は分かりませんが、まずは他の人の書き方を見てみることはできます。宿題をコピーすることは誰でもよく知っていると思います。一般的にCV法として知られています😂。

2. Dockerfile構築プロセスの分析

はじめる:

各予約語ディレクティブ (今日の投稿の焦点) は大寫字母始まり、跟隨至少一個參數必要があります。

のように:

ゼロから #実際のベースイメージ、
centos-7-x86_64-docker.tar.xz を追加します /

命令は上から下へ順番に実行されます。

#コメントを示します。

#これはコメントです

各命令は新しいイメージ レイヤーを作成し、イメージをコミットします。

以下のように、入れ子人形のように作ることもできます。

Dockerfile実行プロセス分析: dockerベースイメージからコンテナを実行します

  • コマンドを実行してコンテナに変更を加える
  • 新しいイメージ レイヤーを送信するには、 docker commitと同様の操作を実行します。
  • docker送信されたイメージに基づいて新しいコンテナを実行します。
  • すべての命令が実行されるまで、 dockerfile内の次の命令を実行します。

本文の後半に事例が出てきますので、事例と合わせて振り返ると理解しやすくなります。

ちょっとした追加情報:

  • この段階では、 DockerfileDockerイメージ 、 Dockerコンテナ をソフトウェアの 3 つの異なる段階として見ています。
  • Dockerfileは開発用です ---> Dockerイメージが配信標準になります ---> Dockerコンテナは展開と運用と保守に関係します
  • プロセスに必要なものはすべてDockerfileで定義されています。以前必要だった環境変数、依存パッケージ、ランタイム環境などはすべてDockerfileファイルに書き込まれます。これまでは Liunx サーバーで多数のソフトウェアをダウンロードしたり、多数の設定を行ったりしていましたが、今回ははるかに簡単です。少なくとも私のような初心者にとっては、Docker を使用してデプロイする方がはるかに簡単です。
  • Dockerイメージは、 Dockerfileを使用してファイルが定義された後、Docker ビルド中に生成される Docker イメージです。Docker Dockerが実行されると、実際にサービスの提供が開始されます。

Docker コンテナは実行後すぐにサービスを提供できます。

3. Dockerfileの予約語の指示

Dockerfiel の予約語の指示は次のとおりです。

  1. から
  2. メンテナー
  3. 走る
  4. さらす
  5. ワークディレクトリ
  6. 環境
  7. 追加
  8. コピー
  9. 音量
  10. CMDF
  11. エントリーポイント
  12. オンビルド

3.1 から

ベース イメージ、つまり、現在の新しいイメージが作成されるベースとなるイメージ。

#openjdk:8 に基づいてイメージを作成する FROM openjdk:8

3.2 メンテナー

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

メンテナー Ning Zaichun [email protected]

3.3 実行

コンテナを構築するときに実行する手順

mkdir -p /conf/my.cn を実行します。

3.4 公開する

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

#MyCat の必要なポートを公開します EXPOSE 8066 9066

3.5 ワークディレクトリ

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

#コンテナデータボリューム。データ保存と永続化作業に使用されます。WORKDIR /usr/local/mycat

3.6 環境

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

#イメージ構築プロセス中に環境変数 ENV MYCAT_HOME=/usr/local/mycat を設定するために使用されます

この環境変数は、コマンドの前に環境変数プレフィックスが指定された場合と同様に、後続の RUN 命令で使用できます。また、これらの環境変数は他の命令でも直接使用できます。

のように:

$MYCAT_HOME/mycat を実行します。

3.7. 追加とコピー

追加:

ホスト ディレクトリ内のファイルをイメージにコピーすると、ADD コマンドによって URL が自動的に処理され、tarball が解凍されます。

centos-6-docker.tar.xz を追加します /

コピー:

ADD と同様に、ファイルとディレクトリをイメージにコピーします。

ビルドコンテキストディレクトリの<ソースパス>からイメージの新しいレイヤーの<ターゲットパス>の場所にファイル/ディレクトリをコピーします。

コピー src dest コピー ["src" "dest"]

3.8 ボリューム

コンテナ データ ボリュームは、データの永続性と保存に使用されます。

#mycat設定ファイルアドレスのマッピングアドレスを公開し、起動時にホストフォルダVOLUME /usr/local/mycatを直接マッピングします。

3.9 CMDとENTRYPOINT

CMDF

CMD コマンドは RUN コマンドに似ており、次の 2 つの形式があります。

  • shell形式: CMD<コマンド>
  • exec形式: CMD ["実行ファイル", "パラメータ 1", "パラメータ 2".....]

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

エントリーポイント

コンテナの起動時に実行するコマンドを指定します。

ENTRYPOINT の目的は CMD と同じで、コンテナの起動プログラムとパラメータを指定することです。

違い:

違いを簡単に説明します。CMDは上書きとして理解できます。

コマンド cat /conf/my.cnfCMD /bin/bash

これらの命令は両方ともDockerfileファイルに記述されています。CMD /bin/bash のみが実行されますが、 CMD cat /conf/my.cnf CMD /bin/bashによって以前のものに直接上書きされるため、実行されません。

ENTRYPOINTは異なります。ENTRYPOINT ENTRYPOINT単純に追加として理解できます。

これは主にdocker runに反映されます。dockerfile dockerfile CMDで終わる場合、実行時に追加のコマンドを追加することはできません。そうでない場合、 Dockerfile内のCMDコマンドが上書きされます。

Dockerfileの最後の行がENTRYPOINTで終わる場合は、 docker runコマンドの後にいくつかのコマンドを追加できます。

3.10 オンビルド

継承されたDockerfileをビルドするときに、コマンドが実行されます。親イメージが子に継承された後、親イメージのonbuildがトリガーされます。

4. 実際の戦闘事例

4.1. 独自の CentOS イメージを作成する

4.1.1、はじめに:

まず Alibaba Cloud から CentOS を取得して、どのような問題があるかを確認し、その後カスタマイズしてみましょう。

docker pull centos # イメージをプルする docker run -it centos # イメージを実行する # ===== テスト ====vim ceshi.txtifconfig pwd

なぜそうなるのでしょうか? Docker リポジトリ内の Centos は簡素化されたバージョンであり、カーネルのみが含まれており、他には何もありません。

上記の問題を解決するには、カスタマイズされた Centos が必要です。

4.1.2. Dockerfileを書く

カスタム Centos 用の Dockerfile を作成する

FROM centosMAINTAINER 宁在春<[email protected]>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80 CMD echo $MYPATHCMD echo "success"CMD /bin/bash #最後のものだけが実行されます

次にこれをコピーします。

mkdir -p /usr/local/docker/mycentos # 独自の保存場所を作成する vim Dockerfile

4.1.3. CentOSイメージのビルド

次のコマンドを実行して、docker を実行します。

説明する:

  • -f: Dockerfileファイルが続く
  • -t: イメージ名とバージョン番号が続きます。
  • 最後の小数点: 現在のディレクトリを示します。
  • docker build -f Dockerfile ファイル -t イメージ名: タグ。
  • dockerfile ファイルの名前が dockerfile で、現在のディレクトリにある場合は、次のように省略できます。
  • docker build -t イメージ名:タグ .docker build -t mycentos:1.1 .

埋め込む:

最後の一つを見ることは成功を意味します。

docker imagesすべてのイメージを表示:

4.1.4. Centosイメージを実行する

docker run -it mycentos:1.3pwdifconfig

コンテナに入るディレクトリが/から/usr/localに切り替わる理由は、Dockerfile ファイルにすでに記述されているからです。

ENV MYPATH /usr/localWORKDIR $MYPATH

4.1.5. 画像の変更履歴を表示する

docker 履歴 mycentos:1.1 

ここでは、Dockerfile ファイル内の指示に従ってイメージがレイヤーごとに構築されていることもわかります。

4.2 ONBUILDの例

夫の鏡を最初に作ろう

dockerfileファイルを作成し、 dockerfile2という名前を付けます。

FROM centosRUN yum -y install curlONBUILD RUN echo "サブイメージに継承されました。このステートメントを出力します" CMD ["crul", "-s","http://ip.cn"]
次のコマンドを実行して、docker を起動します。

鏡像を作る

dockerfileファイルを作成し、 dockerfile3という名前を付けます。

my_father_centosRUN から yum -y install curlCMD ["crul", "-s","http://ip.cn"]
次のコマンドを実行して、docker を実行します。 

親イメージ内の文が出力されていることがわかります。

Dockerfile の予約語命令に関するこの記事はこれで終わりです。関連する Dockerfile の予約語命令については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Dockerfile ファイルの書き込みとイメージ構築コマンドの分析
  • Dockerfileの簡単な紹介
  • Docker イメージの階層化と Dockerfile の記述スキル
  • Dockerfile における VOLUME と docker -v の違い
  • Dockerfile ビルド中に発生する「/bin/sh: pip: コマンドが見つかりません」という問題の解決方法
  • DockerはDockerFileビルドプロセス命令の解析を実行します

<<:  HTML+JS に基づくシンプルな年齢計算ツールの実装

>>:  CSSは親コンテナのdivをimg画像で埋め、コンテナのサイズに適応します。

推薦する

Reactコンポーネント通信の詳細な説明

目次コンポーネント通信の概要コンテンツ3つの方法まとめコンポーネントコミュニケーション - 父から息...

dl、dt、dd はいつ使用するのが適切ですか?

dl:定義一覧定義リストdt:定義タイトルタイトルを定義するdd:定義説明定義の説明dt は情報のタ...

CSS3でカルーセル画像を作成する方法

スライドショーは Web ページでよく見られます。美しい写真が使われています。こちらは純粋な CSS...

bash のスクリプトデバッグメカニズムの詳細な説明

スクリプトをデバッグモードで実行するbash -x <script> を使用すると、スク...

MySQL マスタースレーブレプリケーションスレッドの状態遷移に関する詳細な理解

序文MySQL マスター スレーブ レプリケーションの基本原理は、スレーブ データベースがマスター ...

DockerはClickHouseをインストールし、データテストを初期化します

クリックハウスの紹介ClickHouse は、SQL クエリを使用して分析データ レポートをリアルタ...

CSS の子要素を親要素と高い一貫性を持たせる方法

絶対位置決め方式: (1)親要素を相対配置に設定します。親要素の高さを指定しない場合は、左の子要素の...

Centos7.6にTomcat-8.5.39をインストールする方法

Centos7.6 に Tomcat-8.5.39 をインストールする方法は次のとおりです。詳細は次...

Win7 インストール MySQL 5.6 チュートリアル図

目次1. ダウンロード2. インストール3. my.ini ファイルを設定する(デフォルトのエンコー...

Linux におけるドライバモジュールのパラメータ転送プロセスの分析

ドライバーモジュールに渡すパラメータ名、タイプ、権限を宣言します。 module_param(変数名...

DockerでRedisを使用するための詳細な手順

1. はじめにこの記事では、Docker を使用して Redis を探索する方法を説明します。 Do...

MySQL Routerのインストールと展開

目次01 MySQLルーターの紹介MySQL Router とは何ですか? 02 MySQLルータの...

MySQL の count()、group by、order by の詳細な説明

最近、IM を実行するときに、これらの 3 つのキーワードを同時に使用したときに問題が発生しました。...

nginx をコンパイルしてインストールした後、スムーズに nginx をアップグレードする方法

nginx をコンパイルしてインストールし、一定期間使用した後、現在のバージョンに脆弱性があることや...

VirtualBoxにOpenSuseをインストールする方法

仮想マシンはホストマシンにインストールされます。 CPU とメモリはホスト マシンと共有する必要があ...