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つのよくある間違い

推薦する

「何百もの意見」を使って、大規模アップデート後の苦痛から何を学ぶべきかを教えてくれる

6月28日のBaiduの大規模なアップデートは多くのウェブマスターを驚かせたが、それから間もなく、7...

hostodo-NAT VPS/年間15ドル/メモリ2g/ハードディスク30g/トラフィック3T/ロサンゼルス

すでにhostodo.comをよくご存知の方も多いでしょう。HostodoのVPSは、quadran...

フレンドリーリンクプラットフォームは、「ウェブサイト最適化提案」のおかげで効率的なトラフィックを獲得します

ウェブサイトを構築するウェブマスターは皆、フレンドリーリンクがウェブサイトの重みを高めることができる...

長い歴史、フレンドリーなアフターサービス、高速なスピードを備えたおすすめのアメリカ製VPS

アメリカの VPS には選択できるブランドが多すぎて、理解するまでどのアメリカの VPS が優れてい...

gomanilahost: フィリピン VPS、月額 22.5 ドル - 2G メモリ/1 コア/50g SSD/2T トラフィック

gomanilahost(2006年設立)は、主に共有ホスティングやVPS事業を展開するフィリピンの...

簡単な説明: ウェブサイトのコンテンツを更新するときに注意すべき 2 つの量は何ですか?

高品質のコンテンツから高品質の Web サイトが生まれ、Web サイトのコンテンツの重要性は明らかで...

SEOリーダーへ:チームを率いて生き残る方法

サービス業界の人員として、SEO 担当者は自発的または意図的にチームを編成し、SEO サービスを提供...

ウェブサイトのユーザーエクスペリエンス: ユーザーの成功した操作に対して肯定的なフィードバックを提供する

暑い日はカーテンを閉めて家の中にこもり、猫たちが楽しそうに遊ぶ様子を見ながらブログを書いています。こ...

クラウド統合を活用してマルチクラウドの課題に対応する方法

過去 10 年間のクラウド コンピューティングの普及により、多くの企業は、互いに互換性がなく、同じジ...

クラウド コンピューティング業界で高収入につながる 11 のスキル

企業がインフラストラクチャをパブリック クラウドに移行するにつれて、クラウド コンピューティングのス...

検索エンジンマーケティング戦略 企業のウェブサイトを最適化し、宣伝する方法

時代の発展とともに、インターネットは特に若者にとって生活必需品となりました。彼らは食べ物や飲み物なし...

漏洩したパスワード照会サイトが一夜にして人気に:冗談でトラフィックが急増

漏洩したパスワード検索サイトへのアクセスが一夜にして急増パスワードが漏洩した場合、QQアカウントのロ...

「最適化」のためのさまざまな検索エンジンの好みを理解する

クモといえば、私のウェブマスターの友人のほとんどは、怒っていると同時に愛情深いです。私は蜘蛛を喜ばせ...

webhosting24: 日本 VPS、年間 15 ユーロ、Ryzen 9 3900X+NVMe+1Gbps 帯域幅

webhosting24 も歴史のある企業です。2001 年から事業を行っています。同社はイタリア、...

ウェブサイトの営業利益の核心は商人を結びつけることである

ローカルウェブサイトはどのように運営されるべきでしょうか? 多くのローカルウェブサイトが人気を博し、...