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

Isaac Tony 2023年1月30日
  1. docker cp を使用して、Docker コンテナからホストにファイルをコピーする
  2. Docker マウントを使用して Docker コンテナからホストにファイルをコピーする
  3. COPY を使用して、Docker コンテナからホストにファイルをコピーする
Docker コンテナからホストにファイルをコピーする

Docker 1.8 より前は、コンテナーからホストにファイルをコピーすることしかできませんでした。ただし、コンテナの人気が高まるにつれ、コンテナとの間でファイルをコピーする必要が生じています。

Docker コンテナからファイルをコピーする一般的な理由の 1つは、ログファイルをチームメンバーと共有することです。ただし、/dev/proc/systmpfs の下のリソースなどの機密情報をコピーすることは許可されていません。

この記事では、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_PATHDEST_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
Isaac Tony avatar Isaac Tony avatar

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

関連記事 - Docker Container