Dockerfile:如何使用 curl 下载文件并复制到容器中

Posted

技术标签:

【中文标题】Dockerfile:如何使用 curl 下载文件并复制到容器中【英文标题】:Dockerfile: how to Download a file using curl and copy into the container 【发布时间】:2020-08-05 09:56:24 【问题描述】:

在本例中,我将 wait-for-it.sh 复制到 /app/wait-for-it.sh 中 但是,我不想将 wait-for-it.sh 保存在我的本地目录中。我想用 curl 下载它,然后复制到 /app/wait-for-it.sh

FROM prismagraphql/prisma:1.34.8
COPY ./wait-for-it.sh /app/wait-for-it.sh
RUN chmod +x /app/wait-for-it.sh
ENTRYPOINT ["/bin/sh","-c","/app/wait-for-it.sh mysql:3306 --timeout=0 -- /app/start.sh"]

我试过的是这个,但是使用 curl 命令下载文件后如何获得wait-for-it.sh

FROM prismagraphql/prisma:1.34.8

FROM node:11-slim

RUN apt-get update && apt-get install -yq build-essential dumb-init

RUN curl -LJO https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh

COPY wait-for-it.sh /app/wait-for-it.sh

RUN chmod +x /wait-for-it.sh

ENTRYPOINT ["/bin/sh","-c","/wait-for-it.sh mysql:3306 --timeout=0 -- /app/start.sh"]

【问题讨论】:

您可以在curl 命令中使用-o 标志 不起作用。我的意思是在运行存储文件的 curl 命令之后?我想将存储的文件复制到 /app/wait-for-it.sh 【参考方案1】:

根据你下面的 cmets,你可以试试这个:

FROM prismagraphql/prisma:1.34.8

RUN apk update && apk add build-base dumb-init curl

RUN curl -LJO https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh

RUN cp wait-for-it.sh /app/

RUN chmod +x /wait-for-it.sh

ENTRYPOINT ["/bin/sh","-c","/wait-for-it.sh mysql:3306 --timeout=0 -- /app/start.sh"]

注意:您需要使用cp 命令,因为您要将脚本从一个位置复制到另一个位置容器的文件系统中。

您还可以通过运行以下命令来确认您的脚本和其他文件/目录是否存在于 /app 文件夹中:

$ docker run --rm --entrypoint ls waitforit -l /app/
total 36
drwxr-xr-x    1 root     root          4096 Aug 29  2019 bin
drwxr-xr-x    2 root     root         16384 Aug 29  2019 lib
-rwxr-xr-x    1 root     root           462 Aug 29  2019 prerun_hook.sh
-rwxr-xr-x    1 root     root            61 Aug 29  2019 start.sh
-rw-r--r--    1 root     root          5224 Apr 22 13:46 wait-for-it.sh

【讨论】:

运行您的解决方案后,我得到了这个 /wait-for-it.sh: line 179: /app/start.sh: No such file or directory @UnbearableLightness: -O(大写)在去除路径后自动创建具有 URL 中存在的名称的文件。如果我一直使用-o,我也会指定文件名。 @Ashik:你确定你在构建镜像时使用了上面的 Dockerfile 内容吗?我可以看到srcdestination 中的文件。检查我更新的答案。我发布的 Dockerfile 代码中没有任何更改。只需尝试我添加的命令并粘贴结果即可。 @Technext 是的,我检查了 curl 手册页,不知道。 使用-o,您可以将下载的文件放在您想要的位置,获取后无需移动。如果您使用--create-dirs,它将在您指定的路径中创建任何缺少的目录。【参考方案2】:

不相关但在构建期间处理下载的一种更简单的方法是使用 Docker 的 ADD 指令而不使用 curl 或 wget。

RUN https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /tmp
COPY /tmp/wait-for-it.sh /app/wait-for-it.sh

现在,我们建议使用 Docker 的 ADD 指令,而不是在 RUN 指令中运行 wget 或 curl - 当您使用 ADD 时,Docker 能够处理 https URL,而您的基础映像可能无法使用 https,或者可能甚至根本没有安装 wget 或 curl。

https://github.com/just-containers/s6-overlay#usage

【讨论】:

以上是关于Dockerfile:如何使用 curl 下载文件并复制到容器中的主要内容,如果未能解决你的问题,请参考以下文章

如何在GitHub正确地使用 Curl 下载文件?

Windows下如何使用curl命令?

Dockerfile制作自定义镜像

如何使用 cURL 从文本文件下载 URL 列表并更改文件名?

curl如何查看服务器目录下都有哪些文件

如何与 PHP 并行进行 cURL 下载和输出?