在Dockerfile中获取分支名称

时间:2019-11-19 17:36:28

标签: git docker dockerfile gitlab-ci

在我的Dockerfile中,我复制并构建前端:

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

我要更改以下行:

RUN sed -i "s|VERSION|frontend@$(cat "VERSION")|g" src/environments/environment.prod.ts

在开头有一个分支名称,所以它看起来像:

RUN sed -i "s|VERSION|`**BRANCH_NAME**`-frontend@$(cat "VERSION")|g" src/environments/environment.prod.ts

所以我想以某种方式在我的dockerfile中获取分支名称。 但是我不确定是否可以在dockerfile中使用分支/提交名称?

这是我的gitlab-ci.yaml文件:

build:
  stage: build
  before_script:
    - docker login -u gitlab-ci-token -p "$CI_JOB_TOKEN" registry.xx.xx
  script:
    - export TARGET=frontend
    - export IMAGE=$CI_REGISTRY_IMAGE/$TARGET
    - docker pull $IMAGE:$CI_COMMIT_REF_NAME || echo "no branch 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 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

3 个答案:

答案 0 :(得分:1)

您可以做的是在您的ARG中添加一个Dockerfile,称为BRANCH_NAME,并将其与--build-arg一起传递。

以下将创建一个构建arg,如果没有将构建arg传递给docker构建,则默认为master:

FROM node:8.11 as frontend

ARG BRANCH_NAME=master
...
...

您的管道将包括如下所示的docker构建步骤:

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

从那里,您可以将参数用作Dockerfile中的变量。

答案 1 :(得分:1)

CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_NAMECI_COMMIT_REF_NAMECI_MERGE_REQUEST_SOURCE_BRANCH_NAME等几个环境变量可以帮助您实现这一目标

最初,我会说CI_COMMIT_REF_NAME是为您工作的人。 但是,应使用哪一种取决于触发条件的条件,甚至触发YAML文件的设置。请查看以下链接,以检查哪个最适合您的工作以及需要考虑的事项。https://docs.gitlab.com/ee/ci/variables/predefined_variables.html

答案 2 :(得分:1)

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

我不了解gitlab的CI。但我看到您刚刚将前端复制到/ frontend。我假设您在前端中有.git文件夹,对吗?

如果是这种情况,为什么不使用它呢?在复制前端之后:

RUN cd /frontend/ &&  BRANCH_NAME=$(git branch | grep \* | cut -d ' ' -f2) && export BRANCH_NAME

所以现在您将BRANCH_NAME作为环境变量。

RUN sed -i "s|VERSION|`$BRANCH_NAME`-frontend@$(cat "VERSION")|g" src/environments/environment.prod.ts