私は、ビルドと実行のためにホストマシンに配布される Docker コンテナに、多くのローカルおよびオープンソースのコードをパッケージ化したいと考えています。最終的なコンテナの目的は、コマンドラインスタイルで実行され、結果 (例: ( docker run cmdcontainer args
)) を出力することです。私が抱えている問題は、配布されるソースは、実行される特定のホストを対象にコンパイルする必要があり、完了するまでに数時間かかることです。ただし、コンパイルされると、コマンドは非常に高速に実行されます。
そこで、この種のワークフロー用の既知の Docker パターンがあるかどうか疑問に思っています。
Docker コンテナをソースファイルとともに配布 -> コンテナを実行してコンパイルされたバイナリを含む新しいコンテナを生成 -> 以降の実行ではコンパイルされたコンテナを実行する
これは基本的に古いコンテナの上に新しいコンテナを重ねるものなので、可能であるように思えますが、私は Docker 初心者です。
答え1
すべてのホストが一意であるため、私が思いつく最善の解決策は、永続性のためにボリュームを使用することです。エントリポイントでは次のワークフローが必要になります。
- ボリューム内のコンパイルされたコードのバージョンを確認します
- バージョンが一致しない場合はボリュームの内容を削除します
- バージョンが設定されていないか不一致の場合は、コンパイルを実行します
- そのボリュームに新しいバージョン番号を書き込む
- ボリューム内のコンパイルされたバージョンからアプリを実行します
これには、イメージビルドにバージョン番号 (git ハッシュなど) を埋め込む必要があります。これはビルド引数を使用して実行できます。
docker build --build-arg GIT_REV=$(git rev-parse --short HEAD) ...
そして、Dockerfile には次のような内容が含まれます。
ARG GIT_REV
ENV GIT_REV=${GIT_REV}
ボリュームなしで実行しているユーザーの場合、実行のたびにコンパイルが実行されることに注意してください。