Gitlab:构建docker容器,然后使用它进行编译

Gitlab: build docker container, then use it for compilation

这是我的 .gitlab-ci.yml

stages:
   - containerize
   - compile

build_image:
  image: docker
  stage: containerize
  script:
    - docker build -t compiler_image_v0 .

compile:
  image: compiler_image_v0
  stage: compile
  script:
    - make
  artifacts:
    when: on_success
    paths:
      - output/
    expire_in: 1 day

build_image 是 运行 正确的,在带有跑步者的机器上使用 docker images 命令时会列出创建的图像。但是第二个作业失败并出现错误:

ERROR: Job failed: Error response from daemon: pull access denied for compiler_image_v0, repository does not exist or may require 'docker login' (executor_docker.go:168:1s)

怎么回事?

这是我的Dockerfile

FROM ubuntu:18.04

WORKDIR /app

# Ubuntu packages
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install apt-utils subversion g++ make cmake unzip
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install libgtk2.*common libpango-1* libasound2* xserver-xorg
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install cpio
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install bash
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install autoconf automake perl m4

# Intel Fortran compiler
RUN mkdir /intel
COPY parallel_studio_xe_2018_3_pro_for_docker.zip  /intel
RUN cd /intel && unzip /intel/parallel_studio_xe_2018_3_pro_for_docker.zip
RUN cd /intel/parallel_studio_xe_2018_3_pro_for_docker && ./install.sh --silent=custom_silent.cfg
RUN rm -rf /intel

阶段编译尝试拉取映像 compiler_image_v0。此图像仅临时存在于阶段 containerize 的 docker 容器中。你的 gitlab 存储库中有一个容器注册表,可以在 containerize 阶段推送构建的镜像,然后在 compile 阶段拉取它。此外:您应该提供您的私有 gitlab 注册表的全名。我认为默认使用 dockerhub。

您可以更改 .gitlab.ci.yaml 以添加推送命令并使用全名图像:

stages:
   - containerize
   - compile

build_image:
  image: docker
  stage: containerize
  script:
    - docker build -t compiler_image_v0 .
    - docker push registry.gitlab.com/group-name/repo-name:compiler_image_v0

compile:
  image: registry.gitlab.com/group-name/repo-name:compiler_image_v0
  stage: compile
  script:
    - make
  artifacts:
    when: on_success
    paths:
      - output/
    expire_in: 1 day

这会在每次构建时覆盖图像。但是您可以添加一些版本控制。