概要
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
を修正します。
build:
context: .
dockerfile: ./php/Dockerfile
このように指定をすると、ビルドコンテキストは、phpディレクトリではなく、docker-compose.ymlの階層が現在のビルドコンテキストになります。そして、ビルドコンテキストがdocker-compose.ymlの階層になったため、コピーしたいファイルhogehoge
の相対パスも変わりますので、dockerfileを修正します。
COPY ./hogehoge /tmp
これで、コンテキストにあったファイルのADDとCOPYをすることができます。