当前位置: 首页 > 知识库问答 >
问题:

在GitLab-CI runner中安装OpenAFS主机卷,使其可在Docker中访问

吉玉石
2023-03-14

然后,我修改了/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复制到当前正在构建的映像中,因此我们可以使用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:无法stat“/afs/hugepathhere/linux/rpm/cc7/custom-repo.repo”:没有这样的文件或目录

>

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

    $docker_login_username$docker_login_password是GitLab安全变量。

  • 共有1个答案

    那铭
    2023-03-14

    我找到了一种将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组)。

    正如这里所述,我们无法从DockerFile访问AFS内部的文件。

    1. 使用DockerFile生成不需要访问AFS的所有内容。
    2. 执行将从该映像运行容器的脚本,挂载AFS并安装所有AFS相关内容。

    然后,我们只需提交容器并将其作为最终映像推送到注册表。

    例如,此过程中涉及的文件可能如下所示:

    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>
    
    FROM <Some base image>
    
    MAINTAINER <Somebody>
    
    <Do everything not related to AFS>
    
    CMD /bin/bash
    
    #!/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容器之间共享文件夹 但是我的问题是,这与在Dockerfile中使用命令之间有什么区别 我正在使用带有命令的图像,并且想知道如何与主机共享它。我已经使用上面的命令完成了此操作,但我不知道是否同时需要和和。 问题答案: 该命令将在您的容器中安装一个目录,并将在该目录中创建或编辑的所有文件存储 在容器文件结构外部的 主机磁盘上,绕过联合文件系统。 这个

    • 问题内容: 我有以下工作流程,用于将Web应用发布到我的开发服务器。该服务器只有一个docker主机,我正在使用docker-compose来管理容器。 将我的应用程序中的更改推送到私有gitlab(在docker中运行)。该应用程序包括一个Dockerfile和docker-compose.yml Gitlab触发了一个jenkins构建(jenkins也正在docker中运行),它会执行一些常

    • 问题内容: 我在android项目中使用docker作为GitLab CI运行器。在测试运行结束时,将测试结果保存在build目录下的xml和html中: 我想访问这些文件,但是文档中没有提到如何像那样装载卷。 问题答案: 我建议不要从主机为您的CI装入卷。如果确实需要,则必须相应地配置运行器()。如果使用的是运行程序,则永远不会知道要在哪个系统上执行特定的构建。 我认为更好的解决方案是将测试结果

    • 这是我当前的DockerFile: 我的项目是这样的:

    • 问题内容: 我在Docker容器中安装并将其与主机同步时遇到问题。我的Docker版本是,而Docker Compose版本是。 我的样子是: 我的: 该应用程序运行良好。源代码已同步。热装也很棒。 我唯一的问题是主机上的文件夹为空。是否可以将Docker容器中的文件夹与主机同步? 另外,我已经找到了此博客文章。作者试图解决我面临的同样问题。问题是,由于我们只是将它们从Docker容器复制到主机,