複数の拡張子を持つファイルをコピーするためのこの構文(それぞれ複数の拡張子を持つファイルをコピーする)は通常のデスクトップ環境でうまく機能します。
$ mkdir /tmp/baz && cd /tmp/baz
$ touch /tmp/file.foo
$ touch /tmp/file.bar
$ cp /tmp/*.{foo,bar} ./
$
しかし、これはdockerfileでは動作しないようです。
# Dockerfile
FROM alpine:3.7 as base
RUN touch /tmp/file.foo
RUN touch /tmp/file.bar
RUN cp /tmp/*.{foo,bar} ./
$ docker build -t tmp:tmp . && docker run -it tmp:tmp
[+] Building 4.0s (7/7) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 149B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:3.7 0.0s
=> CACHED [1/4] FROM docker.io/library/alpine:3.7 0.0s
=> [2/4] RUN touch /tmp/file.foo 1.1s
=> [3/4] RUN touch /tmp/file.bar 1.1s
=> ERROR [4/4] RUN cp /tmp/*.{foo,bar} ./ 1.5s
------
> [4/4] RUN cp /tmp/*.{foo,bar} ./:
#7 0.844 cp: can't stat '/tmp/*.{foo,bar}': No such file or directory
------
failed to solve with frontend dockerfile.v0: failed to build LLB: executor failed running [/bin/sh -c cp /tmp/*.{foo,bar} ./]: exit code: 1
奇妙なことに、実行中のコンテナに入ると、まったく同じcp
構文が正しく機能します。
Dockerfileから拡張子が複数の個人ファイルをコピーする方法は?
答え1
コマンドは次の場所にあります。DockerfileのRUN
ガイドライン中かっこ拡張をサポートしていない可能性があるrunを使用してください/bin/sh
(引用した投稿でこれを明示的に説明しますbash
)。
次のいずれかの方法を試すことができます。
シェル
bash
用に設定RUN
SHELL
(既定のイメージに既に bash がインストールされているか、前のRUN
ガイドラインを使用していると仮定します):SHELL ["/bin/bash", "-c"] RUN cp /tmp/*.{foo,bar} ./
bashを明示的に呼び出します。
RUN ["/bin/bash", "-c", "cp /tmp/*.{foo,bar} ./"]
中かっこ拡張をまったく使用しないでください。
RUN cp /tmp/*.foo /tmp/*.bar ./
奇妙なことに、実行中のコンテナに入ると、まったく同じ
cp
構文が正しく機能します。
実行中のコンテナはおそらくbashをデフォルトのシェルとして実行しているでしょう。いつもそうではありません。
% docker run --rm -it alpine:3.7
/ # echo /tmp/*.{foo,bar} ./
/tmp/*.{foo,bar} ./
/ # exit
% docker run --rm -it ubuntu:20.04
root@f184619a1121:/# echo /tmp/*.{foo,bar} ./
/tmp/*.foo /tmp/*.bar ./
root@f184619a1121:/# exit
%