TiDB镜像构建时带有dirty后缀的问题

因为安全需求,我们需要更换TiDB的底层镜像
但按照官方教程打包镜像的时候遇到了一个问题
我发现打包后的TiDB镜像带有一个dirty的后缀,排查后发现原因如下

  1. TiDB Repo中有一个.dockerignore,其中包含Dockerfile
  2. 打包指令会把TiDB Repo作为工作目录,并将其中的文件拷贝到镜像中进行编译
-- 打包
docker build --load -t localhost/tidb:local-build -f dockerfiles/cd/builders/tidb/Dockerfile ../tidb
-- 复制Repo到镜像内部编译
-- https://github.com/PingCAP-QE/artifacts/blob/main/dockerfiles/cd/builders/tidb/Dockerfile#L30
COPY . /ws
  1. 此时因为工作目录中的ignore,COPY会忽略Repo中原有的Dockerfile,这就会导致COPY的内容缺失,编译时发现内容出现了变动,LDFLAGS被标记为dirty

我想要把这个dirty去掉,麻烦问一下该怎么做?

把dockerignore删了再打

你只需要换底层镜像的话,何必编译一遍tidb呢?
直接copy二进制不香吗

# 第一阶段:构建阶段
FROM pingcap/tidb:latest AS builder

# 设置工作目录
WORKDIR /app

# 第二阶段:运行阶段
FROM golang:1.20

# 设置工作目录
WORKDIR /app

# 从构建阶段复制构建产物
# 假设构建产物是一个二进制文件 myapp
COPY --from=builder /tidb-server .

# 运行应用程序
CMD ["./myapp"]

上述代码来自于chatgpt,你可以适当改改

1. 调整 .dockerignore 文件

首先,检查您的 .dockerignore 文件,确保它不包含 Dockerfile。如果 Dockerignore 文件中包含 Dockerfile,Docker 构建过程中会忽略它,导致构建过程中缺少关键文件。您可以将 Dockerfile.dockerignore 中移除,或者确保 .dockerignore 不影响构建上下文。

2. 调整构建上下文

在执行 docker build 命令时,您需要指定正确的构建上下文。根据您的描述,您希望使用 dockerfiles/cd/builders/tidb/Dockerfile 作为 Dockerfile,并且将 tidb 目录作为构建上下文。您可以通过以下命令实现:

docker build --load -t localhost/tidb:local-build -f dockerfiles/cd/builders/tidb/Dockerfile --build-arg BUILD_CONTEXT=../tidb ../tidb

这里,--build-arg BUILD_CONTEXT=../tidb 指定了构建上下文为 ../tidb 目录。

3. 修改 Dockerfile

Dockerfile 中,确保正确地复制所有必要的文件。如果 COPY . /ws 命令导致问题,您可以考虑只复制必要的文件,例如:

COPY Dockerfile /ws
COPY go /ws/go
COPY scripts /ws/scripts
# 其他必要的文件或目录

这样,您可以精确控制哪些文件被复制到镜像中,避免因 .dockerignore 导致的文件遗漏问题。

4. 清理构建环境

确保在构建之前清理构建环境,避免旧的构建产物影响新的构建。您可以在 Dockerfile 中添加清理命令,或者在构建之前手动清理工作目录。

5. 检查构建日志

在构建过程中,仔细检查构建日志,查看是否有任何错误或警告信息。这些信息可以帮助您诊断问题。

6. 重新构建

在进行上述调整后,重新执行构建命令,检查是否解决了问题。。