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

时间:2016-11-23 09:48:21

标签: docker dockerfile gitlab-ci gitlab-ci-runner openafs

我们在CentOS 7中设置了OpenAFS存储库,我们可以从图像中访问这些存储库以安装某些应用程序。 此过程完全是手动的,我们正尝试使用GitLab-CI自动生成。

我在the instructions for setting 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:不能统计   '/afs/hugePathHere/Linux/RPM/cc7/custom-repo.repo':   没有这样的文件或目录

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

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

我是否遗漏了某些内容,AFS可以访问Dockerfile

注意:

$DOCKER_LOGIN_USERNAME$DOCKER_LOGIN_PASSWORDGitLab secure variables

1 个答案:

答案 0 :(得分: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"

之后,我们只需要to install Docker并将其设置为gitlab-runner用户(例如,将用户添加到docker组)。

作为stated here,我们无法从AFS访问Dockerfile内的文件。

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

  1. 使用Dockerfile构建无需访问AFS的所有内容。
  2. 执行一个脚本,该脚本将从该图像运行容器,并安装AFS并安装所有AFS相关内容。
  3. 然后,我们只需提交容器并将其作为最终图像推送到注册表。

    例如,此过程中涉及的文件可能是这样的:

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