Edited at

docker-composeでADDやCOPYをする際に注意すること


概要

docker-composeを利用してADDやCOPYを行いたいときに気をつけることをメモします。

まず、docker-composeでホスト側のファイルをコンテナにマウントする際はDockerfileを利用します。

しかしながら、その際には以下の点に気を付けなければいけません。

これらを踏まえて、AddやCopyをする流れを説明しようと思います。

ここでの例は以下のディレクトリ構成で説明を行います。

$ tree

.
├── docker-compose.yml
├── test
| └── Dockerfile
└── hogehoge


ホストの絶対パスを指定してしまうとダメ

これは先のブログでも紹介をされているので、簡単な説明にとどめますが、絶対パスを指定すると以下のようなエラーメッセージが出てきます。

ERROR: Service 'test' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builderXXXXX/hogehoge: no such file or directory

そのため、以下のように相対パスを指定してみます。


※注意※これは間違っている例です

COPY ../hogehoge /tmp


しかし、これでも問題が続きます。


現在のコンテキストよりも外部のファイルにアクセスできない

しかし、このようにすると、以下のメッセージが出てきます。

ERROR: Service 'test' failed to build: COPY failed: Forbidden path outside the build context: ../hogehoge

これは、現在のビルド対象の場所よりも外側のファイルを参照しようとすると発生します。この例では、../hogehogeを参照していることが原因です。そのため、ビルドコンテキストを変更する必要があるので、以下のようにdocker-compose.ymlを修正します。


docker-compose.yml

build:

context: .
dockerfile: ./php/Dockerfile

このように指定をすると、ビルドコンテキストは、phpディレクトリではなく、docker-compose.ymlの階層が現在のビルドコンテキストになります。そして、ビルドコンテキストがdocker-compose.ymlの階層になったため、コピーしたいファイルhogehogeの相対パスも変わりますので、dockerfileを修正します。


これでOK

COPY ./hogehoge /tmp


これで、コンテキストにあったファイルのADDとCOPYをすることができます。


参考