programing

도커 파일의 조건부 복사/추가?

starjava 2023. 7. 31. 21:00
반응형

도커 파일의 조건부 복사/추가?

Docker 파일 안에 파일이 있으면 이미지에 파일을 복사하고 싶습니다. 필요한 경우.pip용 txt 파일은 좋은 후보처럼 보이지만 어떻게 달성될 것인가요?

COPY (requirements.txt if test -e requirements.txt; fi) /destination
...
RUN  if test -e requirements.txt; then pip install -r requirements.txt; fi

또는

if test -e requirements.txt; then
    COPY requiements.txt /destination;
fi
RUN  if test -e requirements.txt; then pip install -r requirements.txt; fi

다음은 간단한 해결 방법입니다.

COPY foo file-which-may-exist* /target

확인foo존재, 이후COPY유효한 소스가 하나 이상 필요합니다.

한다면file-which-may-exist또한 복사됩니다.

참고: 와일드카드가 복사하지 않을 다른 파일을 선택하지 않도록 주의해야 합니다.좀 더 주의를 기울이자면,file-which-may-exist?대신에 (?단일 문자만 일치합니다.

또는 다음과 같은 문자 클래스를 사용하여 하나의 파일만 일치시킬 수 있습니다.

COPY foo file-which-may-exis[t] /target

의견에 따르면 Santhosh Hirekerur의 답변은 여전히 파일을 복사합니다. 진정한 조건부 복사본을 얻으려면 이 방법을 사용할 수 있습니다.

ARG BUILD_ENV=copy

FROM alpine as build_copy
ONBUILD COPY file /file

FROM alpine as build_no_copy
ONBUILD RUN echo "I don't copy"

FROM build_${BUILD_ENV}
# other stuff

ONBUILD지시사항은 파일이 파일에 의해 선택된 경우에만 복사되도록 보장합니다.BUILD_ENV호출하기 전에 작은 스크립트를 사용하여 이 변수 설정docker build

2021+, 이 답변에서 글로벌 패턴을 사용하여 도커 복사는 유효한 소스를 찾지 못하더라도 실패하지 않습니다.

COPY requiements.tx[t] /destination

2015: 현재 지원되지 않습니다(동일한 Docker 파일이 파일의 존재에 따라 파일을 복사하거나 복사하지 않기 때문에 복제할 수 없는 이미지로 이어질 수 있습니다).

13045호에서 와일드카드를 사용하여 여전히 요청됩니다. "COPY foo/* bar/" not work if no file in foo(2015년 5월).
현재(2015년 7월) 도커에서 구현되지는 않겠지만, 보커와 같은 다른 빌드 도구가 이를 지원할 수 있습니다.


2021:

COPY source/. /source/(즉, "공백이든 비든 상관없이 도커 빌드에 디렉터리 복사 - " "COPY failed: no source files were specified에서 실패함"과 같이 비어 있거나 비어 있지 않을 때 디렉터리를 복사합니다.)

2022

제 제안은 이렇습니다.

# syntax=docker/dockerfile:1.2

RUN --mount=type=bind,source=jars,target=/build/jars \
 find /build/jars -type f -name '*.jar' -maxdepth 1  -print0 \
 | xargs -0 --no-run-if-empty --replace=source cp --force source >"${INSTALL_PATH}/modules/"

다음과 같은 이점이 있습니다.

COPY jars/*.jar "${INSTALL_PATH}/modules/"

하지만 복사 안 함*.jar찾을 수 없는 경우 오류를 발생시키지 않습니다.

저는 이것으로 유효한 해결책을 생각해냈다고 생각합니다.Dockerfile

FROM alpine
COPy always_exist_on_host.txt .
COPY *sometimes_exist_on_host.txt .

always_exist_on_host.txt파일은 항상 이미지에 복사되고 빌드는 다음을 복사하지 못합니다.sometimes_exist_on_host.txt파일이 존재하지 않는 경우.게다가, 그것은 그것을 복사할 것입니다.sometimes_exist_on_host.txt파일이 존재하는 경우.

예:

.
├── Dockerfile
└── always_exist_on_host.txt

빌드 성공

docker build . -t copy-when-exists --no-cache
[+] Building 1.0s (7/7) FINISHED                                                                                                                            
 => [internal] load .dockerignore                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                        0.0s
 => [internal] load build definition from Dockerfile                                                                                                   0.0s
 => => transferring dockerfile: 36B                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                                                       1.0s
 => [internal] load build context                                                                                                                      0.0s
 => => transferring context: 43B                                                                                                                       0.0s
 => CACHED [1/2] FROM docker.io/library/alpine@sha256:c0e9560cda118f9ec63ddefb4a173a2b2a0347082d7dff7dc14272e7841a5b5a                                 0.0s
 => [2/2] COPY always_exist_on_host.txt *sometimes_exist_on_host.txt .                                                                                 0.0s
 => exporting to image                                                                                                                                 0.0s
 => => exporting layers                                                                                                                                0.0s
 => => writing image sha256:e7d02c6d977f43500dbc1c99d31e0a0100bb2a6e5301d8cd46a19390368f4899                                                           0.0s               

.
├── Dockerfile
├── always_exist_on_host.txt
└── sometimes_exist_on_host.txt

빌드가 여전히 성공합니다.

docker build . -t copy-when-exists --no-cache
[+] Building 1.0s (7/7) FINISHED                                                                                                                            
 => [internal] load build definition from Dockerfile                                                                                                   0.0s
 => => transferring dockerfile: 36B                                                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                        0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                                                       0.9s
 => [internal] load build context                                                                                                                      0.0s
 => => transferring context: 91B                                                                                                                       0.0s
 => CACHED [1/2] FROM docker.io/library/alpine@sha256:c0e9560cda118f9ec63ddefb4a173a2b2a0347082d7dff7dc14272e7841a5b5a                                 0.0s
 => [2/2] COPY always_exist_on_host.txt *sometimes_exist_on_host.txt .                                                                                 0.0s
 => exporting to image                                                                                                                                 0.0s
 => => exporting layers                                                                                                                                0.0s
 => => writing image sha256:4c88e2ffa77ebf6869af3c7ca2a0cfb9461979461fc3ae133709080b5abee8ff                                                           0.0s
 => => naming to docker.io/library/copy-when-exists                                                                                                    0.0s

해결 방법

ENV 변수를 기반으로 FOLDER를 서버에 복사해야 한다는 요구가 있었습니다.저는 빈 서버 이미지를 찍었습니다.로컬 폴더에 필요한 배포 폴더 구조를 만들었습니다.그런 다음 아래 줄을 도커에 추가합니다. 파일을 컨테이너에 복사합니다.마지막 줄에 도커가 서버를 시작하기 전에 init file.sh 을 실행할 진입점을 추가했습니다.

#below lines added to integrate testing framework
RUN mkdir /mnt/conf_folder
ADD install /mnt/conf_folder/install
ADD install_test /mnt/conf_folder/install_test
ADD custom-init.sh /usr/local/bin/custom-init.sh
ENTRYPOINT ["/usr/local/bin/custom-init.sh"]

그런 다음 사용자 정의 init를 만듭니다.sh 파일은 아래와 같은 스크립트와 함께 로컬에 있습니다.

#!/bin/bash
if [ "${BUILD_EVN}" = "TEST" ]; then
    cp -avr /mnt/conf_folder/install_test/* /mnt/wso2das-3.1.0/
else
    cp -avr /mnt/conf_folder/install/* /mnt/wso2das-3.1.0/
fi;

도커에서 아래 줄에 있는 파일을 작성합니다.

환경: - BUILD_EVN=TEST

이러한 변경사항은 도커 빌드 중에 폴더를 컨테이너에 복사합니다.도커 백업을 실행하면 서버가 시작되기 전에 실제 필요한 폴더를 복사하거나 서버에 배포할 수 있습니다.

모든 파일을 일회용 디르에 복사하고 원하는 파일을 직접 선택하고 나머지는 폐기합니다.

COPY . /throwaway
RUN cp /throwaway/requirements.txt . || echo 'requirements.txt does not exist'
RUN rm -rf /throwaway

에 의존하는 단계를 할 수 있습니다.cp조건부로 복사합니다.단계를 하면 최종 .COPY.

FROM alpine as copy_stage
COPY . .
RUN mkdir /dir_for_maybe_requirements_file
RUN cp requirements.txt /dir_for_maybe_requirements_file &>- || true

FROM alpine
# Must copy a file which exists, so copy a directory with maybe one file
COPY --from=copy_stage /dir_for_maybe_requirements_file /
RUN cp /dir_for_maybe_requirements_file/* . &>- || true
CMD sh

다른 아이디어를 시도해 봤지만, 우리의 요구 사항을 충족하는 것은 없었습니다.이 아이디어는 하위 정적 웹 응용 프로그램을 위한 기본 nginx 이미지를 만드는 것입니다.는 "", "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "RUN하위 이미지에서 추가한 디렉터리의 명령입니다.기본 이미지는 하위 이미지에 의해 추가되는 디렉터리를 제어하지 않습니다.하위 이미지가 작동한다고 가정합니다.COPY어딘가 밑에 있는 자원COMMON_DEST_ROOT.

이지만, 한다는 것이 아이디어입니다.COPY하위 이미지에 의해 추가된 1-N개 디렉터리에 대한 지침입니다.ARG PLACEHOLDER_FILE그리고.ENV UNPROVIDED_DEST만족시키기 위해 사용됩니다.<src>그리고.<dest>임의의 에대요사항에 사항COPY지시가 필요 없습니다.

#
# base-image:01
#
FROM nginx:1.17.3-alpine
ENV UNPROVIDED_DEST=/unprovided
ENV COMMON_DEST_ROOT=/usr/share/nginx/html
ONBUILD ARG PLACEHOLDER_FILE
ONBUILD ARG SRC_1
ONBUILD ARG DEST_1
ONBUILD ARG SRC_2
ONBUILD ARG DEST_2
ONBUILD ENV SRC_1=${SRC_1:-PLACEHOLDER_FILE}
ONBUILD ENV DEST_1=${DEST_1:-${UNPROVIDED_DEST}}
ONBUILD ENV SRC_2=${SRC_2:-PLACEHOLDER_FILE}
ONBUILD ENV DEST_2=${DEST_2:-${UNPROVIDED_DEST}}

ONBUILD COPY ${SRC_1} ${DEST_1}
ONBUILD COPY ${SRC_2} ${DEST_2}

ONBUILD RUN sh -x \
    #
    # perform operations on COMMON_DEST_ROOT
    #
    && chown -R limited:limited ${COMMON_DEST_ROOT} \
    #
    # remove the unprovided dest
    #
    && rm -rf ${UNPROVIDED_DEST}

#
# child image
#
ARG PLACEHOLDER_FILE=dummy_placeholder.txt
ARG SRC_1=app/html
ARG DEST_1=/usr/share/nginx/html/myapp
FROM base-image:01

이 션 더 미 같 있 명 단 습 니 점 다 이 백 한 은 솔 루 와 에 는 ▁the ▁this ▁has comings ▁like ▁short ▁obvious 니 다 있 습 ▁dummy ▁solution이 단PLACEHOLDER_FILE및 지원되는 하드 코딩된 복사 명령 수.또한 복사 명령에 사용되는 ENV 변수를 제거할 방법이 없습니다.

동일한 문제에 대한 다른 해결 방법이 있습니다.빌드 컨텍스트에서 파일을 터치하고 Docker 파일 내의 copy 문을 사용합니다.파일이 존재하는 경우 빈 파일만 생성되고 도커 빌드가 실패하지 않습니다.파일이 이미 있는 경우 타임스탬프만 변경됩니다.

touch requirements.txt

Docker 파일의 경우

FROM python:3.9
COPY requirements.txt .

복사는 더 이상 하나 이상의 원본이 필요하지 않으며 일치하는 항목이 없으면 글로빙이 실패하지 않으므로 그냥 사용할 수 있습니다.

COPY requirements.tx[t] /destination

은 복합니를 복사할 것입니다.requirements.txt존재한다면, 그리고 존재하지 않더라도 실패하지 않더라도 실패하지 않을 것입니다.

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

반응형