web-dev-qa-db-ja.com

イメージからホストへのDockerfile COPY

最初にMosquittoサーバーを1つのレイヤーでコンパイルし、次にCOPYを使用して認証プラグインのソースファイルをイメージにコピーし、最後にそのプラグインのコンパイルを実行するDockerfileがあります。

全体として、結果のイメージは、そのプラグインがロードされた状態でMosquittoサーバーが実行されているコンテナーで使用するのに適しています。

このプラグインを変更し、Dockerfileのビルドを再実行して再コンパイルしたいと思います。最初のレイヤーは変更されていないため、変更されたファイルをコピーしてコンパイルを再実行するだけです。

私が今したいのは、その新しいイメージからプラグイン(.soファイル)を抽出し、それをホスト上のマウントされたディレクトリに移動して、現在実行中のMosquittoサーバーを再起動するだけで済むようにすることです。

COPYコマンドを逆に使用して、コンパイルされたプラグインを指定のホストディレクトリにコピーし、新しく作成されたイメージを削除できるようにすることはできますか?

それともこれは悪いアプローチですか?実行中のコンテナーを実行してプラグインを再構築する必要がありますか(サーバーが実行されているマシンでのプラグインの構築に制限されます)?

3
Daniel F

あなたが使用している特定のコンパイラツールの詳細はわかりませんが、私はあなたが達成しようとしていることを理解していると思います:

DockerfileにCOPYコマンドを含めません。 Dockerfileには、コンパイルプロセスを実行するために必要なツールと依存関係を含むイメージを作成するために必要な指示と、特定のコンパイル順序を含むシェルスクリプトのみを含める必要があります。

これでdocker buildを実行し、イメージができたので、それをmosqと呼びます。それを仮定しましょう:

  • ローカルマシンの/home/me/my-source-codeにソースコードがあります
  • コンパイルすると、そのフォルダーのサブフォルダーdist内に結果が得られます:/home/me/my-source-code/dist/result.so
  • 画像には、/compile.shにあるソースコードをコンパイルするスクリプト/compilationがあります(画像内のフォルダーは空である必要があります)

次に、イメージマウントボリュームparam:/home/me/my-source-codeをコンテナ内の/compilationに実行します。

上記のすべての点を想定すると、docker runコマンドは次のようになります。

docker run -d --name my-compiler -v /home/me/my-source-code:/source mosq /compile.sh

Et voila、コンテナはサイレントに実行されて終了し、その後、/home/me/my-source-code/dist/result.soでコンパイルします

詳細は詳細によって大きく異なる場合がありますが、1つのshスクリプトを実行するとコンパイラーがどこかからコードを取得して実行できるように、イメージ内のすべてを準備してください。そのフォルダーにコードを含むボリュームをマウントします。コンパイラが別の場所で結果を出力する場合は、ホストマシンから別のボリュームをマウントして、そこに結果を取得します。

5
gmc

COPYはおそらく、達成しようとしていることに適したツールではありません。

@gmcが提案するようなランタイムボリュームを使用するか、docker cpを使用してホストにコピーします。

使用法

docker cp CONTAINER:SRC_PATH DEST_PATH

しかし、それが一般的に正しいアプローチであるかどうかはわかりません。 Dockerが、達成しようとしていることのために必要なツールであるようには思えません。変更可能なサーバーインスタンスが必要な場合は、より良いオプションがあります。

0
Ryan