Tengo un script utilizado en la preparación de una imagen de Docker. Tengo esto en el Dockerfile:
COPY my_script / RUN bash -c "/my_script" El archivo my_script contiene secretos que no quiero en la imagen (se elimina solo cuando termina).
El problema es que el archivo permanece en la imagen a pesar de haber sido borrado porque la COPIA es una capa aparte. Lo que necesito es que tanto COPIAR como EJECUTAR afecten a la misma capa.
¿Cómo puedo COPIAR y EJECUTAR un script para que ambas acciones afecten a la misma capa?
echa un vistazo a multi-etapa :
Usar compilaciones de varias etapas
Con las compilaciones de varias etapas, usa varias instrucciones FROM en su Dockerfile. Cada instrucción FROM puede usar una base diferente, y cada una de ellas comienza una nueva etapa de la construcción. Puede copiar artefactos de forma selectiva de una etapa a otra, dejando atrás todo lo que no desea en la imagen final . Para mostrar cómo funciona esto, adaptemos el Dockerfile de la sección anterior para usar compilaciones de varias etapas.
archivo acoplable:
FROM golang:1.7.3 WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=0 /go/src/github.com/alexellis/href-counter/app . CMD ["./app"]A partir del 18.09, puede usar docker build --secret para usar información secreta durante el proceso de compilación. Los secretos se montan en el entorno de compilación y no se almacenan en la imagen final.
RUN --mount=type=secret,id=script,dst=/my_script \ bash -c /my_script $ docker build --secret id=script,src=my_script.shEl script no necesitaría borrarse solo.
Esto puede ser manejado por BuildKit:
# syntax=docker/dockerfile:experimental FROM ... RUN --mount=type=bind,target=/my_script,source=my_script,rw \ bash -c "/my_script"Entonces construirías con:
DOCKER_BUILDKIT=1 docker build -t my_image .Esto también suena como si estuviera tratando de inyectar secretos en la compilación, por ejemplo, para extraerlos de un repositorio privado de git. BuildKit también le permite especificar:
# syntax=docker/dockerfile:experimental FROM ... RUN --mount=type=secret,target=/creds,id=cred \ bash -c "/my_script -i /creds"Entonces construirías con:
DOCKER_BUILDKIT=1 docker build -t my_image --secret id=creds,src=./creds .Con ambas opciones de BuildKit, el comando de montaje nunca agrega el archivo a su imagen. Solo hace que el archivo esté disponible como un montaje de enlace durante ese único paso de EJECUTAR. Mientras ese paso EJECUTAR no envíe el secreto a otro archivo en su imagen, el secreto nunca se inyecta en la imagen.
Para obtener más información sobre la sintaxis experimental de BuildKit, consulte: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md