在 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
可以访问,我可以手动复制
回购文件。
使用 docker run --rm --privileged -ti -v /afs:/afs cc7-base
创建的容器
AFS
可访问。
我是否遗漏了一些让 AFS
可以从 Dockerfile
访问的东西?
注意:
$DOCKER_LOGIN_USERNAME
和 $DOCKER_LOGIN_PASSWORD
是 GitLab secure variables。
我找到了将 AFS
和 Docker
放在一起的方法, 但不是 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 步构建:
- 使用
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>
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"
我们在 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
可以访问,我可以手动复制 回购文件。使用
docker run --rm --privileged -ti -v /afs:/afs cc7-base
创建的容器AFS
可访问。
我是否遗漏了一些让 AFS
可以从 Dockerfile
访问的东西?
注意:
$DOCKER_LOGIN_USERNAME
和 $DOCKER_LOGIN_PASSWORD
是 GitLab secure variables。
我找到了将 AFS
和 Docker
放在一起的方法, 但不是 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 步构建:
- 使用
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>
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"