2

我们已经设置了一个CentOS 7存储库OpenAFS,我们可以从我们的图像访问以安装一些应用程序。这个过程完全是手动的,我们正在尝试使用GitLab-CI.

我已经按照设置 Docker-in-Docker runner 的说明设置了一个跑步者。

然后,我修改了/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命令将 repo 文件从复制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: cannot stat '/afs/ hugePathHere /Linux/RPM/cc7/custom-repo.repo': 没有这样的文件或目录

  • 主机中,AFS可以访问,我可以手动复制 repo 文件。

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

我是否遗漏了一些可以从中AFS访问的东西Dockerfile

笔记:

$DOCKER_LOGIN_USERNAME并且$DOCKER_LOGIN_PASSWORDGitLab 安全变量

4

1 回答 1

0

我找到了一种拥有AFSDocker在一起的方法,但不是和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组中)。

如此处所述,我们无法AFSDockerfile.

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

  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"
于 2016-11-23T15:53:50.450 回答