2096

使用している Docker コンテナーのバックアップと復元のソリューションを構築しようとしています。

作成した Docker ベース イメージがubuntu:baseあり、Docker ファイルを使用して毎回再構築してファイルを追加する必要はありません。

ubuntu:baseホスト マシンから実行し、 Docker イメージを使用して新しいコンテナーを作成し、ファイルをそのコンテナーにコピーするスクリプトを作成したいと考えています。

ホストからコンテナーにファイルをコピーするにはどうすればよいですか?

4

49 に答える 49

46
  1. 新しい dockerfile を作成し、既存のイメージをベースとして使用します。

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. 次にコンテナをビルドします。

    docker build .
    
于 2015-07-08T20:47:43.953 に答える
40

解決策を以下に示します。

Docker シェルから、

root@123abc:/root#  <-- get the container ID

ホストから

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root

ファイルは、コンテナがファイルシステム上にある場所に直接コピーされます。

于 2014-06-23T17:01:33.703 に答える
33

実行中のコンテナーにファイルをコピーする別のソリューションは、tar を使用することです。

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x

foo.shファイルを/tmpコンテナーにコピーします。

編集: Maartenのコメントの-fおかげで、reduntant を削除します。

于 2015-04-21T13:50:00.283 に答える
24

ホストから実行中のコンテナにファイルをコピーするには

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

Erik の回答と Mikl および z0r のコメントに基づいています。

于 2015-07-01T09:09:49.223 に答える
22

これは、タイトルのこの質問で提起された「ホストから Docker コンテナーにファイルをコピーする」という質問に対する直接的な回答です。

試してみてくださいdocker cp。それを行う最も簡単な方法であり、私の Mac でも機能します。使用法:

docker cp /root/some-file.txt some-docker-container:/root

some-file.txtこれにより、ホスト マシンのディレクトリにあるファイルが、ディレクトリに指定さ/rootれた Docker コンテナーにコピーされます。これはセキュア コピーの構文に非常に近いものです。また、前の投稿で示したように、逆に使用することもできます。つまり、コンテナからホストにファイルもコピーします。some-docker-container/root

この投稿をダウンリンクする前に、 と入力してくださいdocker cp --help。ドキュメントを読むことは非常に役立ちます。

その方法が気に入らず、既に作成されて実行中のコンテナーにデータ ボリュームが必要な場合は、現在、再作成が唯一の選択肢です。ボリュームを既存の Docker コンテナーに追加するにはどうすればよいですか?も参照してください。.

于 2015-09-23T13:18:23.743 に答える
16

Docker 1.8 では、docker cpホストからコンテナーにファイルをコピーできます。Docker ブログの記事「Announce Docker 1.8: Content Trust, Toolbox, and Updates to Registry and Orchestration 」を参照してください。

于 2015-08-12T17:22:12.663 に答える
15

コンテナーとローカル ファイル システムの間でファイル/フォルダーをコピーするには、次のコマンドを入力します。

docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}

例えば、

docker cp /home/foo container-id:/home/dir

コンテナ ID を取得するには、次のコマンドを入力します。

docker ps

上記の内容はdocker.comからの引用です。

于 2016-12-01T18:56:04.970 に答える
9

コンテナーが既に実行されていると仮定して、次のコマンドを入力します。

# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"

共有ディレクトリを使用してファイルを共有するには、次のコマンドを入力してコンテナーを実行します。

# docker run -v /path/to/host/dir:/path/to/container/dir ...

注: コンテナーのユーザーがホストのユーザーと同じではないため、権限に関する問題が発生する可能性があります。

于 2014-11-12T07:55:25.270 に答える
7

Docker 環境では、すべてのコンテナーは次のディレクトリにあります。

/var/lib/docker/aufs/required-docker-id/

ソース ディレクトリ/ファイルをコンテナーの任意の部分にコピーするには、次のコマンドを入力します。

sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/

于 2015-05-27T18:15:50.257 に答える
5

を使用して、ローカル マシンの IP アドレスをトレースできます。

ifconfig

次に、Docker コンテナーに入り、次のように入力します。

scp user_name@ip_address:/path_to_the_file destination

いずれにしても、SSH クライアントとサーバーがインストールされていない場合は、次を使用してインストールしてください。

sudo apt-get install openssh-server
于 2015-07-31T13:36:15.560 に答える
5

tarディレクトリ内のすべてをdocker cpコピーするのに適した組み合わせです。

データ ボリューム コンテナーを作成する

docker create --name dvc --volume /path/on/container cirros

ディレクトリ階層を保持するには

tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container

作品をチェック

docker run --rm --volumes-from dvc cirros ls -al /path/on/container
于 2016-05-09T18:39:50.827 に答える
5
docker cp SRC_PATH CONTAINER_ID:DEST_PATH

たとえば、ファイル xxxx/download/jenkins を tomcat にコピーしたい

コンテナTomcatのIDを取得し始めます

docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
63686740b488        tomcat              "catalina.sh run"   12 seconds ago      Up 11 seconds       0.0.0.0:8080->8080/tcp   peaceful_babbage

docker cp xxxx/download/jenkins.war  63686740b488:usr/local/tomcat/webapps/
于 2020-01-03T17:08:24.007 に答える
4

