Dockerイメージの公開にGitLabが最高

created at 2018/02/17 17:02:07

Dockerイメージを公開するのにGitLabが最:star:高だったので紹介します。GitHubとDockerHubを使うより遥かに良いです。

以前GitLabを使っていくと言ったんですがその続報です。

nownab.log | GitLabを使うぞ

この記事のGitLabという言葉はだいたいSaaS版のGitLab.comを指しています。

なにがいいの

特にいいと感じているのはこの2つです。

  • とにかく簡単 :sparkles:
  • とにかく速い :rocket:

もう2つ大きいのは次の2つです。

  • GitLabだけで完結する
  • 無料で無制限

ってところです。

どれぐらい簡単なの

簡単なサンプルを用意しました。

nownabe / docker-sample-app · GitLab

GitLabでDockerイメージを公開する場合、このようにDockerfile.gitlab-ci.ymlを用意するだけです。他にはProject1を作ったぐらいで、設定もなにもしてません。

.gitlab-ci.ymlも凝ったことしなければ同じYAMLが使いまわせます。

GitHub + DockerHubだと、公開したことある人はわかると思いますが結構めんどくさいです。GitHubにレポジトリ作って、DockerHubにAutomatedBuildのレジストリ作って、ビルドの設定して、みたいなことをする必要があります。他のCIサービスでビルドする場合は追加でCIの設定して、認証の設定してみたいな感じです。

速い!! :rocket:

ソースコードをPushしてからイメージが公開されるまでがめちゃくちゃ速いです。サンプルで試したときは、ローカルからPushして、どれどれCIはちゃんと動いてるかなーとブラウザ開くともうイメージが公開されてました :flushed: 爆速です。

他のCIサービスやDockerHubでビルドすると早くても数分、10分以上かかることも珍しくありません。特にDockerHubは遅くて、数時間たっても終わらないことも多いのでこれはありがたいですね。

GitLab CI/CD

GitLabにはTravisCIのようなCIが組み込まれています。使い始めるには.gitlab-ci.ymlをコミットするだけです。他に設定はいりません。

GitLab CI/CDで検索すると自分でGitLabを運用するためのドキュメント等がでてきて難しそうですが、SaaS版使うには関係ないので無視しましょう。GitLab Runnerという単語が見えたら無視して良いドキュメントです。

先程のサンプルだと.gitlab-ci.ymlはこんな感じになってます。

.gitlab-ci.yml
image: docker:latest
services:
  - docker:dind

variables:
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME

before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

build:
  script:
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG

特にTravisCIを使ったことがある人はすんなり読めるかなーと思います。シンプルですね。

GitLab Container Registry

GitLabにはDockerイメージのRegistryも組み込まれています。ホスト名はregistry.gitlab.comでイメージ名はProject名と一致します。なので、さっきのサンプルを実行するには次のようにします。

docker run registry.gitlab.com/nownabe/docker-sample-app:latest

非公開イメージのPullやイメージのPushには認証が必要です。他のRegistryと同じくdocker loginコマンドを使います。

GitLab Ci/CD + Container Registry

CIとRegistryの連携も非常に簡単になるようにできています。

ビルドしたイメージのPushにはRegistryへのログインが必要になりますが、これがまた非常に簡単にできるようになっています。

docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

また、CI_REGISTRY_IMAGEという環境変数にはRegistryにおけるDockerイメージ名が格納されており、イメージタグの指定がとても簡単にできます。

variables:
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME

build:
  script:
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG

CI_COMMIT_REF_NAMEにはGitのブランチ名かタグ名が格納されています。なので、こうしておけば次のような運用が簡単にできます。

  • Merge Request2を出したらそれがすぐDockerイメージとして使える状態になるので、簡単にテスト環境にデプロイしたりできる
  • 複数バージョンを公開しときたいイメージなんかはGitタグを切っておけば、それに従ってDockerイメージも複数バージョン公開される

他のCIサービスで頑張って認証の設定したり、DockerHubでGitHubのブランチとDockerHubのタグを頑張って対応付けたりする必要がないので素晴らしく楽です。

これはGitレポジトリ、CI、Dockerレジストリが統合されてないと実現できない強みですね。

感想

GitLabはものすごいスピードで機能が増えてるのは知ってて、多機能ゆえに使いづらいんじゃないかと思ってましたが全然そんなことはありませんでした。多くの機能を簡単に使えるように工夫されていてとても好感触です。

まだ触ってない機能もいっぱいあるっぽいし、他に罠があるか、なんか制限があるか、とかもこれからで知らないことは多いですがより積極的に使っていきたいです。

とりあえずDockerイメージを公開するときはGitLab一択ですね :kissing_heart:


  1. GitHubでいうレポジトリ 

  2. GitHubでいうPull Request