実際、これを行うことができるかどうかはわかりませんが、ハックが常にあることは知っていますので、専門家がこれについて何を言っているのか、私は熱心です。
dockerイメージをビルドするときに引数としてパッケージを渡して、同じdockerfileで別々のアプリバージョンをデプロイできるようにします。
これは私が達成したいことの例です:
イメージをビルドするときに引数としてパッケージを渡す機能(構文が間違っていることは知っていますが、これは単なる例です)
docker build -t myapp/myapp:v1 . package_myapp_v1.tar
次に、ADD
でDockerfile
を使用して、コンテナに抽出します。
ADD passed_package ./
そのため、アプリのv2のイメージを作成する場合は、Dockerfile
を変更せずにdocker build
コマンドで新しいパッケージを指定できます。
誰もがそれを機能させるためのトリックは何ですか?
ありがとう:)
docker's doc を2分間読んだ後、なんとか解決できました。
ARG命令は、ビルド時に--build-arg =フラグを使用してdocker buildコマンドでビルダーに渡すことができる変数を定義します。ユーザーがDockerfileで定義されていないビルド引数を指定すると、ビルドはエラーを出力します。
だから私はこれを使って自分のイメージを構築しました
docker build -t myapp/v1 --build-arg package=package_myapp_v1.tar.gz .
次に、Dockerfile
内のパッケージを取得するには、ARG
命令を使用します。
ARG package
ADD $package ./
$package
変数の内容はpackage_myapp_v1.tar.gz
で、package
タグを介して渡されます。
Dockerfileではなく、ビルド間で変更する必要があるコンテキストのようです。いずれにせよ、これを達成する1つの方法は、Dockerの機能を使用してコンテキストをtar(オプションでgz)ファイルとして受け取り、ルートにDockerfileを置くことです。
tar --create \
/some/path/to/Dockerfile \
/other/path/to/package-X.Y.Z.tgz \
--transform 's,.*/,,' \
--transform 's/package.*tgz/package.tgz/' |
docker build -t myapp/myapp:v1 -
注意:
最初のtransform
はディレクトリ構造を平坦化するため、Dockerが期待するtar
ファイルのルートにすべてのファイルが表示されます。
2番目のtransform
はパッケージファイルからバージョン番号を削除するため、DockerfileのADD package.tgz .
行を編集する必要はありません。