在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
访问性。
我错过了什么使AFS
从Dockerfile
吗?
注意:
$DOCKER_LOGIN_USERNAME
和$DOCKER_LOGIN_PASSWORD
是GitLab安全variables 。
我find了将AFS
和Docker
结合在一起的方法, 但是却没有使用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 :
- 用
Dockerfile
构build一些不需要访问AFS
。 - 执行一个脚本,从该映像运行一个容器,装载
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"