196

私の質問は、コンテナからホストへのファイルのコピーに関するこの質問に関連しています。依存関係をフェッチし、ソースからビルド アーティファクトをコンパイルし、実行可能ファイルを実行する Dockerfile があります。ビルド アーティファクトもコピーしたい (私の場合は '../target/` で.zip作成されたものsbt distですが、この質問は jar やバイナリなどにも当てはまると思います。

docker cpイメージではなくコンテナで動作します。コンテナからファイルを取得するためだけにコンテナを起動する必要がありますか? スクリプト/bin/bashで、バックグラウンドで対話モードで実行し、ファイルをコピーしてからコンテナーを強制終了しようとしましたが、これは面倒です。より良い方法はありますか?

一方、 1 つのファイルを取得するためだけに.tar実行後にファイルを解凍することは避けたいと思いdocker save $IMAGENAMEます (ただし、現時点では、最も遅い場合でも、これが最も簡単なオプションのように思えます)。

たとえば、docker ボリュームを使用します。

docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out

しかし、私はboot2dockerOSX で実行していて、Mac ホスト ファイルシステムに直接書き込む方法がわかりません (読み取り/書き込みボリュームが boot2docker VM 内にマウントされているためblah.zip、イメージから抽出するスクリプトを簡単に共有することはできません)。他の人。

4

10 に答える 10

279

イメージからファイルをコピーするには、一時コンテナーを作成し、そこからファイルをコピーしてから削除します。

id=$(docker create image-name)
docker cp $id:path - > local-tar-file
docker rm -v $id
于 2015-07-09T11:51:26.763 に答える
18

親コメントはすでにcat の使用方法を示しています。同様の方法でtarを使用することもできます。

docker run yourimage tar -c -C /my/directory subfolder | tar x
于 2016-11-15T11:29:59.760 に答える
0

MacOS で boot2docker を使用しています。「docker cp」に基づくスクリプトは移植可能であることを保証できます。コマンドは boot2docker 内で中継されますが、バイナリ ストリームは Mac で実行されている docker コマンド ライン クライアントに中継されます。したがって、docker クライアントからの書き込み操作はサーバー内で実行され、実行中のクライアント インスタンスに書き戻されます。

Docker ボリュームのバックアップ スクリプトを、私が提供する任意の Docker コンテナと共有しています。私のバックアップ スクリプトは、Linux と MacOS の両方で boot2docker を使用してテストされています。バックアップは、プラットフォーム間で簡単に交換できます。基本的に、スクリプト内で次のコマンドを実行しています。

docker run --name=bckp_for_volume --rm --volumes-from jenkins_jenkins_1 -v /Users/github/jenkins/backups:/backup busybox tar cf /backup/JenkinsBackup-2015-07-09-14-26-15.tar /jenkins

新しいbusyboxコンテナを実行し、jenkins_jenkins_1という名前のjenkinsコンテナのボリュームをマウントします。ボリューム全体がファイル backups/JenkinsBackup-2015-07-09-14-26-15.tar に書き込まれます

バックアップまたは復元スクリプトを調整せずに、Linux コンテナーと Mac コンテナーの間で既にアーカイブを移動しました。これが必要な場合は、スクリプト全体のチュートリアルがここにあります: blacklabelops/jenkins

于 2015-07-09T12:30:56.343 に答える