経緯
Docker Compose で Dovecot サーバを構成している最中、以下のエラーが発生したので原因と対処をメモしておきます。
service.DOVECOTHOSTNAME.ports array items[0,1] must be unique
構成
このときの構成は以下。
.env
DOVE_HOST_PORTNUM=110
DOVE_CONTAINER_PORTNUM=110
DOVE_HOST_PORTSSL=995
DOVE_CONTAINER_PORTSSL=995
Dockerfile
# Debian image
FROM dovecot/dovecot
# import rpm sigunature & dnf install
RUN apt-get -y update \
&& apt-get -y install less \
vim
# volume directory
RUN mkdir /var/log/dovecot
docker-compose.yml
version: '3.8'
services:
dovecot:
build:
context: ./dovecot/docker
dockerfile: Dockerfile
ports:
- "$DOVE_HOST_PORTNUM:$DOVE_HOST_PORTNUM"
- "$DOVE_CONTAINER_PORTNUM:$DOVE_CONTAINER_PORTNUM"
- "$DOVE_HOST_PORTSSL:$DOVE_HOST_PORTSSL"
- "$DOVE_CONTAINER_PORTSSL:$DOVE_CONTAINER_PORTSSL"
原因と対処
はい、上述の設定で察しが付くかと思いますが、typoというか docker-compose.yml
で初歩的なミスをやらかしていました。
コピペミスでポートの対応が左辺と右辺で同じ変数にしてしまいました。
しかしそれよりも今回の根本的な問題は、検証のためホストのポートとコンテナのポートを同じにしていたため、ポートの配列の値がダブってしまっています(例えば $DOVE_HOST_PORTNUM
= $DOVE_CONTAINER_PORTNUM
= 110
)。なので、タイトルのエラーが発生したものと考えられます。
正しくは以下。
version: '3.8'
services:
dovecot:
build:
context: ./dovecot/docker
dockerfile: Dockerfile
ports:
- "$DOVE_HOST_PORTNUM:$DOVE_CONTAINER_PORTNUM"
- "$DOVE_HOST_PORTSSL:$DOVE_CONTAINER_PORTSSL"
これであっさり起動するようになりました……。
参考 (参考にならず)
- Docker compose error – Troubleshooting – Mattermost Discussion Forums
- Problem with Docker- buid.sh: received: WARNING: The COMPOSE_PROJECT_NAME variable is not set. Defaulting to a blank string – Stack Overflow
エラー文で検索してもこれらしかヒットしなかったので気付くまで時間がかかりました。さすがに配列のキーの部分を抜いて docker compose "array items" "must be unique"
とか docker compose "must be unique"
とかにしていましたが、それでも、という感。