You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多阶段Dockerfile的FROM AS指令在Jenkins中触发无效引用格式错误

解决Docker多阶段构建在Jenkins中报错“无效引用格式”的问题

问题分析

你遇到的错误解析引用失败:"node:8.12.0-alpine AS firstStep" 不是有效的仓库/标签:无效引用格式,核心原因是Jenkins运行环境中的Docker版本过低,不支持多阶段构建的AS关键字语法。Docker多阶段构建是在17.05版本正式引入的,如果你的Docker daemon版本低于这个版本,它会把AS firstStep当成镜像名称的一部分去解析,自然就会触发无效引用的报错。

你的Dockerfile代码

FROM node:8.12.0-alpine AS firstStep
WORKDIR /usr/src/app/
# Copy both the package.json and the package-lock.json
COPY package*.json ./
COPY . .
# Deployment container
FROM nginx:1.14.0-alpine
RUN apk add --no-cache bash
RUN apk add --update curl
#set env var for certs
ENV NODE_EXTRA_CA_CERTS /confs/MyPem.pem
# Forward logs to stdout and stderr
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log
# Create nginx config dir and copy nginx files for environments into it
RUN mkdir /confs
COPY ./nginxconf/* /confs/
#This copies the Keystore from the workspace and places it at the root of the container
COPY ./MyPem.pem /confs/MyPem.pem
COPY --from=firstStep /usr/src/app/dist /usr/share/nginx/html
COPY ./entrypoint.sh /opt/entrypoint.sh
RUN chmod a+x /opt/entrypoint.sh
ENTRYPOINT ["/opt/entrypoint.sh"]

解决方案

1. 检查Jenkins环境的Docker版本

先确认版本是否达标,在Jenkins任务里添加一个执行Shell的步骤,运行命令:

docker --version

如果输出的版本号低于17.05.0-ce,就坐实了是版本兼容问题。

2. 升级Docker版本

根据Jenkins服务器的操作系统,升级Docker到17.05及以上版本:

  • Ubuntu/Debian系统:通过官方源升级
    sudo apt-get update
    sudo apt-get install docker-ce=17.05.0~ce-0~ubuntu-xenial
    sudo systemctl restart docker
    
  • CentOS/RHEL系统:
    sudo yum update
    sudo yum install docker-ce-17.05.0.ce-1.el7.centos
    sudo systemctl restart docker
    

3. 临时替代方案(无法立即升级时)

如果暂时没法升级Docker,可以把多阶段构建拆成两个独立步骤:

  • 第一步:创建Dockerfile.build专门处理前端构建
    FROM node:8.12.0-alpine
    WORKDIR /usr/src/app/
    COPY package*.json ./
    COPY . .
    # 补充构建命令生成dist目录,比如你的项目用npm构建的话
    RUN npm install && npm run build
    
    在Jenkins中执行构建并导出dist目录:
    docker build -t build-image -f Dockerfile.build .
    docker create --name temp-container build-image
    docker cp temp-container:/usr/src/app/dist ./dist
    docker rm temp-container
    
  • 第二步:修改原Dockerfile,直接拷贝本地生成的dist目录
    FROM nginx:1.14.0-alpine
    RUN apk add --no-cache bash
    RUN apk add --update curl
    ENV NODE_EXTRA_CA_CERTS /confs/MyPem.pem
    RUN ln -sf /dev/stdout /var/log/nginx/access.log \
        && ln -sf /dev/stderr /var/log/nginx/error.log
    RUN mkdir /confs
    COPY ./nginxconf/* /confs/
    COPY ./MyPem.pem /confs/MyPem.pem
    COPY ./dist /usr/share/nginx/html
    COPY ./entrypoint.sh /opt/entrypoint.sh
    RUN chmod a+x /opt/entrypoint.sh
    ENTRYPOINT ["/opt/entrypoint.sh"]
    
    最后正常构建这个Dockerfile即可。

内容的提问来源于stack exchange,提问作者Nick Edwards

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:52:39