在多阶段 docker 构建期间访问 nginx 端点

accessing nginx endpoint during a multi-stage docker build

我正在尝试通过 HTTP 抓取静态 html 站点作为构建 docker 图像的一部分。当我尝试 curl http://localhost 时,连接被拒绝。当我删除 curl 语句和 运行 容器时,静态内容按预期在本地主机上可用(包括容器内的 运行ning curl)。

有什么方法可以在构建期间访问 nginx 端点吗?

FROM ubuntu AS indexer
RUN apt-get update && apt-get install -y nginx
RUN apt-get update && apt-get install -y curl
COPY --from=builder /workdir/build /usr/share/nginx/html
RUN service nginx start
RUN curl http://localhost > /tmp/index.html

在 运行 curl 之前,我曾尝试等待端口 80 可用,但这没有任何区别。

在每个 运行 语句之间,构建状态 'machine' 被破坏,并为下一个 运行 语句启动一个新状态。所以当你在一个 运行 语句中启动 nginx 时,当你到达下一个时它就消失了。

要完成您想要做的事情,nginx 需要在与您进行抓取相同的 运行 语句中启动。

像这样

FROM ubuntu AS indexer
RUN apt-get update && apt-get install -y nginx
RUN apt-get update && apt-get install -y curl
COPY --from=builder /workdir/build /usr/share/nginx/html
RUN service nginx start && sleep 10 && curl http://localhost > /tmp/index.html

通过nginx而不是文件系统来访问文件确实有点奇怪。在您发布的(公认有限的)示例中,您可以做

RUN cp /usr/share/nginx/html/index.html /tmp/

相反。