はじめに
みなさん、GitHubActionsって使ったことありますか?
多分これを読んでいる方は使ったことがあるのだと思います。
今回は、GitHubActionsで自前のDockerRegistryにPushしようとして詰まった話を書いていきたいと思います。
何があったのか
当時、私の構築したDockerRegistryはMicrok8sのアドオンのContainer-registryで建てたものでした。
しかし、これは当たり前ですが、Nginxを通していなかったので、SSL化されていませんでした。
なぜNginxを通していなかったかというとですね...グローバルIPの固定がされていなかったため、IngressのIPv6→Cloudflareという形でIPv4もプロキシを通して公開できるようにしていたのです。
しかし、ここで問題があり、Cloudflareを通すと、一回のアップロード制限がかかり、DockerPushに失敗するのです。
そこで、IPv6をそのまま指定したり、IPv4のポート指定でゴリ押そうとしたりしてハマったことを書いていこうと思います。
IPv6は使えない
まず、GitHub側が用意してくれているDockerPushのWorkflowのホストのところをIPv6にして実行してみました。
結果
そもそもホストに辿り着かない皆のエラー...
ふぁ!?ですよね。
なぜだと思って、調べてみましたが、全く見つからず...
pingを飛ばすflowも組んでみましたが、GoogleのIPv6にすら繋がらなかったので、もしかするとGitHubActionsがIPv6に対応していないのかもしれません。
何はともあれ、IPv6は諦めました。
Insecureの設定をする
ローカルのDockerでやった設定を思い出すと、何やらJSONのDockerの設定ファイルを編集した覚えがあります。
つまりは...「GitHubActions上でもDockerConfigをいじっちゃえばいいんだ!!」
ということで、/etc/docker/daemon.json
を編集してみました。
- name: Enable Docker configuration
run: |
SW_JSON=""
SW_JSON="$(sudo cat /etc/docker/daemon.json | jq '.+{ "insecure-registries":["${{ secrets.K8S_DOCKER_REGISTHOST }}"],"max-concurrent-uploads": 1,"debug":true }')"
echo "${SW_JSON}" | sudo bash -c 'cat -- > /etc/docker/daemon.json'
sudo cat /etc/docker/daemon.json
sudo systemctl restart docker || sudo journalctl -xeu docker.service
sudo systemctl status docker
shell: bash
上から何をしているかというと、
- SW_KSONに元からある
/etc/docker/daemon.json
を編集して、insecure-registriesに対象のホストを追加 -
/etc/docker/daemon.json
に書き込む - dockerを再起動し、ログを表示
- 最後にステータスを表示
これで、DockerにInsecureRegistry(SSL通信ができないRegistry)であることを設定でき、問題なく動貸すことができました。
最後に
今回のは少々やばいRegistryを使っていたんですよね。
というのも、認証もSSLもないとかいうガバガバだったのですよ...
最終的には、HarborというHelmChartのRepoにもなるようなものを導入しました。
IPv4問題は、VPSにNginxを入れてリバースプロキシさせて解決しました。
Harborについては、以下の記事でも紹介しているので、興味がある方は読んでいただくと幸せになれるかもしれません。