ローカルに立てたgitlab container registryへdocker pushして、さんざん404エラーを食らったのでメモを残しておきます。
エラーの例。
> docker push myname.local/group1/subgroup1/app01:latest
The push refers to repository [myname.local/group1/subgroup1/app01]
aedce5ed85dc: Preparing
e2eb06d8af82: Preparing
error parsing HTTP 404 response body: invalid character '<' looking for beginning of value: "<!DOCTYPE html>\n<html>\n<head>
<以下略>
ポイント
registryで使用するホスト名(ポート番号込み)を、gitlab/dockerで一貫させないとハマります。
環境
動作環境
- gitlab-eeはテスト用なのでdockerで動かした(重要な環境での使用はおすすめしない。all in one containerの構成にはおじさんなので抵抗がある。キッパリ)。
- OS:Ubuntu 21.04
- docker:version 20.10.7, build 20.10.7-0ubuntu1~21.04.1 (ubuntuが配ってるdocker.ioパッケージ)
- container image:gitlab/gitlab-ee:14.3.2-ee.0
- gitlabはnon https
- gitlab側の認証はsshではなくてhttp
設定
gitlab.rb
registry_external_urlに、dockerを動かしてるホストの名前と、80番以外のポートを指定し、更にgitlab_railsも設定(以下"myname.local"をdocker動作ホストのhostname fqdnに置換してください。fqdnでなくてもいいんじゃないかと思いますが私はfqdnで指定しました)
registry_external_url 'http://myname.local:5050'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = "myname.local"
gitlab_rails['registry_port'] = "5050"
docker
registryが非httpsなので、ホストで動作するdockerdにそれを教えてあげる。service側で引数に設定しても動くんじゃないかと思うが、/etc/docker/daemon.jsonで設定した。ポート番号まで込みで教えてあげるのがポイント。defaultで存在しているエントリlocalhost:32000はいらん気がするがとりあえず残した。
{
"insecure-registries" : ["localhost:32000","myname.local:5050"]
}
実行コマンド
docker run
基本的にはマニュアル通りだが、上記gitlab.rbで指定したポートも転送指定する。22番も重複するので変えている。(gitlab.rbでssh止めるほうがいいと思うが、やりかたがすぐにはわからなかったのでpublishで曲げて楽した)
諸々面倒なことを特権で逃げてます。
当たり前ですが変数GITLAB_HOMEは適当に設定してあげてください。
> docker run -it --privileged --hostname myname.local --publish 443:443 --publish 80:80 \
--publish 2022:22 --publish 5050:5050 --name gitlab \
--volume $GITLAB_HOME/config:/etc/gitlab --volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab gitlab/gitlab-ee
docker login, build, tag, push
docker login/build/tag/push は、ポート番号まで込みで実行する。
loginの場合、ポート指定なし(80で動作)でもSuccessするが、それではpushしたときに404になる。
Passwordはgitlabで発行しておいたtokenを指定する。token発行時にregistry read/write権限は必須だとは思うがそれなしだとどうなるかは未検証。めんどくさいのでrepository read/write含めて全部付与したという・・・
> docker login myname.local:5050
Username: hogehoge
Password:
WARNING! Your password will be stored unencrypted in /home/xxx/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
image名にも一貫性を持たせる必要がある。docker tagはこんな感じ。
> docker tag myimage myname.local:5050/group1/subgroup1/app01:0.1
必然的にdocker pushも、ポート番号込みのイメージを使うことになります。一貫してますね。
> docker push myname.local:5050/group1/subgroup1/app01:0.1
おしまい。