在 GitLab-CI runner 中挂载 OpenAFS 主机卷以使其在 Docker 中可访问

Mount OpenAFS host volume in GitLab-CI runner to make it accesible in Docker

我们在 OpenAFS 中设置了一个 CentOS 7 存储库,我们可以从我们的图像访问它来安装一些应用程序。 这个过程完全是手动的,我们正在尝试使用 GitLab-CI.

自动生成

我在 the instructions for setting Docker-in-Docker runner.

之后设置了一个跑步者

然后,我修改了 /etc/gitlab-runner/config.toml 文件以指定 OpenAFS 主机卷(volumes 条目):

concurrent = 1
check_interval = 0

[[runners]]
  name = "DinD builder"
  url = "https://gitlab.ch/ci"
  token = "7cf33172d567dd2504e988a78f64c3"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = true
    disable_cache = false
    volumes = ["/afs:/afs:ro", "/cache"]
  [runners.cache]

Dockerfile 中,我们有一个 RUN 命令将 repo 文件从 AFS 复制到 currently-being-built-image, 所以我们可以用 yum install:

安装软件
FROM gitlab-registry.ch/cc7-base

MAINTAINER Somebody

RUN echo "set completion-ignore-case On" >> /etc/inputrc
RUN yum update -y && \
    yum install -y \
        gcc \
        git \
        mc \
        python-devel \
        python-pip \
        svn \
        unzip \
        vim

RUN cp /afs/<hugePathHere>/Linux/RPM/cc7/custom-repo.repo /etc/yum.repos.d && \
    yum install --enablerepo=custom-repo -y CustomApp

CMD /bin/bash

.gitlab-ci.yml 文件是:

services:
  - docker:dind

build:
  stage: build
  tags:
    - rtf-builder
  before_script:
    - docker info
    - docker login -u $DOCKER_LOGIN_USERNAME -p $DOCKER_LOGIN_PASSWORD gitlab-registry.ch
  script:
    - docker build --pull -t $TO .
    - docker push $TO
  after_script:
    - docker logout gitlab-registry.ch
  variables:
    TO: gitlab-registry.ch/<myUser>/testdockergitlabbuild:$CI_BUILD_REF_NAME

但这总是失败,GitLab-CI 告诉我

cp: cannot stat '/afs/hugePathHere/Linux/RPM/cc7/custom-repo.repo': No such file or directory

我是否遗漏了一些让 AFS 可以从 Dockerfile 访问的东西?

注意:

$DOCKER_LOGIN_USERNAME$DOCKER_LOGIN_PASSWORDGitLab secure variables

我找到了将 AFSDocker 放在一起的方法, 但不是 Docker-in-Docker 运行ner

诀窍是使用 shell 运行ner。 所以当注册 运行ner时,我们应该这样做:

sudo gitlab-ci-multi-runner register -n \
  --url <GITLAB_CI_SERVER_URL> \
  --registration-token <PROJECT_TOKEN> \
  --executor shell \
  --tag-list "shell-builder" \
  --description "Shell builder for Docker images"

之后,我们只需要 to install Docker 并将其提供给 gitlab-runner 用户(例如,将用户添加到 docker 组)。

作为stated here,我们无法从Dockerfile访问AFS内的文件。

相反,我们可以使用 2 步构建:

  1. 使用 Dockerfile 构建不需要访问 AFS 的所有内容。
  2. 执行一个脚本,该脚本将从该图像 运行 一个容器,安装 AFS 并安装所有 AFS 相关的东西。

然后,我们只需提交容器并将其作为最终镜像推送到注册表即可。


例如,此过程中涉及的文件可能是这样的:

.gitlab-ci.yml

stages:
  - build

variables:
  TO: <GitLab Registry URL>/<project>:$CI_BUILD_REF_NAME

build:
  stage: build
  tags:
    - shell-builder
  before_script:
    - docker login -u $DOCKER_LOGIN_USERNAME -p $DOCKER_LOGIN_PASSWORD <GitLab Registry URL>
  script:
    - docker build --pull -t $TO .
  after_script:
    - sh ./postBuild.sh $TO $GITLAB_USER_EMAIL
    - docker push $TO
    - docker logout <GitLab Registry URL>

Docker 文件

FROM <Some base image>

MAINTAINER <Somebody>

<Do everything not related to AFS>

CMD /bin/bash

postBuild.sh

#!/bin/bash

readonly imageName=""
readonly maintainer=""

readonly imageNameAsLatest="$imageName-latest"
readonly containerName="afs_mounted"

docker create -ti --privileged -v /afs:/afs --name="$containerName" "$imageName"
docker start "$containerName"

docker exec "$containerName" /bin/bash -c "cp /afs/LONG_AFS_PATH/Linux/CentOS7/custom-repo.repo /etc/yum.repos.d"
docker exec "$containerName" /bin/bash -c "yum install --enablerepo=custom-repo -y CustomApplication"

docker commit -a "$maintainer" -m "Mounted AFS in a container and installed CustomApplication." "$containerName" "$imageName"

docker tag "$imageName" "$imageNameAsLatest"

docker stop "$containerName"
docker rm "$containerName"