If you want to use Docker containers in production, chances are you’ll want to store your credentials in a secure way. A way to do that for Docker Swarm is to use Docker secrets.
A secret can be defined easily enough on your swarm manager using the following:
echo "mysupersecurepassword" | docker secret create my_password_secret -
Now, you will probably want to reference secrets from your environment variables, but that is unfortunately not supported yet. In order to do just that, there is a workaround implemented in the official docker Mysql and WordPress containers.
Secrets are accessible from the containers that have access to them by using the file path /run/secrets/my_password_secret, so what you can do, is add another environment variable to your docker-compose, having a custom name (appending _FILE for example)
version: '3.3'
secrets:
my_password_secret:
external: true
services:
db:
image: mysql:5.7
environment:
MYSQL_PASSWORD_FILE: /run/secrets/my_password_secret
And in your container entrypoint, call the following function for each environment variable you have set up.
file_env() { local var="$1" local fileVar="${var}_FILE" local def="${2:-}" if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
echo >&2 "error: both $var and $fileVar are set (but are exclusive)" exit 1 fi
local val="$def" if [ "${!var:-}" ]; then
val="${!var}" elif [ "${!fileVar:-}" ]; then
val="$(< "${!fileVar}")" fi
export "$var"="$val" unset "$fileVar" }
This will export the value stored in the secret, to the correct environment variable (MYSQL_PASSWORD in this case)