読者です 読者をやめる 読者になる 読者になる

メンチカツには醤油でしょ!!

ITエンジニア徒然 (AWS/Java/JavaScript/Google Spreadsheets/Jenkins/Mac/外部コミュニティ・勉強会レポ)

docker-compose.ymlで指定したDockerfile内のADD/COPYが効かない

仕様???

Dockerfileに書いてあるADD/COPYコマンド(及び他のコマンド)がdocker-compose.ymlで指定された場合に作動しないのです。
RUNのみ有効、というのが余計にややこしい。

ファイルをコンテナ内にコピーしたい場合、docker-compose.ymlのvolumesを使わないとできない場合があります。
(volumes使えばできるので判ってれば問題にはならなそうですが)

github.com

(追記) バージョンが違うと挙動が違う

できなかった (Docker for Windows)

> docker -v
Docker version 17.03.1-ce, build c6d412e
> docker-compose -v
docker-compose version 1.11.2, build f963d76f

できなかった (Docker for Mac)

$ docker -v
Docker version 1.12.6, build 78d1802
$ docker-compose -v
docker-compose version 1.9.0, build 2585387

できた (Docker on Ubuntu on Hyper-V)

$ sudo docker -v
Docker version 17.03.1-ce, build c6d412e
$ sudo docker-compose -v
docker-compose version: 1.3.2
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013

(追記2) 公式ドキュメントでは出来そうな記載が...

You can add your code to the image using COPY or ADD directive in a Dockerfile.

You should use a volume if you want to make changes to your code and see them reflected immediately,

There may be cases where you’ll want to use both. You can have the image include the code using a COPY, and use a volume in your Compose file to include the code from the host during development. The volume overrides the directory contents of the image.

docs.docker.com

しかしThere may be cases where you’ll want to use both.が気になる…

ファイルの構成例 (一部)

/docker-compose.yml
/apache2.4/Dockerfile
/apache2.4/htdocs/index.html
/apache2.4/conf/httpd.conf

というような構成で、
Apacheのhtdocsディレクトリはディレクトリまるごと同期しても構わないのでvolumes指定
・confディレクトリ配下はいくつかファイルがあって上書きしたいのがhttpd.confだけなのでADDかCOPYしたい
みたいな場合に、docker-composeだとADD/COPYができないってことなんです。

docker-compose.yml (一部)

apache:
    build: ./apache2.4/
    volumes:
        - ./apache2.4/htdocs:/usr/local/apache2/htdocs
    links:
        - tomcat:tomcat

Dockerfile

FROM httpd:2.4.25

RUN apt-get update && apt-get install -y \
  nano

ADD ./conf/httpd.conf /usr/local/apache2/conf/httpd.conf

結局どうしたか

コンテナ内のconf配下のファイルを全部docker cpで拾ってきて配置しました。
と、思いきや、volumesにはファイルも指定できるんでしたね。

docker-compose.yml (一部)

apache:
    build: ./apache2.4/
    volumes:
        - ./apache2.4/htdocs:/usr/local/apache2/htdocs
        - ./apache2.4/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
links:
        - tomcat:tomcat

Dockerfile

FROM httpd:2.4.25

RUN apt-get update && apt-get install -y \
  nano

できた!

github.com