web-dev-qa-db-ja.com

gitlab-ci-runner DinDイメージに中間イメージをキャッシュさせるにはどうすればよいですか?

Texlive-fullパッケージのインストールから始まるDockerfileがあります。これは巨大で時間がかかります。ローカルでdocker buildすると、インストール後に作成された中間イメージがキャッシュされ、その後のビルドが高速になります。

ただし、自分のGitLabインストールにプッシュしてGitLab-CIビルドランナーが起動した場合、これは常にゼロから開始し、FROMイメージを再ダウンロードして、apt-getインストールを再度実行するようです。これは私にとって大きな無駄のように思えるので、GitLab DinDイメージを取得してビルド間で中間イメージをキャッシュする方法を見つけようとしています。

--cache-dirコマンドに--docker-cache-dirおよびgitlab-runner registerを使用してみましたが、役に立ちませんでした。

これは、gitlab-runner DinDイメージができるはずのものですか?

私の.gitlab-ci.yml

build_job:
    script:
    - docker build --tag=example/foo .

私のDockerfile

FROM php:5.6-fpm
MAINTAINER Roel Harbers <[email protected]>
RUN apt-get update && apt-get install -qq -y --fix-missing --no-install-recommends texlive-full
RUN echo Do other stuff that has to be done every build.

GitLab CE 8.4.0とgitlab/gitlab-runner:latestをランナーとして使用し、

docker run -d --name gitlab-runner --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/local/gitlab-ci-runner/config:/etc/gitlab-runner \
    gitlab/gitlab-runner:latest \
; \

ランナーは次を使用して登録されます。

docker exec -it gitlab-runner gitlab-runner register \
    --name foo.example.com \
    --url https://gitlab.example.com/ci \
    --cache-dir /cache/build/ \
    --executor docker \
    --docker-image gitlab/dind:latest \
    --docker-privileged \
    --docker-disable-cache false \
    --docker-cache-dir /cache/docker/ \
; \

これにより、次のconfig.tomlが作成されます。

concurrent = 1
[[runners]]
    name = "foo.example.com"
    url = "https://gitlab.example.com/ci"
    token = "foobarsldkflkdsjfkldsj"
    tls-ca-file = ""
    executor = "docker"
    cache_dir = "/cache/build/"
    [runners.docker]
        image = "gitlab/dind:latest"
        privileged = true
        disable_cache = false
        volumes = ["/cache"]
        cache_dir = "/cache/docker/"

cache_dirdocker_cache_dir、およびdisable_cacheに異なる値を試しましたが、すべて同じ結果になりました。キャッシュは一切行われませんでした)

35
Roel Harbers

あなたの質問に対する簡単な答えはないと思います。いくつかの詳細を追加する前に、DinDのメンテナーから このブログ記事 を読むことを強くお勧めします。

あなたが試すことができるのは、/var/lib/docker GitLabランナーのボリュームとして。ただし、ファイルシステムドライバーによっては、ホスト上のAUFSファイルシステム上のコンテナーでAUFSを使用する場合がありますが、これは問題を引き起こす可能性が非常に高いです。

私があなたに提案したいのは、ランナー用のseparateDocker-VM、およびbind-mount docker.sockからVM to runner-containerへ。このセットアップをGitLabで使用し、大きな成功を収めています(約12か月で> 27.000ビルド)。

runner with docker-compose support これは、実際にはGitLabのランナーのShell-executorに基づいています。

14
schmunk

現在、GitLab Docker-in-Dockerで中間層をキャッシュすることはできません。それを追加する計画はありますが、それは以下のリンクで言及されています。 DinDビルドを高速化するために今日できることは、オーバーレイファイルシステムを使用することです。これを行うには、3.18以上のliunxカーネルを実行し、オーバーレイカーネルモジュールをロードする必要があります。次に、gitlab-ci.ymlでこの変数を設定します。

variables:
  DOCKER_DRIVER: overlay

詳細については、この問題、特に「Dockerビルドの最適化の状態」に関するこのコメントを参照してください。「dinkでのdocker executorの使用」セクションを参照してください。

https://gitlab.com/gitlab-org/gitlab-ce/issues/17861#note_12991518

3
Jonas Kello

頻繁に変更されないビルドの依存関係については、gitlabイメージレジストリを使用して手動でキャッシュを行うことができます。 CIスクリプトでは、docker buildを明示的に呼び出すのではなく、シェルスクリプトでラップします

# cat build_dependencies.sh
registry=registry.example.com
project=group/project
imagebase=$registry/$project/linux

docker pull $imagebase/devbase:1.0
if [ $? -ne 0 ]; then
   docker build -f devbase.dockerfile -t $imagebase/devbase:1.0 .
   docker Push $imagebase/devbase:1.0
fi
...

cIでそのスクリプトを呼び出します

  ...
  script:
    - ./build_dependencies.sh

これのマイナス面は、devbase.dockerfileが更新されると、CIに気付かれなくなるため、新しいイメージのビルドとプッシュを強制する必要があることです。そのため、画像を動的に変更する場合、これはうまく機能しませんが、ユースケースでは、これは可能な方法のように思えます。

0
Slava