簡體   English   中英

如何將文件夾從 Dockerfile 復制到 docker 鏡像?

[英]How to copy folders to docker image from Dockerfile?

我在我的 Dockerfile 中嘗試了以下命令: COPY * /並且對結果感到非常驚訝。 似乎朴素的 docker 代碼遍歷 glob 中的目錄,然后將每個文件轉儲到目標目錄中,同時恭敬地忽略我的目錄結構。

至少我是這樣理解這張票的,它肯定與我得到的結果相對應。

我想這種行為仍然存在的唯一原因一定是有其他方法可以做到這一點。 但是對於一個腦子很小的熊來說,要理解它是不是那么容易,有人知道嗎?

使用ADD (文檔)

ADD命令可以接受作為<src>參數:

  1. build文件夾的文件夾(在同一文件夾作為您Dockerfile)。 然后,您將在 Dockerfile 中添加一行,如下所示:
ADD folder /path/inside/your/container

  1. 主機文件系統中任何位置的單文件存檔。 要創建存檔,請使用以下命令:
tar -cvzf newArchive.tar.gz /path/to/your/folder

然后,您將在 Dockerfile 中添加一行,如下所示:

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

注意事項:

  • ADD將自動提取您的存檔。
  • 尾部斜杠的存在/不存在很重要,請參閱鏈接的文檔

就像@Vonc 所說的那樣,目前不可能添加命令。 唯一的解決方法是提及文件夾,創建它並向其中添加內容。

# add contents to folder
ADD src $HOME/src

將在您的目錄中創建一個名為src的文件夾,並將文件夾src 的內容添加到該文件夾​​中。

您的機票中所述

你有COPY files/* /test/它擴展到COPY files/dir files/file1 files/file2 files/file /test/
如果您將其拆分為單獨的COPY命令(例如COPY files/dir /test/ ),您將看到(無論好壞) COPY會將每個 arg dir的內容復制到目標目錄中。 不是 arg dir本身,而是內容。

我對 COPY 不保留頂級目錄的事實並不感到興奮,但它已經有一段時間了。

因此,以保留向后兼容性的名義,無法COPY / ADD目錄結構。

唯一的解決方法是一系列RUN mkdir -p /x/y/z來構建目標目錄結構,然后是一系列docker ADD (每個文件夾一個填充)。
(根據評論ADD ,而不是COPY

使用ADD而不是COPY 假設您要將目錄 src 中的所有內容從主機復制到目錄 dst 中的容器:

ADD src dst

注意:目錄 dst 將在容器中自動創建。

COPY . <destination>

在你的情況下:

COPY . /

我不完全理解原始海報的情況,但我可以證明可以在 Dockerfile 中使用 COPY 復制目錄結構。

假設您有以下文件夾結構:

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

要將其復制到目標映像,您可以使用這樣的 Dockerfile 內容:

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 . 如下:

$ 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

將 * 替換為 /

所以代替

COPY * <destination>

使用

COPY / <destination>

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

在我的 Dockerfile 中,我將./apps/agent./apps/lib目錄復制到/apps/agent/apps/lib目錄。

假設您想將包含 docker 文件的文件夾中的內容復制到容器中。 使用添加:

RUN mkdir /temp
ADD folder /temp/Newfolder  

它將使用 temp/newfolder 添加到您的容器中

文件夾是您擁有 dockerfile 的文件夾/目錄,更具體地說,是您放置內容並想要復制它的位置。

現在您可以通過運行容器檢查復制/添加的文件夾並使用 ls 查看內容嗎

最簡單的方法:

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

如果您正在復制需要由根使用 ~ 拾取的內容,請注意放入路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM