首页 > 解决方案 > 添加 arg 后 Docker 构建运行两次

问题描述

我有包含一些构建器的 Dockerfile,其中一个是我最近添加的前端,ARG BRANCH_NAME因此我可以稍后使用分支名称作为变量(我的前端没有 .git 文件夹,这就是我使用这种方法的原因):

FROM node:8.11 as frontend-builder
COPY frontend/package.json /frontend/package.json
COPY frontend/package-lock.json /frontend/package-lock.json
COPY ./VERSION /frontend/VERSION
WORKDIR /frontend
RUN npm install
COPY frontend/ /frontend
ARG BRANCH_NAME
RUN sed -i "s|VERSION|${BRANCH_NAME}-frontend@$(cat "VERSION")|g" src/environments/environment.prod.ts
RUN npm run build-prod

在 gitlab-ci.yml 我这样传递它:

build:
  stage: build
  before_script:
    - docker login -u gitlab-ci-token -p "$CI_JOB_TOKEN" registry.xx.it
  script:
    - export TARGET=backend-builder
    - export IMAGE=$CI_REGISTRY_IMAGE/$TARGET
    - docker pull $IMAGE:$CI_COMMIT_REF_NAME || echo "no image"
    - docker pull $IMAGE:latest || echo "no latest image"
    - docker build --target $TARGET -t $IMAGE:$CI_COMMIT_REF_NAME .
    - docker push $IMAGE:$CI_COMMIT_REF_NAME

    - export TARGET=frontend-builder
    - export IMAGE=$CI_REGISTRY_IMAGE/$TARGET
    - docker pull $IMAGE:$CI_COMMIT_REF_NAME || echo "no  image"
    - docker pull $IMAGE:latest || echo "no latest image"
    - docker build --target $TARGET -t $IMAGE:$CI_COMMIT_REF_NAME --build-arg BRANCH_NAME=$CI_COMMIT_REF_NAME .
    - docker push $IMAGE:$CI_COMMIT_REF_NAME

    - export IMAGE=$CI_REGISTRY_IMAGE
    - docker pull $IMAGE:$CI_COMMIT_REF_NAME || echo "no branch image"
    - docker pull $IMAGE:latest || echo "no latest image"
    - docker build -t $IMAGE:$CI_COMMIT_REF_NAME .
    - docker push $IMAGE:$CI_COMMIT_REF_NAME
  tags:
    - local-docker

- export TARGET=frontend-builder我换行之后:

- docker build --target $TARGET -t $IMAGE:$CI_COMMIT_REF_NAME .

至:

- docker build --target $TARGET -t $IMAGE:$CI_COMMIT_REF_NAME --build-arg BRANCH_NAME=$CI_COMMIT_REF_NAME .

所以我所做的就是添加--build-arg BRANCH_NAME=$CI_COMMIT_REF_NAME.

但现在它似乎全部执行了两次,一旦我得到$BRANCH_NAME它应该是,其他时候我$BRANCH_NAME是空的。有谁知道为什么会这样?

标签: dockerdockerfilegitlab-cigitlab-ci-runner

解决方案


推荐阅读