ファイルが存在するならCOPYする
問題. 存在しないファイルをCOPYしようとするとエラーになる
$ vi Dcokerfile # (1)
FROM alpine
WORKDIR /app
COPY foo.txt ./
CMD echo Hello
$ ls # (2)
Dockerfile
$ docker build -t hello . # (3)
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM alpine
---> 6dbb9cc54074
Step 2/4 : WORKDIR /app
---> Running in d67de8d4700d
Removing intermediate container d67de8d4700d
---> 21bb45c909bc
Step 3/4 : COPY foo.txt ./
COPY failed: stat /var/lib/docker/tmp/docker-builder950502179/foo.txt: no such file or directory
- (1) Dockerfileの中で COPY foo.txt ./ を行っているが、
- (2) ホスト上にはfoo.txtが存在していない(Dockefileがあるだけ)
- (3) この状態で docker build を行うとエラーになる
解決方法. ダミーファイルを作って、ターゲットのファイルはワイルドカードで指定する
$ touch DUMMY.txt # (1)
$ vi Dockerfile # (2)
FROM alpine
WORKDIR /app
COPY DUMMY.txt *foo.txt ./
CMD echo Hello
$ docker build -t hello . # (3)
Sending build context to Docker daemon 2.56kB
Step 1/4 : FROM alpine
---> 6dbb9cc54074
Step 2/4 : WORKDIR /app
---> Using cache
---> 21bb45c909bc
Step 3/4 : COPY DUMMY.txt *foo.txt ./
---> 1501eff5e469
Step 4/4 : CMD echo Hello
---> Running in 805d75bdfcce
Removing intermediate container 805d75bdfcce
---> b022f0347d30
Successfully built b022f0347d30
Successfully tagged hello:latest
- (1) ダミーファイルを用意する。ファイル名や中身は何でもいい
- (2) COPY DUMMY.txt *foo.txt ./ のようにダミーファイルと一緒にターゲットのファイルをワイルドカードで指定してCOPYする
- (3) すると、ターゲットのファイルが存在していなくもてエラーにならずにビルドできる
参考