Docker Community Forums

Share and learn in the Docker community.

Newbie Question. Trouble Deploying Stack due to internal DNS hostname resolution

Hi,

I am new to Docker but am experimenting with some images to make sure that I fully understand how all it works. As part of this, I am trying to run a mail server using Mailu and the images on the docker hub. I can create the containers using a basic docker installation. However, I am having trouble deploying the containers using Docker’s swarm functionality. For my tests I am following the instructions on the Mailu Github

I have set up my docker install as a single node swarm and am starting the various services using the following docker-compose file (VERSION is 1.7):

version: '3.2'

services:

  front:
    image: mailu/nginx:${VERSION}
    env_file: mailu.env
    ports:
      - target: 80
        published: 80
      - target: 443
        published: 443
      - target: 110
        published: 110
      - target: 143
        published: 143
      - target: 993
        published: 993
      - target: 995
        published: 995
      - target: 25
        published: 25
      - target: 465
        published: 465
      - target: 587
        published: 587
    volumes:
      - "/mailu/certs:/certs"
    depends_on:
      - admin
    deploy:
      replicas: 1

  redis:
    image: redis:alpine
    volumes:
      - "/mailu/redis:/data"
    deploy:
      replicas: 1

  imap:
    image: mailu/dovecot:${VERSION}
    env_file: mailu.env
    volumes:
      - "/mailu/mail:/mail"
      - "/mailu/overrides:/overrides"
    depends_on:
      - front
    deploy:
      replicas: 1

  smtp:
    image: mailu/postfix:${VERSION}
    env_file: mailu.env
    environment:
      - POD_ADDRESS_RANGE=10.0.1.0/24
    volumes:
      - "/mailu/overrides:/overrides"
    deploy:
      replicas: 1

  antispam:
    image: mailu/rspamd:${VERSION}
    env_file: mailu.env
    environment:
      - POD_ADDRESS_RANGE=10.0.1.0/24
    volumes:
      - "/mailu/filter:/var/lib/rspamd"
      - "/mailu/dkim:/dkim"
      - "/mailu/overrides/rspamd:/etc/rspamd/override.d"
    deploy:
      replicas: 1

  antivirus:
    image: mailu/none
    env_file: mailu.env
    volumes:
      - "/mailu/filter:/data"
    deploy:
      replicas: 1

  webdav:
    image: mailu/none
    env_file: mailu.env
    volumes:
      - "/mailu/dav:/data"
    deploy:
      replicas: 1

  admin:
    image: mailu/admin:${VERSION}
    env_file: mailu.env
    environment:
      - POD_ADDRESS_RANGE=10.0.1.0/24
    volumes:
      - "/mailu/data:/data"
      - "/mailu/dkim:/dkim"
      - /var/run/docker.sock:/var/run/docker.sock:ro
    depends_on:
      - redis
      - webmail
      - antispam
    deploy:
      replicas: 1

  webmail:
    image: mailu/roundcube:${VERSION}
    env_file: mailu.env
    volumes:
      - "/mailu/webmail:/data"
    depends_on:
      - imap
    deploy:
      replicas: 1

  fetchmail:
    image: mailu/fetchmail:${VERSION}
    env_file: mailu.env
    deploy:
      replicas: 1

networks:
  default:
    external:
      name: mailu_default

and the following environment file:

# Mailu main configuration file
#
# This file is autogenerated by the configuration management wizard for stack flavor.
# For a detailed list of configuration variables, see the documentation at
# https://mailu.io

###################################
# Common configuration variables
###################################

# Set to a randomly generated 16 bytes string
SECRET_KEY=Z1C4RNMO1P3T2PPD

# Subnet of the docker network. This should not conflict with any networks to which your system is connected. (Internal and external!)
SUBNET=10.0.1.0/24

# Main mail domain
DOMAIN=mail.stampatron.com

# Hostnames for this server, separated with comas
HOSTNAMES=mail.stampatron.com

# Postmaster local part (will append the main mail domain)
POSTMASTER=admin

# Choose how secure connections will behave (value: letsencrypt, cert, notls, mail, mail-letsencrypt)
#  TLS_FLAVOR=letsencrypt
TLS_FLAVOR=notls

# Authentication rate limit (per source IP address)
AUTH_RATELIMIT=10/minute;1000/hour 

