Mailuのイメージ取得エラー

mailuを使っていて、事情によりdockerイメージを削除してしまった。再度取得すれば良いと思っていたのだが、そうは行かなかった。これほど苦労するとは思わず。

状況としてはこうだ。

  • mailu-1.8を使用していた。
  • docker側に保存されたすべてを削除。How to clean up Dockerにあるように、「cd /var/lib/docker; rm -rf *」とした。
  • dockerを再起動
  • 他のコンテナを起動すると、元のイメージを取得して何事もなかったように動く
  • ただし、自分で作成した必須のネットワークは削除されているので再作成。「docker network create 云々」
  • ところが、mailuだけは、エラーが発生して動作しない。

もちろん注意点としては、先のクリーンアップを行うと、ボリュームもすべて消えてしまうことである。つまり、ボリュームに依存していると痛い目を見ることになる。

そして、mailuのエラーの原因としては、2.0になってからDockerHubではなく、Githubを使うようになったのは良いものの、2.0以前のバージョンを移行しておらず、単純にDockerHubから消されてしまったことである。つまり、ローカルのDockerイメージを削除してしまった以上、2.0にバージョンアップせざるを得なくなった。

docker-compose up時にエラー

「docker-compose up -d」を行うと、次のエラーが出力される。

Pulling front (mailu/nginx:1.8)...
ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.

Continue with the new image? [yN]y
Pulling front (mailu/nginx:1.8)...
ERROR: pull access denied for mailu/nginx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

そもそもこのエラーメッセージがかなり不適当で恐ろしげなので誤解してしまう。

エラー内容の意味

“The image for the service you’re trying to recreate has been removed”に説明がある。

このメッセージは、「再作成しようとしているサービスのイメージは削除されました。このまま続行すると、ボリュームデータが失われる可能性があります。続行する前にデータのバックアップを検討してください。」という意味だが、先の書き込みでは、これは不適当で次に変更した方が良いという提案をしている。「再作成しようとしているサービスのイメージは削除されました(またはイメージが非公開のため、’docker login’が必要な場合があります)。続行するとボリュームデータが失われる可能性があります。続行する前にデータのバックアップを検討してください。」。

つまり、取得しようとしているレジストリからイメージが削除されたということらしい。以前はDocker Hubからごく普通に取得できていたイメージにも関わらず、今は取得できないらしい。いったんローカルのイメージを削除してしまったため、ローカル側には残っていないのである。かといって、Docker Hubからも削除されてしまったらしい。

MailuがDockerHubから消えている

対策としては、Switch from docker hub to ghcr.io (github) にあるのだが、.envに以下を記述しろという。

DOCKER_ORG=ghcr.io/mailu

しかしこれではうまくいかない。

ReleaseNotesの「Mailu 2.0 – 2023-04-03」を見てみると、

The Mailu project has moved to ghcr.io for hosting the docker images. The images on docker.io will be taken down after this release.

とある。ひどいことに、2.0をghcr.ioに置いたのは良いのだが、古いバージョンをそちらに移動せず、単純にDockerHubから消してしまったらしい。

単純に2.0に変更してみる

単純に、.envに先の文言を入れ、docker-compose.ymlを以下のように2.0に変更する。

# Core services
  front:
    image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}nginx:${MAILU_VERSION:-2.0}
    restart: always
    env_file: mailu.env
    logging:
      driver: json-file
  その他すべてを2.0に変更

しかし、これではまともに動かないようだ。後からわかったのだが、webmail関係の名称が変更になっており取得できない。

設定ファイルの作成し直し

結局以下の方針で行くことにした。

  • 新たな2.0バージョンにて、設定ファイルを作成。Mailu configurationにて行う。
  • 1.8バージョンの設定ファイルと見比べて修正すべきところを修正

ボタンクリックすると、次のページに以下の指示が現れるので、これでダウンロードする。

設定ファイルの修正点

修正点はほぼなかった。

mailu.envに関して

  • SECRET_KEYを旧バージョンのものに置き換えた(何に使われるのか知らないが、同じであることが望ましいと思うので)。
  • DISABLE_STATISTICS=Trueにした。

docker-compose.ymlに関して

  • Volumesが絶対パスになっているのを、docker-compose.ymlファイルからの相対に変更
  • ポートにサーバIPアドレスがついているのを削除。80番ポートは削除(Traefikが専有するため)
      ports:
       #- "80:80"
       - "8443:443"
       - "25:25"
      云々

以上である。

再度起動

LetsEncryptの証明書は期限が切れていないため、80番ポートは不要かと思ったがそうではなかった。エラーになってしまう。何かしら確認をするようで、このポートがどうしても必要。いったんtraefikを止め、上の80番のコメントをはずし、80番を使わせてやるようにするとすべてうまく行った。その後にまた、80番を除去し、traefikを起動した。

教訓

  • Dockerイメージがネット上に残っているとは限らない
  • 正直メールシステムが動作しないのは極めて不安である
  • Dockerを動作させていると、際限なくゴミが溜まってしまうようだ。これを定期的に除去し、かつディスク容量不足の通知システムをつけた方がよい(それがそもそもの発端)。