ファイルが存在するなら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) すると、ターゲットのファイルが存在していなくもてエラーにならずにビルドできる

参考


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2021-06-12 (土) 02:28:50