programing

도커 파일에서 도커 이미지로 폴더를 복사하는 방법은 무엇입니까?

lastmoon 2023. 8. 5. 10:55
반응형

도커 파일에서 도커 이미지로 폴더를 복사하는 방법은 무엇입니까?

과 같은 했습니다.COPY * /그리고 그 결과에 매우 놀랐습니다.순진한 도커 코드는 전역에서 디렉토리를 통과한 다음 각 파일을 대상 디렉토리에 덤프하면서 내 디렉토리 구조를 정중히 무시하는 것 같습니다.

적어도 그것이 가 이 티켓을 이해하는 방법이고 제가 얻은 결과와 확실히 일치합니다.

이러한 행동이 여전히 존재할 수 있는 유일한 이유는 이것이 이루어져야 할 다른 방법이 있기 때문이라고 생각합니다.하지만 머리가 아주 작은 곰이 어떻게 이해하는지 아는 것은 쉽지 않습니다, 아는 사람이 있나요?

사용하다ADD(계속)

ADD명령은 다음과 같이 받아들일 수 있습니다.<src>매개변수:

  1. 빌드 폴더 내의 폴더(도커 파일과 동일한 폴더).그런 다음 Docker 파일에 다음과 같은 행을 추가합니다.
ADD folder /path/inside/your/container

또는

  1. 호스트 파일 시스템의 모든 위치에 단일 파일 아카이브.보관 파일을 만들려면 다음 명령을 사용합니다.
tar -cvzf newArchive.tar.gz /path/to/your/folder

그런 다음 Docker 파일에 다음과 같은 줄을 추가합니다.

ADD /path/to/archive/newArchive.tar.gz  /path/inside/your/container

주의:

  • ADD보관 파일을 자동으로 추출합니다.
  • 후행 슬래시의 유무가 중요합니다. 관련 문서 참조

@Vonc가 말한 것처럼 현재와 같은 명령어를 추가할 가능성은 없습니다.유일한 해결 방법은 폴더를 언급하고 폴더를 만들고 폴더에 내용을 추가하는 것입니다.

# add contents to folder
ADD src $HOME/src

디렉토리에 src라는 폴더를 만들고 여기에 src 폴더의 내용을 추가합니다.

사용하다ADDCOPY호스트에서 디렉토리 dst로 디렉토리 src의 모든 내용을 컨테이너에서 복사한다고 가정합니다.

ADD src dst

참고: 디렉터리 dst가 컨테이너에 자동으로 생성됩니다.

티켓에 언급된 대로:

당신은 가지고 있다COPY files/* /test/은 는되확장으로 됩니다.COPY files/dir files/file1 files/file2 files/file /test/.
,COPY 명령):COPY files/dir /test/ 나쁘든) 나쁘든) 라는 될 것입니다.COPY합니다.dir대상 디렉터리로 이동합니다.아그가 아닙니다.dir그 자체가 아니라 내용입니다.

나는 카피가 최상위 디르를 보존하지 않는다는 사실에 흥분하지 않지만, 지금은 한동안 그런 식이었습니다.

그래서 하위 호환성을 보존한다는 명목으로, 다음과 같은 것은 가능하지 않습니다.COPY/ADD디렉토리 구조

유일한 해결 방법은 다음과 같습니다.RUN mkdir -p /x/y/z구조를 한 후 의 " 대디리구다한음일련의축구를조터렉상일▁to,의"를 작성합니다.docker ADD(채울 폴더마다 하나씩).
(ADD,것은 아니다.COPY코멘트대로)

COPY . <destination>

당신의 경우일 것입니다.

COPY . /

원본 포스터의 경우를 완전히 이해하지는 못하지만 도커 파일에서 복사를 사용하여 디렉터리 구조를 복사하는 것이 가능하다는 것을 증명할 수 있습니다.

다음과 같은 폴더 구조가 있다고 가정합니다.

folder1
  file1.html
  file2.html
folder2
  file3.html
  file4.html
  subfolder
    file5.html
    file6.html

대상 이미지에 복사하려면 다음과 같은 Docker 파일 내용을 사용할 수 있습니다.

FROM nginx

COPY ./folder1/ /usr/share/nginx/html/folder1/
COPY ./folder2/ /usr/share/nginx/html/folder2/

RUN ls -laR /usr/share/nginx/html/*

의 출력docker build .다음과 같이:

$ docker build --no-cache .
Sending build context to Docker daemon  9.728kB
Step 1/4 : FROM nginx
 ---> 7042885a156a
Step 2/4 : COPY ./folder1/ /usr/share/nginx/html/folder1/
 ---> 6388fd58798b
Step 3/4 : COPY ./folder2/ /usr/share/nginx/html/folder2/
 ---> fb6c6eacf41e
Step 4/4 : RUN ls -laR /usr/share/nginx/html/*
 ---> Running in face3cbc0031
-rw-r--r-- 1 root root  494 Dec 25 09:56 /usr/share/nginx/html/50x.html
-rw-r--r-- 1 root root  612 Dec 25 09:56 /usr/share/nginx/html/index.html

/usr/share/nginx/html/folder1:
total 16
drwxr-xr-x 2 root root 4096 Jan 16 10:43 .
drwxr-xr-x 1 root root 4096 Jan 16 10:43 ..
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file1.html
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file2.html

/usr/share/nginx/html/folder2:
total 20
drwxr-xr-x 3 root root 4096 Jan 16 10:43 .
drwxr-xr-x 1 root root 4096 Jan 16 10:43 ..
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file3.html
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file4.html
drwxr-xr-x 2 root root 4096 Jan 16 10:33 subfolder

/usr/share/nginx/html/folder2/subfolder:
total 16
drwxr-xr-x 2 root root 4096 Jan 16 10:33 .
drwxr-xr-x 3 root root 4096 Jan 16 10:43 ..
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file5.html
-rwxr-xr-x 1 root root    7 Jan 16 10:32 file6.html
Removing intermediate container face3cbc0031
 ---> 0e0062afab76
Successfully built 0e0062afab76
FROM openjdk:8-jdk-alpine
RUN apk update && apk add wget openssl lsof procps curl
RUN apk update
RUN mkdir -p /apps/agent
RUN mkdir -p /apps/lib
ADD ./app/agent /apps/agent
ADD ./app/lib /apps/lib
ADD ./app/* /apps/app/
RUN ls -lrt /apps/app/
CMD sh /apps/app/launch.sh

Docker 파일 내에서 파일을 복사하는 중입니다../apps/agent그리고../apps/lib에 대한 디렉토리./apps/agent그리고./apps/lib디렉터리.

*를 /로 바꿉니다.

그래서 대신에

COPY * <destination>

사용하다

COPY / <destination>

도커 파일이 있는 폴더의 내용을 컨테이너에 복사하려고 합니다.ADD 사용:

RUN mkdir /temp
ADD folder /temp/Newfolder  

임시/새 폴더로 컨테이너에 추가됩니다.

폴더는 도커 파일이 있는 폴더/디렉토리입니다. 보다 구체적으로는 내용을 저장하고 복사할 위치입니다.

이제 실행 중인 컨테이너로 복사/추가된 폴더를 확인하고 ls를 사용하여 내용을 볼 수 있습니다.

가장 간단한 방법:

sudo docker cp path/on/your/machine adam_ubuntu:/root/path_in_container

~를 사용하여 루트에서 픽업해야 하는 항목을 복사하는 경우 루트 경로에 입력합니다.

언급URL : https://stackoverflow.com/questions/37789984/how-to-copy-folders-to-docker-image-from-dockerfile

반응형