在GitLab-CI运行器中挂载OpenAFS主机卷,以使其在Docker中可访问

我们在OpenAFS中build立了一个CentOS 7储存库,我们可以从我们的映像中访问安装一些应用程序。 这个过程完全是手动的,我们正在尝试使用GitLab-CI自动生成代码。

我按照设置Docker-in-Docker亚军的说明设置了跑步者 。

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

 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的repo文件复制到当前正在构build的映像中 ,所以我们可以使用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:can stat'/ afs / hugePathHere /Linux/RPM/cc7/custom-repo.repo':没有这样的文件或目录

  • 主机中AFS是可访问的,我可以手动复制回购文件。

  • 使用docker run --rm --privileged -ti -v /afs:/afs cc7-base创build的容器docker run --rm --privileged -ti -v /afs:/afs cc7-base具有AFS访问性。

我错过了什么使AFSDockerfile吗?

注意:

$DOCKER_LOGIN_USERNAME$DOCKER_LOGIN_PASSWORD是GitLab安全variables 。

我find了将AFSDocker结合在一起的方法, 但是却没有使用Docker-in-Docker

诀窍是使用一个shell runner。 所以在注册亚军时,我们应该这样做:

 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用户(例如,将用户添加到gitlab-runner组中)。

如此处所述 ,我们无法从Dockerfile访问AFS内的文件。

相反,我们可以使用两步构build

  1. Dockerfile构build一些不需要访问AFS
  2. 执行一个脚本,从该映像运行一个容器,装载AFS并安装所有与AFS相关的东西。

然后,我们只需提交容器并将其作为最终映像推送到registry。


作为一个例子,这个过程中涉及的文件可能是这样的:

.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"