![](/img/trans.png)
[英]How to copy file from gitlab runner into docker image through dockerfile
[英]How to copy folders to docker image from Dockerfile?
我在我的 Dockerfile 中嘗試了以下命令: COPY * /
並且對結果感到非常驚訝。 似乎朴素的 docker 代碼遍歷 glob 中的目錄,然后將每個文件轉儲到目標目錄中,同時恭敬地忽略我的目錄結構。
至少我是這樣理解這張票的,它肯定與我得到的結果相對應。
我想這種行為仍然存在的唯一原因一定是有其他方法可以做到這一點。 但是對於一個腦子很小的熊來說,要理解它是不是那么容易,有人知道嗎?
ADD
(文檔) ADD
命令可以接受作為<src>
參數:
ADD folder /path/inside/your/container
或
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
會將每個 argdir
的內容復制到目標目錄中。 不是 argdir
本身,而是內容。我對 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.