首页 > 解决方案 > Dockerfile 映像构建:Dockerfile 中的“RUN wget”导致部分文件下载,但构建完成且没有错误

问题描述

如标题所述。此外,与 curl 相同的结果,无论是否使用纯 RUN 与 RUN 的 EXEC 模式与 wget 及其 args 都在 []

容器构建时没有错误,当我通过使用 bash 劫持入口点运行它时,我看到实际上只下载了几百字节的文件,然后从正在运行的容器内部,我可以获取完整的文件并运行它。

做了很多谷歌搜索,没有看到其他人。
???

FROM ubuntu:18.04

RUN echo "APT::Get::Assume-Yes \"true\";" > /etc/apt/apt.conf.d/90assumeyes

RUN apt-get update \
    && apt-get install \
        ca-certificates \
        jq \
        git \
        curl\
        m4 \
        make \
        patch \
        libev-dev \
        libgmp-dev \
        libhidapi-dev \
        bubblewrap \
        zip \
        unzip \
        g++ \
        pkg-config

WORKDIR /azp

ENV DEBIAN_FRONTEND=noninteractive

RUN ["curl", "-s", "-o", "/usr/local/bin/opam", "https://github.com/ocaml/opam/releases/download/2.0.6/opam-2.0.6-x86_64-linux"]

RUN chmod a+x /usr/local/bin/opam

ENTRYPOINT ["bash"]

标签: dockerdockerfile

解决方案


问题在于curl这里的命令

RUN ["curl", "-s", "-o", "/usr/local/bin/opam", "https://github.com/ocaml/opam/releases/download/2.0.6/opam-2.0.6-x86_64-linux"]

使用此命令,它会下载 HTML 页面而不是二进制文件。

执行详细请求,您可以看到请求正在被重定向

curl -v -o /usr/local/bin/opam https://github.com/ocaml/opam/releases/download/2.0.6/opam-2.0.6-x86_64-linux
...
> GET /ocaml/opam/releases/download/2.0.6/opam-2.0.6-x86_64-linux HTTP/1.1
> Host: github.com
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 302 Found
< date: Tue, 14 Apr 2020 19:33:11 GMT
< content-type: text/html; charset=utf-8
< server: GitHub.com
< status: 302 Found
...

在这种情况下,-L必须将选项传递给 curl 请求

-L/--location (HTTP/HTTPS) 如果服务器报告请求的页面已经移动到不同的位置(用 Location: 标头和 3XX 响应代码指示),此选项将使 curl 在新的地方。

curl将您的命令修改为

RUN ["curl", "-sL", "-o", "/usr/local/bin/opam", "https://github.com/ocaml/opam/releases/download/2.0.6/opam-2.0.6-x86_64-linux"]

或使用wget

RUN ["wget", "https://github.com/ocaml/opam/releases/download/2.0.6/opam-2.0.6-x86_64-linux"]

推荐阅读