これは、Tomcat コンテナーの実行中に単一のファイルをコピーするための onliner です。

docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat

これにより、war ファイルが webapps ディレクトリにコピーされ、すぐにアプリが実行されます。

于 2017-10-24T12:53:05.357 に答える
3

良い答えがありますが、具体的すぎます。docker ps興味のあるコンテナIDを取得する良い方法であることがわかりました。次に実行します

mount | grep <id>

ボリュームがマウントされている場所を確認します。それは

/var/lib/docker/devicemapper/mnt/<id>/rootfs/

私にとっては、OS と構成によって異なるパスになる可能性があります。ファイルをそのパスにコピーするだけです。

を使用する-vことは必ずしも実用的ではありません。

于 2014-11-12T12:14:25.720 に答える
3

私のお気に入りの方法:

容器:

CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')

file.txt

mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txt

また

mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt
于 2015-01-16T02:59:07.277 に答える
3

私が見つけたコンテナにファイルをコピーする最良の方法は-v、docker run コマンドのオプションを使用してホストにディレクトリをマウントすることです。

于 2014-07-31T21:08:23.427 に答える
3

docker を使用して VLC をコンパイルし始めたところです。コンテナとの間でファイルをコピーするためにできることは次のとおりです。

su -
cd /var/lib/docker
ls -palR > /home/user/dockerfilelist.txt

その txt でおなじみのファイルを検索すると、そのフォルダーが作成されます。ルートとして cd を実行すると、出来上がりです。必要なすべてをコピーします。

「merged」を含むパスがあるかもしれませんが、「diff」を含むパスが必要だと思います。

また、コンテナを終了して中断したところに戻りたい場合は、次のようにします。

docker ps -a
docker start -i containerid

次のようなコマンドで何も名前を付けなかった場合に便利だと思います

docker run -it registry.videolan.org:5000/vlc-debian-win64 /bin/bash

確かにハッカーの方法ですが、そうです!

于 2019-04-27T02:42:05.990 に答える
1

ここで指定されているように、デーモンを使用してイメージをマウントして実行します。

docker run -d -v /blah1/blah2:/mnt --name mntcontainer ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

それから

docker exec -it mntcontainer bash
于 2016-01-31T23:42:44.427 に答える
1

Dockerfile でボリュームとして定義されたディレクトリがない場合、/var/lib/docker/aufs/mnt// が機能します。ただし、コンテナ内のディレクトリがボリュームとして定義されている場合があります。この場合、aufs/mnt/*/ 以下の内容とコンテナから見える内容が異なります。

docker inspect を使用してコンテナーを検査し、ボリュームを探す必要があります。/var/lib/docker/vfs/dir/fe940b... (ID) のような記述があります。aufs/mnt/* の下ではなく、ここにファイルを追加/変更する必要があります。

紛らわしいのは、ファイルが /aufs/mnt/* の下にも表示されることです。ここでの変更がうまくいかなかった理由について、かなりの時間をかけて頭を悩ませました。これが誰かに役立つことを願っています。

于 2014-09-28T10:40:00.003 に答える
1

ホスト マシンからコンテナーが配置されている場所からファイルを直接コピーするだけです。

例えば:

最初にコンテナ ID を調べます。

root@**3aed62678d54**:/home#

次に、ホストから、ファイルがホーム ディレクトリにあるとします。

root@saasdock:/home/dnepangue# cp cheering_nasa.gif /var/lib/docker/aufs/mnt/**3aed62678d54**a5df47a4a00a58bb0312009c2902f8a37498a1427052e8ac454b/home/

コンテナに戻ります...

root@**3aed62678d54**:/home# ls cheering_nasa.gif
于 2014-07-09T06:57:57.270 に答える
1

別の回避策は、古き良き を使用することscpです。これは、ディレクトリをコピーする必要がある場合に役立ちます。

ホストから次を実行します。

scp FILE_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp foo.txt 172.17.0.2:foo.txt

ディレクトリをコピーする必要がある場合:

scp -r DIR_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp -r directory 172.17.0.2:directory

コンテナーにも必ず ssh をインストールしてください。

apt-get install openssh-server
于 2016-08-29T11:34:13.330 に答える
1

Windows をホストとして使用している場合、WinSCPを使用して Docker に接続し、GUI を介してファイルを転送できます。

Linux の場合、scpコマンドはターミナル経由でも機能します。

于 2017-01-28T12:56:10.953 に答える
0

私は通常、このコマンドを使用してpythonサーバーを作成します

python -m SimpleHTTPServer

特定のディレクトリで wget を使用して、docker の目的の場所にファイルを転送します。それが最善の方法ではないことはわかっていますが、はるかに簡単だと思います。

于 2017-12-27T11:42:44.290 に答える
0

コンテナの外部から次のコマンドを使用して、ホスト マシンからコンテナにファイルをコピーできました。

 487b00c94dd4 = Container ID
D:\demo\demo.tar= Source Url
/myfolder= Container Url

 
docker cp "D:\demo\demo.tar" 487b00c94dd4:/myfolder
于 2021-11-17T11:23:56.973 に答える
0

試してみてくださいdocker cp

使用法:

docker cp CONTAINER:PATH HOSTPATH

PATHファイル/フォルダを からにコピーしますHOSTPATH

于 2015-01-13T20:01:09.370 に答える