Docker Compose の portsプロパティ で array items[0,1] must be unique エラー

経緯

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 "array items" "must be unique" とか docker compose "must be unique" とかにしていましたが、それでも、という感。

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。