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
%

관련 정보