# Opt-out of statistics, replace with "True" to opt out
DISABLE_STATISTICS=True

INITIAL_ADMIN_ACCOUNT=``root``
INITIAL_ADMIN_DOMAIN=``stampatron.com``
INITIAL_ADMIN_PW=``password`` 
INITIAL_ADMIN_MODE=update

###################################
# Optional features
###################################

# Expose the admin interface (value: true, false)
ADMIN=true
# ADMIN=false

# Choose which webmail to run if any (values: roundcube, rainloop, none)
WEBMAIL=roundcube

# Dav server implementation (value: radicale, none)
WEBDAV=none

# Antivirus solution (value: clamav, none)
ANTIVIRUS=none

###################################
# Mail settings
###################################

# Message size limit in bytes
# Default: accept messages up to 50MB
# Max attachment size will be 33% smaller
MESSAGE_SIZE_LIMIT=50000000

# Networks granted relay permissions
# Use this with care, all hosts in this networks will be able to send mail without authentication!
RELAYNETS=

# Will relay all outgoing mails if configured
RELAYHOST=

# Fetchmail delay
FETCHMAIL_DELAY=600

# Recipient delimiter, character used to delimiter localpart from custom address part
RECIPIENT_DELIMITER=+

# DMARC rua and ruf email
DMARC_RUA=admin
DMARC_RUF=admin

# Welcome email, enable and set a topic and body if you wish to send welcome
# emails to all users.
WELCOME=false
WELCOME_SUBJECT=Welcome to your new email account
WELCOME_BODY=Welcome to your new email account, if you can read this, then it is configured properly!

# Maildir Compression
# choose compression-method, default: none (value: bz2, gz)
COMPRESSION=
# change compression-level, default: 6 (value: 1-9)
COMPRESSION_LEVEL=

###################################
# Web settings
###################################

# Path to redirect / to
WEBROOT_REDIRECT=/webmail

# Path to the admin interface if enabled
WEB_ADMIN=/admin

# Path to the webmail if enabled
WEB_WEBMAIL=/webmail

# Website name
SITENAME=stampatron

# Linked Website URL
WEBSITE=https://blog.stampatron.com

###################################
# Advanced settings
###################################

# Log driver for front service. Possible values:
# json-file (default)
# journald (On systemd platforms, useful for Fail2Ban integration)
# syslog (Non systemd platforms, Fail2Ban integration. Disables `docker-compose log` for front!)
# LOG_DRIVER=json-file

# Docker-compose project name, this will prepended to containers names.
COMPOSE_PROJECT_NAME=mailu

# Default password scheme used for newly created accounts and changed passwords
# (value: BLF-CRYPT, SHA512-CRYPT, SHA256-CRYPT, MD5-CRYPT, CRYPT)
PASSWORD_SCHEME=BLF-CRYPT

# Header to take the real ip from
REAL_IP_HEADER=

# IPs for nginx set_real_ip_from (CIDR list separated by commas)
REAL_IP_FROM=

# choose wether mailu bounces (no) or rejects (yes) mail when recipient is unknown (value: yes, no)
REJECT_UNLISTED_RECIPIENT=

# Log level threshold in start.py (value: CRITICAL, ERROR, WARNING, INFO, DEBUG, NOTSET)
LOG_LEVEL=DEBUG

###################################
# Database settings
###################################
DB_FLAVOR=sqlite

Some of the services are failing to create any replicas when started. I have reviewed the start.py scripts in the failing containers and the problem seems to be that the start script tries to resolve the hostnames of other containers before proceeding. This works fine in a non-swarm setup but the hostnames no longer resolve when using a swarm until the container finishes starting. Due to a cycle where the smtp service tries to resolve the IP of the admin portal and the admin portal tries to resolve the IP of the smtp service some containers can no longer start.

According to the Github guide the containers should work in a swarm configuration and I can’t see anything that I am doing wrong. Could anyone advise if I am missing anything. Alternatively can anyone confirm when a service updates a replica to be flagged as started in general?

The details of my installation and steps to run are as follows:

OS - Linux Manjaro (running in virtualbox)
App Version - Docker version 19.03.7-ce, build 7141c199a2
Steps to reproduce - run docker stack deploy -c docker-compose.yml mailu

Thanks