web-dev-qa-db-ja.com

DockerのCOPY / ADD命令を使用して単一のファイルを画像にコピーする方法

単一のファイルをビルドコンテキストのルートから、Dockerイメージで新しく作成されたディレクトリにコピーしようとしています。

私が使用しているDockerfileは次のとおりです。

FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test.txt /usr/src/app

Test.txtファイルは、次のような単純なASCIIテキストファイルです。

$ cat test.txt 
This is a test

ただし、このイメージをビルドすると、宛先パスがディレクトリではないことを示すイメージが表示されます。

$ docker build .
Sending build context to Docker daemon 4.608 kB
Sending build context to Docker daemon 
Step 0 : FROM debian:latest
 ---> 9a61b6b1315e
Step 1 : RUN mkdir -p /usr/src/app
 ---> Using cache
 ---> 86bd44a8776e
Step 2 : WORKDIR /usr/src/app
 ---> Using cache
 ---> ed6771adc681
Step 3 : ADD test.txt /usr/src/app
stat /var/lib/docker/devicemapper/mnt/ee5b9b7029f2adf27d332cbb0d98d6ad9927629a7569fd2d9574cb767b23547b/rootfs/usr/src/app/test.txt: not a directory

Dockerバージョン、ベースイメージ、およびdockerがインストールされたディストリビューションの複数の組み合わせを使用してみました。 COPYの代わりにADDを使用してみましたが、結果は同じです。

私は現在、CentOS 7で次のバージョンのdockerをインストールしてこれを試しています:

Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/AMD64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/AMD64

私が気づいたのは、ディレクトリはコピーできますが、ファイルはコピーできないということです。たとえば、ビルドコンテキストルートに「test」ディレクトリを作成し、test.txtをテストディレクトリ内に配置すると、ディレクトリを正常にコピーできます。

FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test /usr/src/app

上記のDockerfileでは、。/ test.txtではなく./testディレクトリ全体をコピーします。このビルドは正常に完了しました。

Docker documentation には、COPY命令の次の使用例があります。これは、私がやろうとしていることに似ています。

COPY hom?.txt /mydir/

誰かが私が間違っていることを指摘できますか?単一のファイルをコピーするにはどうすればよいですか?

22
Andrew Butler

Dockerfileのドキュメントに記載されているとおり:

  • _<src>_が他の種類のファイルである場合、そのメタデータとともに個別にコピーされます。この場合、_<dest>_が末尾のスラッシュ_/_で終わる場合、それはディレクトリと見なされ、_<src>_の内容は<dest>/base(<src>)に書き込まれます。

  • _<dest>_の末尾がスラッシュでない場合、通常のファイルと見なされ、_<src>_の内容は_<dest>_に書き込まれます。

したがって、末尾に_COPY test.txt /usr/src/app/_を付けて_/_を記述する必要があります。

28
jwodder

私にとっては、Dockerfileの代わりにdocker-compose.ymlに基づいてパスを追加していました。

ファイル構造

.
..
/docker-compose.yml
/docker/
/docker/php/
/docker/php/Dockerfile
/docker/php/my_file

/docker-compose up --buildを実行していました。

COPY docker/php/my_file /some/locationの代わりにCOPY my_file /some/locationを実行する必要がありました

0
Steve Tauber