From 189dd6000ee37350342d246a910e1da8b384fb45 Mon Sep 17 00:00:00 2001 From: Joshua Tauberer Date: Fri, 2 May 2014 14:23:56 -0400 Subject: [PATCH] docker: re-run the start script on the container's first run because it won't know its hostname or IP address until then --- Dockerfile | 12 +++++++----- containers/docker/start_services.sh | 21 +++++++++++++++++++++ scripts/system.sh | 4 +++- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index c60a164..520c6f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,10 +5,11 @@ # To build the image: # sudo docker.io build -t box . -# To run a container for testing (with a command prompt and no publicly exposed ports): -# sudo docker.io run -i -t -P box +# Run your container the first time with an interactive console so you can +# create your first mail account. +# sudo docker.io run -i -t box -# Or to run in the background and expose all of the ports so that the *host* acts as a Mail-in-a-Box: +# Then run it in the background and expose all of the ports so that the *host* acts as a Mail-in-a-Box: # (the SSH port is only available locally, but other ports are exposed publicly and must be available # otherwise the container won't start) # sudo docker.io run -d -p 22 -p 25:25 -p 53:53/udp -p 443:443 -p 587:587 -p 993:993 box @@ -18,9 +19,10 @@ MAINTAINER Joshua Tauberer (http://razor.occams.info) # We can't know these values ahead of time, so set them to something # obviously local. The start.sh script will need to be run again once -# these values are known. +# these values are known. We use the IP address here as a flag that +# the configuration is incomplete. ENV PUBLIC_HOSTNAME box.local -ENV PUBLIC_IP 127.0.123.123 +ENV PUBLIC_IP 192.168.200.1 # Docker-specific Mail-in-a-Box configuration. ENV DISABLE_FIREWALL 1 diff --git a/containers/docker/start_services.sh b/containers/docker/start_services.sh index 25639aa..08bafe4 100644 --- a/containers/docker/start_services.sh +++ b/containers/docker/start_services.sh @@ -1,4 +1,25 @@ #!/bin/bash + +# The PUBLIC_HOSTNAME and PUBLIC_IP is not known at the time the docker +# image is built. On the first run of the container, re-run the start +# script with actual values. That will also ask the user for their first +# email user account. +if grep "^PUBLIC_IP=192.168.200.1" /etc/mailinabox.conf > /dev/null; then + echo "Configuring container on first run..." + + # Get the public IP address of the host machine. + export PUBLIC_IP=`curl -s icanhazip.com` + echo Your IP address is $PUBLIC_IP. + + # Get the reverse DNS of that IP address. + export PUBLIC_HOSTNAME=`host $PUBLIC_IP | sed -e "s/.* //" | sed -e "s/\.$//"` + echo Your hostname is $PUBLIC_HOSTNAME. + + # Start configuration again. + cd /usr/local/mailinabox + scripts/start.sh +fi + echo "Starting Mail-in-a-Box services..." service nsd start diff --git a/scripts/system.sh b/scripts/system.sh index 1e7afc2..76e33d2 100755 --- a/scripts/system.sh +++ b/scripts/system.sh @@ -20,7 +20,9 @@ if grep -q "^PasswordAuthentication yes" /etc/ssh/sshd_config \ exit fi -apt_install python3 +# Install basic utilities. + +apt_install python3 curl bind9-host # Turn on basic services: #