여러 확장자를 가진 파일을 복사하기 위한 이 구문(각각확장자가 여러 개인 파일 복사)는 일반 데스크톱 환경에서 잘 작동합니다.
$ 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
%