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

推薦する

ランキング後もSEO最適化を継続する方法

最初の問題は、あなたのウェブサイトはランキングを持っていますが、キーワードが安定していないことです。...

hostflyte: 年間 12 ドル、KVM 仮想化、CN2 GIA ネットワーク、1Gbps 帯域幅

Hostflyte、ロサンゼルス VPS の新しい cn2 gia ラインは、KVM 仮想化、1Gb...

SEO の行き詰まりから明るい未来へ

「橋を渡れば物事はうまくいく」という中国のことわざがあります。このことわざは、人生の些細なことに本当...

timeweb: ハイエンド VPS、月額 117 元、帯域幅 200Mbps、トラフィック無制限、メモリ 2G/コア 1 個 (5GHz)/NVMe 80g

timeweb は、KVM 仮想化に基づくハイエンド VPS を提供しています。I9-9900 (5...

優れたコピーライターになるための3つのステップ

人生は旅のようなものです。コピーライティングを職業として選んだということは、旅の目的を選んだというこ...

クラウド移行戦略に関する専門家のアドバイス

クラウド コンピューティングはビジネス運営に多大なメリットをもたらしますが、これらのメリットを実現す...

この期間中にBaidu Kステーションの包含を増やすための最良の方法

数日前にWentaoとこの件について話し合ったことを覚えています。特に私のブログサイトのインクルード...

クラウドコンピューティング戦争はまだ終わっていない

都市に住む人々は、いくつかの共通のビジョンを持っています。「例えば、道路をもっとスムーズにできないか...

myserverplanet - 年間 5 ドルで無制限のトラフィックの仮想ホスト、英国のデータ センター

myserverplanet(登録年:2010年、英国企業)が新しいビジネスを立ち上げ、cpanel...

シンプルで習得しやすいソフトコピーマーケティングスキルとは?この5つのステップを見てください

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス私は企業のプロダクトマー...

クリスマス: greengeeks-35% オフ/cpanel パネル/無制限の仮想ホスティング/無料ドメイン名/純粋な SSD

2004 年に設立されたアメリカのホスティング会社 greengeeks は、クリスマスに仮想ホステ...

この写真は私が撮った写真の 1 枚です。この写真が原因で、数十の Web サイトが閉鎖されました。

最近、政府はインターネットの管理を強化しており、簡単な個人ブログを開設するにも、何段階もの承認と申請...

Vagrant - マルチノード仮想マシンクラスタの構築

I. はじめにプログラムを開発する場合、使用するオペレーティング環境は通常、自分のコンピューター、W...

SFエクスプレスとツァイニャオがターミナル物流で競争

国家郵政局のデータによると、中国の速達業務量は8年連続で世界第1位となっており、2022年も引き続き...

推奨: budgetvm-$4.99/2IP/1g メモリ/75g SSD/3T トラフィック/Alipay/4 コンピュータ ルーム

budgetvmのSSDハードドライブVPSの価格が値下げされました。現在、1Gの価格は512Mメモ...