多阶段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专门处理前端构建
在Jenkins中执行构建并导出dist目录:FROM node:8.12.0-alpine WORKDIR /usr/src/app/ COPY package*.json ./ COPY . . # 补充构建命令生成dist目录,比如你的项目用npm构建的话 RUN npm install && npm run builddocker 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目录
最后正常构建这个Dockerfile即可。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"]
内容的提问来源于stack exchange,提问作者Nick Edwards
相关产品推荐
相关产品推荐

