标签 docker 下的文章

起因是这样的,我有一个 Go 写的 utils 库,但这个仓库目前是 private 的,于是在其他引用了这个库的项目构建时就需要解决鉴权访问的问题。

先来看看不使用私有库的 Go 项目构建的 Dockerfile:

# build api
FROM golang:1.23 AS builder

WORKDIR /src/app

COPY . ./

RUN --mount=type=cache,target=/go/pkg/mod \
    make

# build the final image
FROM ubuntu:24.04

COPY --from=builder /src/app/bin/api /app/bin/api

而使用了私有库的话,就需要设置 GOPRIVATE 环境变量和鉴权。

在本地开发的时候我是用的 ssh 来访问 git 仓库的,所以在 ~/.gitconfig 追加如下配置即可:

[url "[email protected]:"]
    insteadOf = https://github.com/

但是使用 Docker 构建的时候继续使用 ssh 就会略麻烦(使用 Deploy key)和不安全(使用个人账号 SSH key),那么细粒度的 Access Token 会是更好的选择。

因为 Access Token 是敏感数据,我们是不能直接写在 Dockerfile 里的,所以你可能会想到那就通过构建参数传进去:

+ARG GITHUB_TOKEN
+ENV TOKEN=$GITHUB_TOKEN

 WORKDIR /src/app

 COPY . ./

+RUN go env -w GOPRIVATE="github.com/YianAndCode/MY_PRIVATE_GO_PKG"

+RUN git config --global url."https://${TOKEN}:[email protected]/".insteadOf "https://github.com/"

 RUN --mount=type=cache,target=/go/pkg/mod \
    make

然后构建:

export GITHUB_TOKEN=xxx
docker build --build-arg GITHUB_TOKEN=${GITHUB_TOKEN} -t myapp:latest .

这时你会得到一个警告:

WARN: SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data

因为这样做别人在拿到镜像之后是可以看到你构建过程中的参数的,也不安全。其实在 Docker 官方文档有介绍 Build secrets,我们可以利用这个功能来实现更安全优雅地传入敏感数据。

首先来学习一下 build secrets 的基本知识:

- 阅读剩余部分 -

上个星期考四级的时候写作文硬是被我东拉西扯扯到了 Computer Science (这个熟悉的话题我才不会慌嘛~),接着狂扯了一大堆计算机名词,心想反正老师你也不懂这些术语,就算我写错了你也不敢乱改,哈哈哈哈~于是写了什么 Docker (其实当时我还不太了解 Docker 是干嘛用的)啊之类的。
今晚复习得好无聊,于是在逛 SF ,又看到了 Docker 相关的问题,上网找了点资料来看,又再一次打开了 Docker 官方的 Tutorial (妈蛋,今晚总算把这个单词的拼写给记住了!),这次耐着性子玩了这个“十分钟教程”,第一次发现原来命令行那么好玩的!
于是先是在朋友的阿里云( CentOS )上面装了个 Docker,然后又在自己的笔记本( Ubuntu 14.04 x64 )上试着装了下。

- 阅读剩余部分 -