Dockerfile は組み込みのシェル スクリプトをサポートし、&& リンク シンボルは不要になりました。

Dockerfile は組み込みのシェル スクリプトをサポートし、&& リンク シンボルは不要になりました。

数日前、私はDockerfile[1]のHere-Doc構文をテストしましたが、役に立たないことがわかりました。私はただ表面的なだけだった。

Docker公式サイトのドキュメントにあるbuildkit[2]の紹介を再度読みました。これは Docker Engine 23.0 以降のデフォルトのビルダーです。

BuildKitopen_in_new は、従来のビルダーを置き換えるために改良されたバックエンドです。 BuildKit は、バージョン 23.0 以降の Docker Desktop および Docker Engine のユーザーのデフォルトのビルダーです。

つまり、前回の記事で述べた不便さはすべて自然に解消されることになります。

私は、HereDoc は役に立たない構文であるという誤解を注意深く分析し、以下の理由を発見しました。

テスト サーバーの Docker バージョンが低すぎます (20.x)。

ベースイメージを書いてからかなり時間が経っているので、複雑なRUNコマンドやCOPYコマンドはありません。

上記の点を踏まえて、いくつかの最適化を行いました。

  1. そこで、公式サイトのドキュメントに従ってDocker Engineを再インストールし、バージョンを24.0.5にアップグレードしました。
  2. Docker Hub で redis の公式 Dockerfile を見つけて再テストしました。

結論としては、Here-Doc 構文は本当に素晴らしいということです。

一言で言えば、複数行の構文をサポートするだけでなく、組み込みのシェル スクリプトも直接サポートします。

素晴らしい Dockerfile ヒアドキュメント構文

まず、公式 Web サイトのドキュメントに従って、Docker エンジンのバージョンを最新バージョンにアップグレードします。 Ubuntu - docker[3]を例に挙げる

sudo apt-get install docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-plugin

次に、Docker Hub[4]で対応するredis公式dockerfileを見つけます。

RUNコンテンツは&&でリンクされていないものの、;でセグメント化されて管理されていることがわかります。そして\、これはまだ少し不便です。

少し変更すると、(1) をすべて削除します。リンクとして使用されている\を削除し、(2)RUNのインデントをすべて削除します。

重要なポイント: これはシェル スクリプトです。つまり、ローカルテストが完了したら、それを Dockerfile に直接コピーできます。以前は、コマンドを連鎖するには && を使用する必要がありました。

注意: ここでは次の形式を使用する必要があります。そうしないと、ローカル変数を下位に渡すことができません。

 RUN <<EOT #!/bin/bash # statment EOT

docker buildコマンドを使用してイメージを直接ビルドし、実行結果を確認します。

トラブルシューティング

変数の受け渡し問題

以下の 2 つのモードに関しては、公式 Web サイトのドキュメントではその理由が説明されていません。これは比較実験結果から推測されただけであり、具体的な実装はまだ研究されていません。

モード 1 bash は EOT の直後にルート化されます。

 RUN <<EOT bash dist=$(uname -s) wget -O example.com/app-${dist} app-${dist} EOT

このモードでは、最初の行の変数 dist を 2 行目の wget で使用することはできません。したがって、wget行によって実際に解析されるコマンドは

wget -O example.com/app- app-

モード 2: 複数行コンテンツの最初の行でインタープリター #!/bin/bash が指定されている場合、すべてのコンテンツはシェル スクリプトと見なされます。

 RUN <<EOT #!/bin/bash dist=$(uname -s) wget -O example.com/app-${dist} app-${dist} EOT

このモードでは、wget行によって実際に解析されるコマンドは

wget -O example.com/app-Linux app-Linux

期待に応える

ビルドキット構成ファイルなし

ls: cannot access '/root/.docker/buildx/instances/default': No such file or directory

デフォルトの buildx 構成が見つからない場合は、以下を使用します。

 { "Name": "localbuilder", "Driver": "docker-container", "Nodes": [ { "Name": "localbuilder0", "Endpoint": "unix:///var/run/docker.sock", "Platforms": [ { "architecture": "amd64", "os": "linux" }, { "architecture": "arm64", "os": "linux" } ], "Flags": null, "ConfigFile": "", "DriverOpts": {} } ], "Dynamic": false }

<<:  Dockerfileファイルを取得するためのDockerイメージ解析

>>:  クラウドコスト最適化における5つのよくある間違い

推薦する

2023 年のエンタープライズ クラウド戦略の 7 つのトレンド

クラウド コンピューティング テクノロジーがさまざまな方向に進化しており、そのすべてがコンピューティ...

1品1コードが新たなマーケティングトレンドに。超低コストでビッグデータ運用帝国を築くことも可能

月収10万元の起業の夢を実現するミニプログラム起業支援プラン私の上司は最近レッドブルを買うのが好きな...

企業コンテンツ配信の7Sコンセプトを考える

今日のインターネットの情報爆発では、膨大な量の新しい情報が毎日生成されています。企業コンテンツの配信...

王建林とジャック・マーの協力の第一歩:ワンダ・シネマがアリペイに参入

上海の記者タオ・リー先日の中国経済人オブ・ザ・イヤー授賞式で、王建林氏が「近いうちにジャック・マー氏...

dreamhost-ブラックフライデー/$19.44/年額

dreamhost、毎年恒例のブラックフライデー プロモーション、年間支払い割引 100 ドル (月...

VMware、マルチクラウド管理を推進するVMware Ariaを発表

パブリック クラウド全体とエッジでアプリケーションを提供する企業が増えており、Kubernetes ...

Linux環境構築---Linux仮想マシンを段階的に構成する方法を説明します

Ubuntu をインストールした後、vi から vim へのアップグレード、ソースの変更など、一部の...

ウェブサイトのリンク切れ検出と完璧な処理方法

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

SEOの秘密兵器: 人気のキーワードを正確に予測する方法

最近、Baidu Space を使って SEO 実験を行っており、多くの成果を上げています。 Bai...

ユーザーエクスペリエンスにおけるいくつかの誤解と、それを効果的に回避してコンバージョン率を向上させる方法について簡単に説明します。

今日、インターネットはユーザーエクスペリエンスにますます注目しています。一部の大規模なウェブサイトは...

新しいウェブサイトを立ち上げてから半月以内に Google で 30,000 のインデックスを取得する方法

ウェブサイトが検索エンジン最適化を行う際、最初に検討するのは間違いなく Baidu です。これは疑う...

検索エンジンの仕組みを理解することの重要性

一般的に、多くの友人は SEO を学ぶ方法として 2 つしか持っていません。1 つ目はインターネット...

ハイパースケールクラウドコンピューティングプロバイダーはAIクラウドサービスへの投資に注力している

今日、AI クラウド サービスは、データ サイエンティストや開発者を惹きつけ、自社のプラットフォーム...