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 内容吗?我可以看到src
和destination
中的文件。检查我更新的答案。我发布的 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 下载文件并复制到容器中的主要内容,如果未能解决你的问题,请参考以下文章