Смонтировать хост-том OpenAFS в GitLab-CI runner, чтобы сделать его доступным в Docker


Мы установили репозиторий CentOS 7 в OpenAFS, к которому мы получаем доступ из наших образов для установки некоторых приложений. Этот процесс полностью ручной, и мы пытаемся автоматизировать генерацию с помощью GitLab-CI.

Я настроил раннер, следуя инструкциям по настройке 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, которая копирует РЕПО файл из AFS в текущий-строящийся-образ , поэтому мы можем установить программное обеспечение с 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: не может stat '/afs / hugePathHere /Linux/RPM/cc7/custom-repo.РЕПО: Нет такого файла или каталога

  • В хосте машина AFS доступна, и я могу вручную скопировать РЕПО файл.

  • Контейнер, созданный с помощью docker run --rm --privileged -ti -v /afs:/afs cc7-base имеет AFS доступный.

Я что-то упускаю, чтобы сделать AFS доступным из Dockerfile?

Примечание:

$DOCKER_LOGIN_USERNAME и $DOCKER_LOGIN_PASSWORD являются защищенными переменными GitLab.

1 2

1 ответ:

Я нашел способ иметь AFS и Docker вместе, , но не с Docker-in-Docker бегуном.

Фокус в том, чтобы использовать вместо бегуна shell. Поэтому, когда регистрирует бегуна, мы должны сделать это следующим образом:

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"

После этого нам просто нужно установить Docker и сделать его доступным для пользователя gitlab-runner (например, добавив пользователя в группу docker).

Как указано здесь , мы не можем получить доступ к файлам внутриAFS из Dockerfile.

Вместо этого мы можем использовать 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>

Dockerfile

FROM <Some base image>

MAINTAINER <Somebody>

<Do everything not related to AFS>

CMD /bin/bash

PostBuild.sh

#!/bin/bash

readonly imageName="$1"
readonly maintainer="$2"

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"