現象
ケース 1
systemctl
コマンドまたは service
コマンドを使用、またはサービス マシンを再起動することで Replicated を再起動すると、Replicated コンテナが消失し、最終的に CircleCI Server がクラッシュしてしまった。
ケース 2
サービス マシンで apt
または apt-get
コマンドを使用して docker-ce
を更新すると、Replicated コンテナが消失し、最終的に CircleCI Server がクラッシュしてしまった。
原因
ケース 1 の原因は、systemd
に登録された Replicated サービス (replicated.service
、replicated-operator.service
、replicated-ui.service
など) により、サービスの起動時に Docker コンテナが削除されたことです。ケース 2 の原因は、Replicated サービスで使用される Docker イメージ名を利用できないタイミングが生じたことが原因です。
systemctl
または service
コマンドで起動シーケンスを明示的に開始するか、システムの再起動または docker-ce
の更新によりこのシーケンスが暗黙的に開始されると、その最中に Replicated サービスは以下のタスクを実行します。
- 既存の Replicated コンテナを削除する。
:current
とタグ付けされた対応する Docker イメージを使用して (quay.io/replicated/replicated:current
など)、docker run
コマンドで新しいコンテナを起動する。
しかし、:current
イメージは、他の Docker イメージから派生してローカルでタグ付けされる Docker イメージであり、このタグはイメージのプルに使用することはできません。 そのため、何らかの原因で :current
タグが解除された場合、Replicated サービスは使用する Docker イメージを見つけることができず、起動に失敗します。
注: :current
タグが解除される現象は、docker image prune -a
コマンドなどを使用して Docker イメージ キャッシュをクリーンアップすることで容易に再現できます。 Replicated が実行中であるかどうかにかかわらず、docker image prune -a
を実行すると Replicated の :current
イメージ タグが解除されることが確認されています。 つまり、お使いのサービス マシンで docker image prune -a
コマンドまたは同等のコマンドを今までに実行したことが 1 度でもあれば、同様の現象が発生する可能性があります。
解決策
この問題は、以下のスニペットを使用して Replicated を再インストールすることで解決できます。
export REPLICATED_VERSION="2.38.6"
export PRIVATE_IP="$(curl http://169.254.169.254/latest/meta-data/local-ipv4)"
sudo curl -sSk -o /tmp/get_replicated.sh "https://get.replicated.com/docker?replicated_tag=$REPLICATED_VERSION&replicated_ui_tag=$REPLICATED_VERSION&replicated_operator_tag=$REPLICATED_VERSION"
sudo bash /tmp/get_replicated.sh local-address="$PRIVATE_IP" no-proxy no-docker