我在 Go 中创建了一个程序,它接收参数 project_id
和 private_token
。基本上我就是这样做的:
project_id := flag.String("project", "", "The id of the project")
private_token := flag.String("pat", "", "The personal access token with api and read user permissions")
flag.Parse()
我创建了以下 docker 镜像:
FROM golang:1.16-alpine
WORKDIR /app
COPY . /app
RUN go build
ENV PROJECT=""
ENV PRIVATE_TOKEN=""
ENTRYPOINT "./my-program" "-project" $PROJECT "-pat" $PRIVATE_TOKEN
我通过运行来运行图像:
docker run -e PROJECT=29065042 -e PRIVATE_TOKEN="glpat-1CHf9T8Nz98W8ZzyT7V4" --rm -it my-image-name
如您所见,我正在传递一个私有(private) token ,这是一个敏感数据。我想知道这是否是将敏感数据从 docker 传递到我的 go 程序的最佳方法,或者是否有更好的模式?
最佳答案
使用 docker 在 Go 应用程序中存储和使用敏感数据的方法有多种。每种方法都有其优点和缺点。
1。在代码中硬编码 secret 。(永远不要这样做)
const (
PROJECT_NAME = "MyProject"
PRIVATE_TOKEN="kjdnioqvnocw"
)
2。将 secret 放入环境变量中,从 .env 文件加载。
有两个包可以轻松使用 .env 文件,godotenv和 viper ,我更喜欢 godotenv 因为它更容易。
3。将 secret 放入专门的 secret 管理器,例如Vault by HashiCorp , Secret Manager by Google Cloud . Parameter Store通过 AWS , Azure Key Vault来自 Azure
所以选择实际上是在上面的第 2 项和第 3 项之间。您选择哪一个将取决于您的 secret 有多敏感以及使用专门的 secret 管理器需要多少额外工作。例如,如果您的项目在 Google Cloud Platform 上运行,Secret Manager 只需一次 API 调用即可。在其他主要云平台上可能同样容易,但我没有使用它们的第一手经验。
https://stackoverflow.com/questions/72903738/