Dockerfile:添加位置is URL 创建一个目录而不是下载的文件

Dockerfile:添加位置is URL 创建一个目录而不是下载的文件

我有以下 Dockerfile:

FROM node:alpine

ENV HUGO_VERSION 0.26
ENV HUGO_BINARY hugo_${HUGO_VERSION}_linux-64bit

# Install node
RUN apk add --update \
        git py-pygments tar \
        && rm -rf /var/cache/apk/*

# Download and Install hugo
ADD https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY}.tar.gz /tmp/${HUGO_BINARY}.tar.gz
RUN tar xzf /tmp/${HUGO_BINARY}.tar.gz -C /usr/local/bin/ \
        && rm /tmp/${HUGO_BINARY}.tar.gz

我得到了:

tar (child): /tmp/hugo_0.26_linux-64bit.tar.gz: Cannot open: No such file or directory

我发现一个 StackExchange 线程有同样的问题并从中理解Docker 添加文档

你不能ADD ../something /something,因为 a 的第一步docker build是将上下文目录(和子目录)发送到 docker 守护进程。

不过我仔细读了好几遍才知道

如果<src>是 URL 并且<dest>不以尾部斜杠结尾,则从该 URL 下载文件并将其复制到<dest>

如果<src>是 URL 并且<dest>以尾部斜杠结尾,则从 URL 推断文件名并将文件下载到<dest>/<filename>.

就我而言,我没有尾部斜杠。我尝试将其设置<src>/tmp/这样

ADD https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY}.tar.gz /tmp/
RUN tar xzf /tmp/${HUGO_BINARY}.tar.gz -C /usr/local/bin/ \
        && rm /tmp/${HUGO_BINARY}.tar.gz

我有:

tar (child): /tmp/hugo_0.26_linux-64bit.tar.gz: Cannot open: No such file or directory

我很困惑。我错过了什么?我正在使用 macOS 10.12.6

Docker version 17.06.0-ce, build 02c1d87
docker-compose version 1.14.0, build c7bdf9e
docker-machine version 0.12.0, build 45c69ad

答案1

我修改了你的 Dockerfile,在ls -Rlh /tmptar 之前添加了一个,然后看到了这个:

Step 5/5 : RUN ls -Rlh /tmp/ && tar xzf /tmp/${HUGO_BINARY}.tar.gz -C /usr/local/bin/         && rm /tmp/${HUGO_BINARY}.tar.gz
 ---> Running in deea1f3a4b1a
/tmp/:
total 4
drwxr-xr-x    2 root     root        4.0K Aug 10 05:25 hugo_0.26_linux-64bit.tar.gz

/tmp/hugo_0.26_linux-64bit.tar.gz:
total 11976
-rw-r--r--    1 root     root       10.2K Jun 17 08:06 LICENSE.md
-rw-r--r--    1 root     root        6.2K Jul 18 08:50 README.md
-rwxr-xr-x    1 root     root       11.7M Aug  7 07:09 hugo

因此,Docker 似乎识别出该文件是 tarball 并为您进行了提取。你可能可以这样做:

# Download and Install hugo
ADD https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY}.tar.gz /usr/local/bin/

这给了我这个:

Step 5/5 : RUN ls -Rlh /usr/local/bin/
 ---> Running in 6f6cabfbbde8
/usr/local/bin/:
total 47596
-rw-r--r--    1 root     root       10.2K Jun 17 08:06 LICENSE.md
-rw-r--r--    1 root     root        6.2K Jul 18 08:50 README.md
-rwxr-xr-x    1 root     root       11.7M Aug  7 07:09 hugo
-rwxr-xr-x    1 root     root       34.8M Jul 21 18:20 node
lrwxrwxrwx    1 root     root          38 Jul 21 18:20 npm -> ../lib/node_modules/npm/bin/npm-cli.js
lrwxrwxrwx    1 root     root          38 Jul 21 18:20 npx -> ../lib/node_modules/npm/bin/npx-cli.js
lrwxrwxrwx    1 root     root          18 Jul 21 18:21 yarn -> /opt/yarn/bin/yarn
lrwxrwxrwx    1 root     root          18 Jul 21 18:21 yarnpkg -> /opt/yarn/bin/yarn

这似乎与文档相矛盾:

  • 如果<src>是一个当地的tar 存档为可识别的压缩格式(identity、gzip、bzip2 或 xz),然后将其解压为目录。资源来自偏僻的URL 未解压缩。

相关内容