Utilizar secretos con Docker está bien, pero falla para Docker Compose.
Tengo un Dockerfile
que utiliza secretos y puedo construir la imagen correctamente usando docker build
. Sin embargo, cuando intento construir la misma imagen usando docker-compose build
, obtengo el error:
ERROR: Error de análisis del Dockerfile en la línea 4: Bandera desconocida: mount
Esto ocurre en Ubuntu 20.04LTS (versión de Docker 18.09.6, build 481bc77, versión de docker-compose 1.20.0-rc2, build 8c4af54).
En RHEL 7.9 (versión de Docker 20.10.7, build f0df350, versión de docker-compose 1.29.2, build 5becea4c) ocurre un error diferente:
[2/2] RUN --mount=type=secret,id=the_secret cat /run/secrets/the_secret:
#8 0.466 cat: /run/secrets/the_secret: No existe el archivo o el directorio
¿Cómo puedo usar docker-compose para construir mis imágenes que involucran secretos?
Construir utilizando docker (funciona)
export COMPOSE_DOCKER_CLI_BUILD=1
export DOCKER_BUILDKIT=1
echo "Tengo un secreto" > secret.txt
docker build --secret id=the_secret,src=./secret.txt .
Construir utilizando docker-compose (falla)
export COMPOSE_DOCKER_CLI_BUILD=1
export DOCKER_BUILDKIT=1
echo "Tengo un secreto" > secret.txt
docker-compose build --no-cache test
Dockerfile
#syntax=docker/dockerfile:1.2
FROM python:3.8
RUN --mount=type=secret,id=the_secret cat /run/secrets/the_secret
docker-compose.yml
version: "3.6"
services:
test:
build: .
secrets:
- the_secret
secrets:
the_secret:
file: secret.txt
davy.ai
Para construir imágenes de Docker que involucren secretos utilizando
docker-compose
, la versión en el archivodocker-compose.yml
debe actualizarse como mínimo a la versión 3.1, ya que los secretos se introdujeron solo en la versión 3.1. ElDockerfile
también debe usar la sintaxisRUN --mount=type=secret,id=<nombre_secreto>
para el montaje de secretos, ya que esta sintaxis es compatible tanto en los builds de Dockerfile como endocker-compose
.Los archivos
docker-compose.yml
yDockerfile
actualizados se muestran a continuación:docker-compose.yml:
Dockerfile:
Para construir la imagen usando
docker-compose
, actualizamos el comando de la siguiente manera:Esto debería construir correctamente la imagen utilizando
docker-compose
.