2

イメージからアクセスしていくつかのアプリケーションをインストールするCentOS 7リポジトリをセットアップしました。OpenAFSこのプロセスは完全に手動であり、GitLab-CI.

Docker-in-Docker runner を設定するための指示に従って、ランナーを設定しました。

次に、ホスト ボリューム/etc/gitlab-runner/config.tomlを指定するようにファイルを変更しました ( volumesエントリ)。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]

には、リポジトリ ファイルをからcurrently-being-built-imageにコピーDockerfileするコマンドがあるため、次のコマンドを使用してソフトウェアをインストールできます。RUNAFSyum 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' を stat できません: そのようなファイルまたはディレクトリーはありません

  • ホストマシンではAFSアクセス可能で、レポ ファイルを手動でコピーできます。

  • で作成されたコンテナdocker run --rm --privileged -ti -v /afs:/afs cc7-baseAFSアクセス可能です。

AFSからアクセスできるようにするために何か不足していDockerfileますか?

ノート:

$DOCKER_LOGIN_USERNAMEおよび$DOCKER_LOGIN_PASSWORDGitLabセキュア変数です

4

1 に答える 1

0

AFSと をDocker一緒に持つ方法を見つけましたが、 runnerとは一緒ではありませんでした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グループに追加します)。

ここで述べたようにAFS、から内部のファイルにアクセスすることはできませんDockerfile

代わりに、2 ステップ ビルドを使用できます。

  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 に答える