¿Hay alguna forma de establecer variables de entorno a partir de las nuevas mejoras de compilación de la ventana acoplable?
He intentado
RUN --mount=type=secret,id=secret export SECRET=`/run/secrets/secret RUN --mount=type=secret,id=secret ENV SECRET=`/run/secrets/secret Ambos no funcionan. ¿O es malo establecer secretos en las variables de entorno en dockerfile? Desde que se ejecutó el docker history a la variable env configurada en texto sin formato. Si ese es el caso, ¿cuál es la mejor manera de configurar el env var lo más seguro posible?
Para establecer una variable desde un secreto, puede usar la sintaxis $(cat /filename) en shell. Esto afecta el shell dentro de ese único paso, por lo que todos los usos de esa variable deben estar dentro del mismo paso. No puede extraer una variable de un paso RUN a un paso ENV. Si necesita que persista en otros pasos EJECUTAR, deberá escribir la variable en el sistema de archivos e incluirla en la imagen, lo cual no es deseable (en su lugar, simplemente monte el secreto por segunda vez en el paso EJECUTAR posterior).
Aquí hay un ejemplo de trabajo, también puede exportar ese secreto con export secret_var :
$ cat df.secret FROM busybox RUN --mount=type=secret,id=secret \ secret_var="$(cat /run/secrets/secret)" \ && echo ${secret_var} $ cat secret.txt my_secret $ docker build --progress=plain --secret id=secret,src=$(pwd)/secret.txt -f df.secret . #1 [internal] load build definition from df.secret #1 sha256:85a18e77d3e60159b744d6ee3d96908a6fed0bd4f6a46d038e2aa0201a1028de #1 DONE 0.0s #1 [internal] load build definition from df.secret #1 sha256:85a18e77d3e60159b744d6ee3d96908a6fed0bd4f6a46d038e2aa0201a1028de #1 transferring dockerfile: 152B done #1 DONE 0.0s #2 [internal] load .dockerignore #2 sha256:a5a676bca3eaa2c757a3ae40d8d5d5e91b980822056c5b3b6c5b3169fc65f0f1 #2 transferring context: 49B done #2 DONE 0.0s #3 [internal] load metadata for docker.io/library/busybox:latest #3 sha256:da853382a7535e068feae4d80bdd0ad2567df3d5cd484fd68f919294d091b053 #3 DONE 0.0s #5 [1/2] FROM docker.io/library/busybox #5 sha256:08a03f3ffe5fba421a6403c31e153425ced631d108868f30e04985f99d69326e #5 DONE 0.0s #4 [2/2] RUN --mount=type=secret,id=secret secret=$(cat /run/secrets/secret) && echo ${secret} #4 sha256:6ef91a8a7daf012253f58dba292a0bd86af1d1a33a90838b6a99aba5abd4cfaf #4 0.587 my_secret #4 DONE 0.7s #6 exporting to image #6 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00 #6 exporting layers 0.0s done #6 writing image sha256:a52db3458ad88481406cd60627e2ed6f55b6720c1614f65fa8f453247a9aa4de done #6 DONE 0.0s Tenga en cuenta la línea #4 0.587 my_secret que muestra que se emitió el secreto.
En sus ejemplos, las variables de entorno se establecen a partir de secretos, pero solo para ese proceso.
Si desea que las variables de entorno de tiempo de ejecución se establezcan a partir de secretos, deberá montar un volumen que contenga los secretos o pasar los secretos a través de docker-compose, en cualquier caso, luego utilice un script de punto de entrada para establecer los secretos en función de lugares secretos.
Nota: los archivos secretos deberán estar disponibles para cualquier persona o servicio que ejecute el archivo dockerfile.
Agregue un script de punto de entrada a su Dockerfile
archivo acoplable:
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"] Este script buscará variables de entorno con el formato ENVAR_FILE para encontrar la ruta donde se almacena el secreto: exporte el secreto a una variable de entorno sin _FILE y luego llame al comando restante.
docker_punto de entrada:
#!/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 "$@"Ahora puede pasar variables de entorno con el formato ENVAR_FILE=/mnt/path/to/secret - y el script de punto de entrada anterior leerá el contenido de ese archivo y generará las variables ENVAR=whateverYourSecretIs
Un ejemplo usando 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/secretRendimiento esperado:
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:/binY
docker inspect --format='{{json .Config.Env}}' <containerID>
devoluciones:
["ENVAR1_FILE=/run/secrets/envar1","ENVAR2_FILE=/run/secrets/envar2","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"]