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

Ash*_*hik 2 docker dockerfile docker-compose prisma

在这个例子中,我将 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"]
Run Code Online (Sandbox Code Playgroud)

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

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"]
Run Code Online (Sandbox Code Playgroud)

par*_*rse 10

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

ADD 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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 它说的是“ADD”而不是“RUN”,但答案尚未更新 (2认同)

Tec*_*ext 5

根据您在下面的评论,您可以试试这个:

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"]
Run Code Online (Sandbox Code Playgroud)

注意:您需要使用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
Run Code Online (Sandbox Code Playgroud)

  • 使用“-o”,您可以将下载的文件放在您想要的位置,获取后无需移动它。如果您使用“--create-dirs”,它将在您指定的路径中创建任何丢失的目录。 (2认同)
  • 我建议使用“curl -LJOf”(添加选项“-f”或“--fail”)来使“curl”在无法下载文件时使构建失败。使追踪问题变得更加容易。 (2认同)