#author("2021-06-12T02:28:30+09:00","default:ryuichi","ryuichi")
#author("2021-06-12T02:28:50+09:00","default:ryuichi","ryuichi")
* ファイルが存在するならCOPYする [#i2853524]

** 問題. 存在しないファイルをCOPYしようとするとエラーになる [#d20cb2e4]

#shell(){{
$ 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''' を行うとエラーになる

** 解決方法. ダミーファイルを作って、ターゲットのファイルはワイルドカードで指定する [#v6acbd27]

#shell(){{
$ touch DUMMY.txt                   # (1)
$ touch DUMMY.txt                  # (1)

$ vi Dockerfile                    # (2)
  FROM alpine
  WORKDIR /app
  COPY DUMMY.txt *foo.txt ./
  CMD echo Hello

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

** 参考 [#x19bf7fe]

- https://stackoverflow.com/questions/31528384/conditional-copy-add-in-dockerfile

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