使えない公式イメージ

仕事でDockerを少し使っているのだが、ある日、いくつかのコンテナが起動していないことに気づいた。

 

sudo docker ps

2xxxxwer778   quay.io/keycloak/keycloak:16.1.1
"/opt/jboss/tools/do…"   2 months ago   Restarting (1) 29 seconds ago     mycocntainer

 

みたいな感じで、ずっとRestarting状態から抜け出せない。docker execでコンテナに入ろうとしても起動してないからだめというメッセージを見て、起動してないんだということに気づいた。

 

起動しないコンテナのDockerログを見てみると

sudo docker logs --tail 50 --follow --timestamps mycontainer

 

以下のような記録が延々と出続けている。

・・・

2023-06-15T08:50:39.922505424Z User with username 'admin' already
added to '/opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json'

2023-06-15T08:51:44.547412651Z User with username 'admin' already
added to '/opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json'

2023-06-15T08:52:49.037525653Z User with username 'admin' already
added to '/opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json'

2023-06-15T08:53:53.244346779Z User with username 'admin' already
added to '/opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json'

 

このコンテナはKeycloak16の公式Dokerイメージから作ったらしい。他の人が作業したので詳しく知らない。ただ、他の起動していないコンテナも「quay.io/keycloak/keycloak:16.1.1」から作られてた。おそらくこれが何かの原因だと思った。ちなみにKeycloak21のイメージから作ったコンテナは問題なく動いている。

 

ネットで情報を探し回っていたところ、公式イメージのバグではないかというやりとりを発見。英語だからよくわからないけど、プルリクエストを出すとかなんとか。

Restarting Keycloak-Container after DB is available again · Issue #352 · keycloak/keycloak-containers · GitHub

 

でも、1年以上前のやりとりだしなー、未だに16のバグほったらかし?

このイメージからコンテナを作るとき、こんな感じで管理者ユーザを指定してるみたい。環境変数で渡している。のかな?

docker run -d -p 8080:8080 --name=keycloak_container -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=password jboss/keycloak:16.1.1

 

仕組みはわからないが、コンテナ作って起動するときに管理者ユーザを追加・登録する何かが動いているのだろう。先のコンテナが起動できないときのログ見ると、既に存在している同じ名前の管理者ユーザを追加しようとして失敗を繰り返している感じ。サーバは毎日再起動していて、コンテナもその都度自動起動させているのだが、コンテナ作るときの1回だけでいいものを、いつの頃からか、コンテナの起動時にまたやろうとするようになったような感じ。

 

ChatGPTにどうしたらいいか聞いたら、keycloak-add-user.jsonを消してしまえのとの回答。しかし、コンテナが起動していないのでコンテナに入ることも、ホストOSから消すこともできない。

しかし、Restartingということは、サーバ起動時にコンテナが起動する最初だけは一瞬だけ起動できてるはず。と思って、次の方法を試したら消すことができた。

 

sudo docker stop mycocntainer
sudo docker start mycocntainer
sudo docker exec mycocntainer rm /opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json

 

2つ目のstartの直後に3つ目のdocker execを実行するのがコツ。僅かの間だけ起動できている瞬間を狙って、ホストOSから該当コンテナのファイルを消す。

これで無事コンテナは起動して、Keycloakも起動できた。

環境変数でKeycloakの管理者ユーザを指定してコンテナを作るのがだめ、とどこかのサイトで見たのだが、どこだか忘れた。どこかのサイトでそうやって作るんだぞと説明があったのに。じゃあ、どうすればいいのだろうか?普通にコンテナ作ってから、コンテナに入って管理者ユーザ追加のコマンド打てばいいのかな。

そこらへんがわからないと、本番環境には怖くて使えない。