Смонтировать хост-том 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 ответ:
Я нашел способ иметь
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-ступенчатую сборку :
- постройте с помощью
Dockerfile
все, что не нуждается в доступе кAFS
.- выполните сценарий, который будет запускать контейнер из этого образа, смонтировав
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"