Docker コンテナからホストにファイルをコピーする
-
docker cp
を使用して、Docker コンテナからホストにファイルをコピーする - Docker マウントを使用して Docker コンテナからホストにファイルをコピーする
-
COPY
を使用して、Docker コンテナからホストにファイルをコピーする
Docker 1.8 より前は、コンテナーからホストにファイルをコピーすることしかできませんでした。ただし、コンテナの人気が高まるにつれ、コンテナとの間でファイルをコピーする必要が生じています。
Docker コンテナからファイルをコピーする一般的な理由の 1つは、ログファイルをチームメンバーと共有することです。ただし、/dev
、/proc
、/sys
、tmpfs
の下のリソースなどの機密情報をコピーすることは許可されていません。
この記事では、DockerFile、docker cp
コマンドを使用して Docker コンテナーからファイルをコピーし、ディレクトリをボリュームとしてホストマシンにマウントする方法について説明します。
これには、Docker と Docker コンテナを正しくインストールして構成する必要があります。これは、Linux 環境と WSL 環境の両方で機能します。
docker cp
を使用して、Docker コンテナからホストにファイルをコピーする
docker cp
コマンドは、ファイルやディレクトリをホストマシンから Docker コンテナにコピーするために使用できる最も簡単な方法の 1つです。現時点では、Ubuntu 20.4.5 と最新バージョンの Docker である 19.03 を使用します。
構文:
$ docker cp [OPTIONS] CONTAINER: SRC_PATH DEST_PATH|-
ここで:
SRC_PATH
は、コピーするファイルがホスト上にあるソースパスを指定します。DEST_PATH
は、ファイルをコンテナに保存するための宛先パスです。
このコマンドを使用すると、パラメーターSRC_PATH
と DEST_PATH
を交換することにより、コンテナーとの間でファイルをコピーできます。このコマンドの利点の 1つは、実行中または停止中のコンテナーとの間でファイルとディレクトリーの両方をコピーできることです。
docker cp
コマンドは Unix cp -a
に似ています。したがって、ディレクトリも再帰的にコピーすることを意味します。さらに、このコマンドは、コンテナへのすべてのパスがルートディレクトリからの相対パスであることも前提としています。
まず、ターゲットコンテナを作成します。したがって、イメージも必要です。Docker レジストリで利用可能な公式の Ubuntu イメージを使用します。
$ docker pull ubuntu
次に、デタッチモードとインタラクティブモードで Docker コンテナを作成します。これにより、コンテナをバックグラウンドで実行できます。
$ docker run -it -d ubuntu
e10b4a7bbc59131d30492a87dd70b8ea74fa686ed5036ec918b6596fc83efe2b
exec
コマンドを使用して、コマンド docker exec
と -it
フラグを使用してインタラクティブ SSH セッションを実行します。これにより、コンテナ内でインタラクティブにコマンドを実行できるようになります。
簡単なテキストファイルを作成するには、/usr/share
フォルダーに移動します。
まず、それぞれのコンテナ ID を使用してコンテナに入力します。
$ docker exec -it e10b4a7bbc59 /bin/bash
root@e10b4a7bbc59:/#
コンテナ内のフォルダ/usr/share/
に移動して、テキストファイルを作成します。
$ docker exec -it e10b4a7bbc59 /bin/bash
root@e10b4a7bbc59:/# cd usr
root@e10b4a7bbc59:/usr# cd share
root@e10b4a7bbc59:/usr/share#
touch
コマンドを使用して、new_file.txt
という名前のファイルを作成します。このファイルをこのコンテナからホストにまもなくコピーします。
したがって、ファイルをホストにコピーするときにこの場所を使用するため、ファイルが保存されているディレクトリに注意することをお勧めします。
root@e10b4a7bbc59:/usr/share# touch new_file.txt
ファイルが作成されたことを確認するには、以下に示すように、ls
コマンドを実行して、このディレクトリ内のすべてのファイルを一覧表示します。
root@e10b4a7bbc59:/usr/share# ls
adduser bash-completion debianutils dpkg keyrings man pam polkit-1
apport bug dict gcc libc-bin menu pam-configs sensible-utils
base-files common-licenses doc gdb lintian misc perl5 tabset
base-passwd debconf doc-base info locale new_file.txt pixmaps terminfo
コンテナ内にファイルが正常に作成されたので、このファイルをこのコンテナからホストにコピーします。exit
コマンドを使用して、コンテナからメインシェルに終了します。
ターミナルで docker cp
コマンドを実行し、new_file.txt
をホストマシンのディレクトリにコピーします。ただし、最初に 3つの重要な点に注意する必要があります。
- コンテナ ID;
- コンテナ内のターゲットファイルの場所。
- ファイルをコピーするホストマシンのターゲットディレクトリ。
$ docker cp e10b4a7bbc59:/usr/share/new_file.txt ./new_file.txt
そのコマンドを実行することにより、new._file.txt
をホストマシンに正常にコピーしました。その特定のフォルダで ls
コマンドを実行することで、これを確認できます。
isaac@DESKTOP-HV44HT6:~/isaac$ ls
adduser bash-completion debianutils dpkg keyrings man `new_file.txt` pixmaps terminfo
apport bug dict gcc libc-bin menu pam polkit-1
base-files common-licenses doc gdb lintian misc pam-configs sensible-utils
base-passwd debconf doc-base info locale my-app perl5 tabset
Docker マウントを使用して Docker コンテナからホストにファイルをコピーする
Docker マウントを使用して、Docker コンテナからホストにファイルをコピーすることもできます。
バインドマウントは、Docker コンテナをホストシステムのディレクトリにマウントすることでデータを永続化できる最も初期のソリューションの 1つです。
バインドマウントを使用すると、ターゲットディレクトリの絶対ファイルパスを参照して、正確なディレクトリを参照できます。コンテナからホストにファイルをコピーするだけでなく、ホストシステムのディレクトリに依存するサービスを作成することもできます。
Docker マウントを作成するには、Docker コンテナーを作成するときに -v
または --mount
フラグを使用できます。このフラグに加えて、Docker コンテナのディレクトリにマップするホストマシンのディレクトリも指定します。
Docker コンテナ内に複数のマウントを作成できるため、この方法がよく使用されます。複数のコンテナからファイルを転送するためのディレクトリを作成することもできます。
ディレクトリを Docker コンテナにマウントするには、次のフィールドを指定する必要があります。これらのフィールドは、常にコロンで区切って正しい順序にする必要があります。これらには以下が含まれます:
- マウントするホストマシン上のディレクトリへのパス。
- このディレクトリをマウントする必要があるコンテナ内のディレクトリへのパス。
ro
などの他のオプションオプションは、読み取り専用モードを指定します。
構文:
docker run -t -i -v <host_dir>:<container_dir
以下の例では、Ruby の公式イメージを使用してコンテナを作成し、ローカルディレクトリをコンテナ上のディレクトリにマウントしています。これが完了すると、コンテナからローカルディレクトリに、またはその逆にファイルを簡単にコピーできます。
$ docker run -it -v $HOME/Desktop/new_container:/new_container --name new_container ruby bash
root@7a00af9d4d96:/#
Docker コンテナとホストディレクトリの間でファイルを簡単にコピーできます。また、ホストディレクトリに作成されたファイルは、ホストにマウントされた Docker コンテナディレクトリで自動的に利用可能になることに注意してください。
COPY
を使用して、Docker コンテナからホストにファイルをコピーする
Docker ファイルを使用して Docker イメージを作成する場合、COPY
コマンドを使用して、Docker ホストとコンテナーの間でファイルをコピーすることもできます。
構文:
COPY <SRC> <DEST>
以下の DockerFile では、ソースディレクトリとして ./app.py
を指定し、ターゲットディレクトリとして/var/www/app.py
を指定しました。
# base image
FROM python
# Set your working directory
WORKDIR /var/www/
# Copy the necessary filesls
COPY ./app.py /var/www/app.py
COPY ./requirements.txt /var/www/requirements.txt
# Install the necessary packages
RUN pip install -r /var/www/requirements.txt
# Run the app
ENTRYPOINT ["echo", "Hello, Developer"]
この DockerFile は、コンソールにメッセージを出力する単純な Flask アプリケーションのイメージを作成します。
Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.
LinkedIn