我无法运行 dockerbuild 来安装要传递给容器的秘密。 这是一个公共存储库示例,用于显示 github 中的问题: https://github.com/inspiraller/docker-node-get-secrets
Dockerfile
FROM node:20
WORKDIR /usr/src/app
COPY node-files .
RUN npm ci && npm run build
ENV NODE_ENV=production
RUN --mount=type=secret,id=THEPASSWORD1 #,target=./run/secrets/THEPASSWORD1
CMD ["node", "dist/get-secrets.js"]
我尝试遵循 docker 主网站上的指南:https://docs.docker.com/build/building/secrets/
目的是将我的本地文件 ./.secrets/THEPASSWORD1 (包含该值)传递到 /run/secrets/THEPASSWORD1
docker build -t distroless-node-dumbinit:1 --secret id=THEPASSWORD1,src=./.secrets/THEPASSWORD1 --secret id=THEPASSWORD2,src=./.secrets/THEPASSWORD2 --no-cache .
当我运行这个容器时:
docker run --name distroless-node-dumbinit distroless-node-dumbinit:1
没效果
虽然当我使用 docker-compose.yml 时,使用不同的方法确实有效。
我期待 console.log 在我的 get-secrets.js 节点文件中记录 THEPASSWORD1 的值。它期望从 /run/secrets/THEPASSWORD1
获取秘密对于有此问题的其他人。这是一个将秘密传递到图像单行的工作示例。笔记。通常你不会这样做,但这只是为了展示它的工作原理。
Dockerfile
FROM debian:stable-slim
COPY private-install-script.sh .
# ACCESS_TOKEN is only available here and cannot be accessed via the history
RUN --mount=type=secret,id=ACCESS_TOKEN ENV_ACCESS_TOKEN=$(cat /run/secrets/ACCESS_TOKEN) ./private-install-script.sh
# private-install-script.sh is going to output that token back to a file /tmp/dontdothis
RUN ./private-install-script.sh
# display the contents of /tmp/dontdothis
CMD ["cat", "/tmp/dontdothis"]
私人安装脚本.sh
#!/bin/sh
# ON BUILD
echo "ENV_ACCESS_TOKEN=${ENV_ACCESS_TOKEN}. cat run/secrets/ACCESS_TOKEN=$(cat /run/secrets/ACCESS_TOKEN)" > /tmp/dontdothis
通过终端创建秘密 导出 ACCESS_TOKEN=mysupersecret123
创建构建(将使用上面创建的secert)
docker build --secret "id=ACCESS_TOKEN" -t build-secret:1 .
运行构建
docker run --name build-secret build-secret:1
我的超级秘密123
证明秘密无法通过构建访问