私が使用しているDockerコンテナーのバックアップおよび復元ソリューションを構築しようとしています。
私が作成したDockerベースイメージがubuntu:base
あり、ファイルを追加するためにDockerファイルで毎回再構築する必要はありません。
ホストマシンから実行され、ubuntu:base
Dockerイメージを使用して新しいコンテナーを作成し、そのコンテナーにファイルをコピーするスクリプトを作成します。
ホストからコンテナにファイルをコピーするにはどうすればよいですか?
私が使用しているDockerコンテナーのバックアップおよび復元ソリューションを構築しようとしています。
私が作成したDockerベースイメージがubuntu:base
あり、ファイルを追加するためにDockerファイルで毎回再構築する必要はありません。
ホストマシンから実行され、ubuntu:base
Dockerイメージを使用して新しいコンテナーを作成し、そのコンテナーにファイルをコピーするスクリプトを作成します。
ホストからコンテナにファイルをコピーするにはどうすればよいですか?
回答:
cp
このコマンドは、ファイルをコピーするために使用することができます。
次のように、1つの特定のファイルをコンテナにコピーできます。
docker cp foo.txt mycontainer:/foo.txt
次のように、1つの特定のファイルをコンテナからコピーできます。
docker cp mycontainer:/foo.txt foo.txt
強調のため、mycontainer
はイメージ ID ではなく、コンテナ IDです。
フォルダに含まれている複数のファイルは、次を使用src
してtarget
フォルダにコピーできます。
docker cp src/. mycontainer:/target
docker cp mycontainer:/src/. target
リファレンス:Docker CLI docscp
1.8より前のバージョンのDockerでは、コンテナーからホストにファイルをコピーすることのみが可能でした。ホストからコンテナへではありません。
docker cp
してコンテナからホストにコピーすることはうまくいきますが、それを使用してファイルをホストからコンテナにコピーしても効果はありません...誰かが理由を知っていますか?dockerバージョン:Dockerバージョン1.10.3、ビルドcb079f6-unsupported
コンテナ名または短いコンテナIDを取得します。
$ docker ps
完全なコンテナIDを取得:
$ docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID-or-CONTAINER_NAME
ファイルをコピー:
$ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8e703d7e303 solidleon/ssh:latest /usr/sbin/sshd -D cranky_pare
$ docker inspect -f '{{.Id}}' cranky_pare
または
$ docker inspect -f '{{.Id}}' d8e703d7e303
d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5
$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt
aufs
たdevicemapper
。(実行中に)コンテナーのマウントパスを確認する最も簡単な方法は、コマンドを実行することmount
です。
/var/lib/docker/aufs/diff/<id>/
/var/lib
私のためにあります。find / -name docker
役に立たなかった。
最もクリーンな方法は、コンテナの起動時にコンテナにホストディレクトリをマウントすることです。
{host} docker run -v /path/to/hostdir:/mnt --name my_container my_image
{host} docker exec -it my_container bash
{container} cp /mnt/sourcefile /path/to/destfile
docker run -d -p -v /host/path:/mnt --name container_name image_name
docker cp
一方向の操作であることに驚いています。
以下はかなり醜い方法ですが、うまくいきます。
docker run -i ubuntu /bin/bash -c 'cat > file' < file
docker commit `docker ps -l -q` ubuntu-with-file
。それ以外の場合、変更は失われます(代わりに任意の名前を使用してくださいubuntu-with-file
)
docker exec
実行中のコンテナで動作するように機能:docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
docker exec -i ...
代わりにすべきだと思い-it
ます。
tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory'
実行中のコンテナーでこれを行う必要がある場合は、docker exec(1.3で追加)を使用できます。
まず、コンテナの名前またはIDを見つけます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9b7400ddd8f ubuntu:latest "/bin/bash" 2 seconds ago Up 2 seconds elated_hodgkin
上記の例では、b9b7400ddd8f
またはを使用できます。elated_hodgkin
。
/tmp/somefiles
ホスト上のすべてを/var/www
コンテナにコピーする場合:
$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www
次に/bin/bash
、コンテナーで実行して、それが機能したことを確認します。
$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1 file2
新しいdockerfileを作成し、既存のイメージをベースとして使用します。
FROM myName/myImage:latest
ADD myFile.py bin/myFile.py
次に、コンテナをビルドします。
docker build .
解決策は以下のとおりです、
root@123abc:/root# <-- get the container ID
cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root
ファイルは、コンテナーがファイルシステム上にある場所に直接コピーされます。
通常、3つのタイプがあります。
コンテナからホストへ
docker cp container_id:./bar/foo.txt .
ホストからコンテナへ
docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
コンテナーからコンテナーへの1と2の混合
docker cp container_id1:./bar/foo.txt .
docker exec -i container_id2 sh -c 'cat > ./bar/foo.txt' < ./foo.txt
実行中のコンテナにファイルをコピーする別の解決策は、tarを使用することです。
tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x
ファイルfoo.sh
をにコピーします/tmp
コンテナに。
編集:Maartenのコメントの-f
おかげで、冗長を削除します。
-f -
は少し冗長ですが、デフォルトの動作はとにかくstdoutに書き込むことです。
Docker 1.8では、docker cp
ホストからコンテナーにファイルをコピーできます。Dockerブログ投稿「Docker 1.8:Content Trust、Toolbox、and Updates to Registry and Orchestration」を参照してください。
docker cp foo.txt mycontainer:/foo.txt
これは、タイトルのこの質問で提起された「ホストからDockerコンテナにファイルをコピーする」という質問に対する直接の回答です。
お試しくださいdocker cp
。それが最も簡単な方法で、私のMacでも機能します。使用法:
docker cp /root/some-file.txt some-docker-container:/root
これにより、ホストマシンのsome-file.txt
ディレクトリ/root
にあるファイルが、ディレクトリに指定some-docker-container
されたDockerコンテナにコピーされます/root
。これは、安全なコピー構文に非常に近いものです。そして、前の投稿で示したように、その逆も可能です。つまり、コンテナからホストにファイルもコピーします。
この投稿をダウンリンクする前に、と入力してくださいdocker cp --help
。ドキュメントを読むことは非常に役立ちます。時には...
その方法が気に入らず、作成済みで実行中のコンテナーにデータボリュームが必要な場合は、今日、再作成が唯一の選択肢です。ボリュームを既存のDockerコンテナーに追加するにはどうすればよいですか?もご覧ください。。
コンテナーとローカルファイルシステム間でファイル/フォルダーをコピーするには、次のコマンドを入力します。
docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}
例えば、
docker cp /home/foo container-id:/home/dir
contianer IDを取得するには、次のコマンドを入力します。
docker ps
上記のコンテンツはdocker.comから取得しています。
コンテナーが既に実行されていると想定して、次のコマンドを入力します。
# 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 ...
注:コンテナーのユーザーはホストのユーザーと同じではないため、権限に関する問題が発生する可能性があります。
docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
cat
いったん終了すると終了しないことに注意してください。それが重要な場合(bashスクリプトをコピーしている場合、bashはスクリプトの実行を拒否します)、そのファイルを保持してlsof | grep yourfilename
いるcat
プロセスを実行して強制終了する必要があります。
kill $(lsof | grep /path/to/file | sed ...)
。私はあなたの助けに感謝します
kill $(docker top CONTAINERNAME | sed -n '/cat$/p' | sed 's/^root[^0-9]\+\([0-9]\+\).*$/\1/')
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
ホストがCentOSまたはFedoraの場合、にはないプロキシがありますが、/var/lib/docker/aufs
以下にあり/proc
ます:
cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root
このコマンドは、IDが「containerid」のコンテナのdata
ディレクトリにすべてのコンテンツをコピーします/
。
/proc
)。また、パスを拡張して、ファイルをルートだけでなく別の場所に置きます。
mycontainer
@ h3nrikの答えが何を意味するのかが私のような誰かに明らかでない場合、それは実際にはコンテナIDです。終了したDockerコンテナーから現在のフォルダーにファイルをコピーするWarpSquare.mp4
に/app/example_scenes/1440p60
は、これを使用しました。
docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .
ここdocker ps -q -l
で、最後に終了したインスタンスのコンテナIDを取得します。場合は、それはあなたがでそれを得ることができる出るコンテナではありませんdocker container ls
かdocker ps
docker ps -a
またはを使用して、終了したコンテナのIDをリストできますdocker container ls -a
。
この質問を見つけた人の多くは、Dockerイメージの作成中にファイルをDockerイメージにコピーする問題を抱えている可能性があります(私はそうしました)。
その場合は、イメージの作成に使用するCOPY
コマンドを使用できますDockerfile
。
次のコマンドを使用して、ローカルマシンのIPアドレスを追跡できます。
ifconfig
次に、Dockerコンテナーに入力して、次のように入力します。
scp user_name@ip_address:/path_to_the_file destination
どの場合でも、SSHクライアントとサーバーがインストールされていない場合は、次のコマンドを使用してインストールします。
sudo apt-get install openssh-server
これは、Tomcatコンテナの実行中に単一のファイルをコピーするためのオンラインです。
docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat
これにより、warファイルがwebappsディレクトリにコピーされ、アプリがすぐに実行されます。
私が見つけたコンテナーにファイルをコピーする最良の方法は-v
、docker runコマンドのオプションを使用してホストにディレクトリをマウントすることです。
良い答えがありますが、具体的すぎます。docker ps
興味のあるコンテナーIDを取得するための良い方法を見つけました。次に、
mount | grep <id>
ボリュームがマウントされている場所を確認します。それは
/var/lib/docker/devicemapper/mnt/<id>/rootfs/
私にとっては、それはOSと構成に応じて異なるパスになる場合があります。次に、ファイルをそのパスにコピーします。
使用すること-v
は必ずしも実用的ではありません。
dockerを使用してVLCをコンパイルし始めました。コンテナーからファイルを前後にコピーするには、次の方法があります。
su -
cd /var/lib/docker
ls -palR > /home/user/dockerfilelist.txt
そのtxtでおなじみのファイルを検索すると、フォルダーが作成され、ルートとしてcdして、出来上がりです!必要なものをすべてコピーします。
「マージ」されたパスがあるかもしれませんが、「diff」が含まれたパスが欲しいと思います。
また、コンテナを終了して、中断したところに戻りたい場合も次のようになります。
docker ps -a
docker start -i containerid
次のようなコマンドで何も名前を付けなかった場合に便利だと思います
docker run -it registry.videolan.org:5000/vlc-debian-win64 /bin/bash
確かにハッカーの方法ですが、それではどうでしょう!
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/
私の好きな方法:
CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')
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
私の意見では、イメージ内のファイルをコピーする必要はありませんが、ファイルにGITまたはSVNを使用して、ローカルフォルダーと同期するボリュームを設定できます。GITリポジトリからコピーしない場合、データがローカルフォルダーに既に存在するかどうかを確認できるコンテナーの実行中にスクリプトを使用します。これにより、イメージが非常に軽量になります。