2025年2月

过去一个月算是过得很充实了,除了日常开发之外还写了个小工具,做了点翻译工作,顺便处理了之前服务器迁移剩下的杂项

开发

  • 后端:这个月的重心在开发新项目,API 接口目前进度 80%
  • 前端:重新入门 React,学习 tailwindcss
  • 其他:接手了一个十年前的老项目,成功在 Docker 搭好环境并且跑起来了

小工具

最近用 gin 写的项目比较多,每个新项目都要手动复制一套模板很麻烦,而且用了 wire 来做依赖注入之后新增 controllerservice 等等都需要手动更新 wire.go,于是写了个类似于 Laravel artisan 的小工具,可以快速创建新项目和各种组件。

项目地址:https://github.com/YianAndCode/tipsy

新文章 & 翻译

翻译:《Writing an Operating System in 1,000 Lines》:在线阅读,GitHub 地址:https://github.com/nuta/operating-system-in-1000-lines

新文章:《用 Dockerfile 构建镜像时用 build secrets 安全优雅地传递敏感数据》


这个月的总结似乎不算多,主要就是上面提到的东西在快速迭代中,也算是进入心流状态了吧,还是比较开心的 :-P

起因是这样的,我有一个 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 的基本知识:

- 阅读剩余部分 -