我们已经在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命令,它将回购文件从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告诉我


  • 在主机中,AFS是可访问的,我可以手动复制
    回购文件。
  • 使用docker run --rm --privileged -ti -v /afs:/afs cc7-base创建的容器
    可以使用AFS

  • 我是否缺少使AFS可访问Dockerfile的内容?

    注意:
    $DOCKER_LOGIN_USERNAME$DOCKER_LOGIN_PASSWORDGitLab secure variables

    最佳答案

    我找到了一种将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中的文件。

    相反,我们可以使用两步构建:
  • 使用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="$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"
    

    关于docker - 在GitLab-CI运行程序中挂载OpenAFS主机卷以使其可在Docker中访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40760915/

    10-16 04:12