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

推薦する

どのような状況で小紅書の紙幣が規制に違反するのでしょうか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスどのような状況でメモ取り...

アリババが土地を奪い、グーグルが資金を投じる:クラウドコンピューティング大手、春の軍拡競争開始

近年、クラウド コンピューティングは、俊敏性、拡張性、コストなどの利点により、企業が IT 変革を実...

B2B ブログ SEO 運用のヒント

ブログは、企業に顧客とのよりカジュアルでパーソナライズされたコミュニケーション方法を提供します。SE...

ウェブマスターの皆さん、現状に直面しても前進できますか?

最近、多くのブロガーが去っていくのを見ました。グループでチャットしているとき、彼らは次のように話して...

VMware アプリケーション環境に基づくバックアップおよびリカバリ ソリューションのアイデア

VMWARE 仮想化環境の普及に伴い、ますます多くの VMWARE ベースのアプリケーションをバック...

Alipay の Koi マーケティングの裏には、綿密に計画された 4 つの裏話があります。

月収10万元の起業の夢を実現するミニプログラム起業支援プラン著者丨ルーティン編集部出典: Opera...

コンテナ クラウド アーキテクチャ | Kubernetes ネットワーク モデルを理解する

Kubernetes ネットワークを使用すると、k8s ネットワーク内での通信を構成できます。フラッ...

モバイルアプリを素早く開発するにはどうすればいいですか? Ant Financial mPaaSはすでにあなたのために答えを書きました

2、3年前に戻ってみれば、バスや地下鉄に乗るのにアリペイを使っている人を見て人々は驚いたかもしれませ...

2018年のWeChatミニプログラムの迷路について話しましょう!

2018 年を通して、私はミニ プログラムが新しい軌道なのか、あるいは配当があるのか​​と悩んでいま...

Red Hat 2018 テクノロジー オープン デー: オープンソースの本質は文化、コミュニティ、コラボレーションにあります

[51CTO.com からのオリジナル記事] Red Hat は、コミュニティ主導のアプローチで信頼...

サイバーマンデー - ドメイン名割引情報の波がやってくる

今年の感謝祭、ブラックフライデー、サイバーマンデーは合計でほぼ1週間続き、遅くとも11月28日午後4...

百度が2013年の年間検索ランキングを発表

12月22日午前、昨晩の百度沸点祝賀会で、百度の2013年検索ランキングが発表された。「天気」という...

SEO とは何か、そしてそれをどのように活用するのか?

SEO とは何ですか? 多くの友人が不満を言うのを聞いたことがあります。なぜランキングのために一生懸...

1秒間に107万枚の画像を処理! Alibaba Cloud が MLPerf 画像分類パフォーマンス記録を更新

アリババはシングルチップAIパフォーマンス記録を破り、再び世界トップのAI評価を獲得した。北京時間4...