首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GitLab转轮中安装OpenAFS主机卷,使其可在码头上使用

在GitLab转轮中安装OpenAFS主机卷,使其可在码头上使用
EN

Stack Overflow用户
提问于 2016-11-23 09:48:20
回答 1查看 592关注 0票数 2

我们已经在CentOS 7中设置了一个OpenAFS存储库,我们可以从映像中访问这个库来安装一些应用程序。这个过程完全是手动的,我们正在尝试用GitLab-CI实现生成的自动化。

我已经设置了一个跟踪设置“码头内转轮”的说明的跑步者。

然后,我修改了/etc/gitlab-runner/config.toml文件以指定一个OpenAFS主机卷(卷条目):

代码语言:javascript
复制
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安装软件。

代码语言:javascript
复制
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文件是:

代码语言:javascript
复制
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安全变量

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-23 15:53:50

我找到了一种让AFSDocker在一起的方法,,而不是 runner

诀窍是使用shell运行程序。因此,在注册跑步者时,我们应该这样做:

代码语言:javascript
复制
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"

之后,我们只需要安装码头并使其对gitlab-runner用户可用(例如,将用户添加到docker组)。

作为在此陈述,我们不能从Dockerfile访问AFS中的文件。

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

  1. 使用Dockerfile构建不需要访问AFS的所有内容。
  2. 执行一个脚本,该脚本将从该映像运行容器,安装AFS并安装所有与AFS相关的内容。

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

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

..gitlab ci.yml

代码语言:javascript
复制
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

代码语言:javascript
复制
FROM <Some base image>

MAINTAINER <Somebody>

<Do everything not related to AFS>

CMD /bin/bash

postBuild.sh

代码语言:javascript
复制
#!/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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40760915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档