web-dev-qa-db-ja.com

dockerfileの引数としてファイルを渡す方法

実際、これを行うことができるかどうかはわかりませんが、ハックが常にあることは知っていますので、専門家がこれについて何を言っているのか、私は熱心です。

dockerイメージをビルドするときに引数としてパッケージを渡して、同じdockerfileで別々のアプリバージョンをデプロイできるようにします。

これは私が達成したいことの例です:
イメージをビルドするときに引数としてパッケージを渡す機能(構文が間違っていることは知っていますが、これは単なる例です)

 docker build -t myapp/myapp:v1 . package_myapp_v1.tar  

次に、ADDDockerfileを使用して、コンテナに抽出します。

ADD passed_package ./ 

そのため、アプリのv2のイメージを作成する場合は、Dockerfileを変更せずにdocker buildコマンドで新しいパッケージを指定できます。

誰もがそれを機能させるためのトリックは何ですか?

ありがとう:)

7
storm

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タグを介して渡されます。

10
storm

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 .行を編集する必要はありません。

1
Matei David