Dans vos exemples, les variables d'environnement sont définies à partir de secrets, mais uniquement pour ce processus.
Si vous voulez que les variables d'environnement d'exécution soient définies à partir des secrets, vous devrez soit monter un volume contenant les secrets, soit passer les secrets via docker-compose, dans les deux cas, puis utiliser un point d'entrée script pour définir les secrets en fonction des emplacements des secrets.
Remarque : les fichiers secrets devront être accessibles à toute personne ou service qui exécutera le fichier docker.
Ajouter un point d'entrée script à votre Dockerfile
Dockerfile :
FROM alpine
# Bash is needed for the script to set env_vars based on secrets
RUN apk upgrade --update-cache --available && \
apk add bash \
&& rm -rf /var/cache/apk/*
# Adding entrypoint script to image
COPY ./docker_entrypoint /usr/local/bin/docker_entrypoint
RUN chmod +x /usr/local/bin/docker_entrypoint
ENTRYPOINT [ "docker_entrypoint"]
CMD ["printenv"]
Ce script va chercher une variable d'environnement au format ENVAR_FILE
pour trouver le chemin de l'endroit où le secret est stocké - exporter le secret vers une variable d'environnement sans l'option _FILE
et ensuite appeler la commande restante.
docker_entrypoint :
#!/usr/bin/env bash
set -e
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"
}
# Explicitly list the environment variables you want to
# set from secrets
file_env "ENVAR1"
file_env "ENVAR2"
exec "$@"
Maintenant, vous pourriez passer des variables d'environnement du format ENVAR_FILE=/mnt/path/to/secret - et le point d'entrée ci-dessus script lira le contenu de ce fichier et générera les variables ENVAR=quelque soit votreSecretIs
Un exemple utilisant docker-compose :
services:
someService:
image: <imageFromDockerFileAbove>
environment:
- ENVAR1_FILE=/run/secrets/envar1
- ENVAR2_FILE=/run/secrets/envar2
secrets:
- envar1
- envar2
secrets:
envar1:
file: /pth/to/secret
envar2:
file: /pth/to/secret
Sortie attendue :
someService_1 | HOSTNAME=<containerID>
someService_1 | ENVAR1=mysecret1
someService_1 | ENVAR2=mysecret2
someService_1 | PWD=/
someService_1 | HOME=/root
someService_1 | SHLVL=0
someService_1 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Et
docker inspect --format='{{json .Config.Env}}' <containerID>
retours :
["ENVAR1_FILE=/run/secrets/envar1","ENVAR2_FILE=/run/secrets/envar2","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"]