CUBE SUGAR CONTAINER

技術系のこと書きます。

Docker のホストとコンテナ間でファイルをやり取りする

Docker ホストとコンテナの間でファイルをやり取りするのって以前はかなり面倒だったと思う。 そんな記憶も今は昔、専用のコマンドが用意されてだいぶ簡単になっているようだ。

docker cp | Docker Documentation

使った環境は次の通り。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G1212
$ docker version
Client:
 Version:   18.01.0-ce
 API version:   1.35
 Go version:    go1.9.2
 Git commit:    03596f5
 Built: unknown-buildtime
 OS/Arch:   darwin/amd64
 Experimental:  false
 Orchestrator:  swarm

Server:
 Engine:
  Version:  18.01.0-ce
  API version:  1.35 (minimum version 1.12)
  Go version:   go1.9.2
  Git commit:   03596f5
  Built:    Wed Jan 10 20:13:12 2018
  OS/Arch:  linux/amd64
  Experimental: false

下準備

まずはファイルをやり取りするための Docker コンテナを起動しておく。

$ docker run -it alpine /bin/sh

Alpine Linux の Docker コンテナを起動してシェルに入った。

/ # uname -a
Linux 09a735dae425 4.4.111-boot2docker #1 SMP Thu Jan 11 16:25:31 UTC 2018 x86_64 Linux

起動したコンテナの ID を確認しておく。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
09a735dae425        alpine              "/bin/sh"           12 seconds ago      Up 14 seconds                           stoic_mclean

ホストからコンテナにファイルをコピーする

まずは Docker ホストからコンテナにファイルをコピーする方から。

Docker ホスト側で、まずはコピーするファイルを用意する

$ echo "Hello, World" > greeting.txt

あとは docker cp コマンドを使ってファイルを転送するだけ。 コマンドのパラメータは scp コマンドのイメージに近い。 送信元を第一引数に、送信先を第二引数に指定する。 送信先にはコンテナ ID (もしくは名前) と、コロンで区切って転送先のパスを指定する。

$ docker cp greeting.txt 09a735dae425:/tmp

docker exec コマンドを使ってコンテナ上で cat コマンドを実行してファイルの状態を確認しよう。

$ docker exec 09a735dae425 cat /tmp/greeting.txt
Hello, World

ちゃんとファイルが送られたことが分かる。

コンテナからホストにファイルをコピーする

続いてはコンテナからホストにファイルをコピーするパターン。 この場合も、最終的には先ほどと同じように docker cp コマンドを使う。

まずはコンテナの中でコピーするファイルを用意しよう。 分かりやすいように、先ほど送り込まれたファイルを編集して使う。

/ # echo "Hello, Docker" > /tmp/greeting.txt

あとは Docker ホスト側で docker cp コマンドを使ってコンテナ上のファイルをホストに転送してくる。 今回は送信元となる第一引数の方にコンテナとファイルの絶対パスを指定する。

$ docker cp 09a735dae425:/tmp/greeting.txt .

コマンドを実行すると、ちゃんとコンテナにあったファイルが手元にコピーされたことが分かる。

$ cat greeting.txt 
Hello, Docker

いじょう。

めでたしめでたし。