Dockerfileから拡張子が複数の個人ファイルをコピーする方法は?

Dockerfileから拡張子が複数の個人ファイルをコピーする方法は?

複数の拡張子を持つファイルをコピーするためのこの構文(それぞれ複数の拡張子を持つファイルをコピーする)は通常のデスクトップ環境でうまく機能します。

$ 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)。

次のいずれかの方法を試すことができます。

  1. シェルbash用に設定RUNSHELL(既定のイメージに既に bash がインストールされているか、前のRUNガイドラインを使用していると仮定します):

    SHELL ["/bin/bash", "-c"]
    RUN cp /tmp/*.{foo,bar} ./ 
    
  2. bashを明示的に呼び出します。

    RUN ["/bin/bash", "-c", "cp /tmp/*.{foo,bar} ./"]
    
  3. 中かっこ拡張をまったく使用しないでください。

    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
%

おすすめ記事