构建TIdb的arm架构镜像

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:

  • 【问题描述】:构建pingcap/alpine-glibc对应的基础镜像
    官方TIKV的运行依赖的基础镜像是pingcap/alpine-glibc ,这是不是必需是得依赖这样的一个基础镜像才能run起来的。
    查看了一下docker hub的这个镜像我写出了下面这样一个构建ARM架构镜像的Dockerfile文件
    FROM arm64v8/alpine:3.9

    MAINTAINER lydeng yuandeng.lu@denalisystem.com

    CMD [“/bin/sh”]
    ENV LANG=C.UTF-8

    Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.

    RUN ALPINE_GLIBC_BASE_URL=“https://github.com/sgerrand/alpine-pkg-glibc/releases/download” &&
    ALPINE_GLIBC_PACKAGE_VERSION=“2.30-r0” &&
    ALPINE_GLIBC_BASE_PACKAGE_FILENAME=“glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk” &&
    ALPINE_GLIBC_BIN_PACKAGE_FILENAME=“glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk” &&
    ALPINE_GLIBC_I18N_PACKAGE_FILENAME=“glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk” &&
    apk add --no-cache --virtual=.build-dependencies wget ca-certificates &&
    echo
    “-----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m
    y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu
    tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp
    m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY
    KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc
    Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m
    1QIDAQAB
    -----END PUBLIC KEY-----” | sed ‘s/ */
    /g’ > “/etc/apk/keys/sgerrand.rsa.pub” &&
    wget
    “$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME”
    “$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME”
    “$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME” &&
    apk add --no-cache
    “$ALPINE_GLIBC_BASE_PACKAGE_FILENAME”
    “$ALPINE_GLIBC_BIN_PACKAGE_FILENAME”
    “$ALPINE_GLIBC_I18N_PACKAGE_FILENAME” &&

      rm "/etc/apk/keys/sgerrand.rsa.pub" && 
      /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true && 
      echo "export LANG=$LANG" > /etc/profile.d/locale.sh && 
      
      apk del glibc-i18n && 
      
      rm "/root/.wget-hsts" && 
      apk del .build-dependencies && 
      rm 
          "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" 
          "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" 
          "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"
    

    ENV TZ=UTC
    RUN apk update && apk add tzdata

但是构建报错了 ,错误如下:
image

请教一下该如何解决?

官方TIKV的运行依赖的基础镜像是pingcap/alpine-glibc

Hi,能了解一下具体运行的环境(生产/测试/本地开发)和部署方式(TiDB Operator,Docker Compose,etc.) 吗?

如果是生产环境的话,"arm with docker " 的架构还在测试和开发中,官方现在还没正式公布,无论是功能和性能都尚待更全面的验证,不推荐上生产。

如果是其他环境的话,又是出于什么需求要跑 arm 环境的 TiDB/TiKV/PD 镜像呢?具体形式是?

我这边是docker k8s集群环境前期已经在AMD架构的系统运行和测试过Tidb方案。。 现在我们这边采购了两台ARM架构的自主可控服务器,我们这边的目标是做一套从硬件到软件完全自主可控的解决方案,所以希望TIdb可以跑在ARM架构的服务器上。。 由于我也看到官方未提供ARM镜像、所以只能自己尝试编译构建了~

1 个赞

谢谢补充~~看来咱们主要的目标还是希望验证一下这整套 ARM 的方案并跑起来。

由于编译环境需要的依赖繁多,而容器环境运行服务的最佳实践是将镜像轻量化,缩小体积减少依赖,可否将编译和运行分离成两步呢:

  1. 在物理环境(也就是采购的 ARM 机器)上编译出对应二进制包。
  2. 再使用一个较干净的 arm Docker 环境,直接将 tikv-server、tidb-server、pd-server COPY 进去跑。

这样一来整个流程既属于自主可控,又可以将问题分开来解决,避免在 docker 环境下处理各种复杂的依赖问题。

看到一个相关的帖子 我们来在ARM系统架构平台上K8s跑TIDB 目前的进度是已经编译出 tikv-server 了(也就是第一步),可以试试用以下 Dockerfile 做个运行时的镜像(即第二步):

FROM arm64v8/alpine:3.10
ENV TZ /etc/localtime
ENV TZDIR /usr/share/zoneinfo
COPY tikv-server /tikv-server
EXPOSE 20160
ENTRYPOINT ["/tikv-server"]

那个也是我发的呀· · 不知道你这个能否跑起来·· 我这直接让依赖ubunt的镜像 像这样加进去构建了一个ARM的tikv。 迟一些再试能否跑起来。。 跑起来后再去考虑轻量化的问题了··

但是我现在在build monitoring的时候遇上一点问题 麻烦你帮忙看一下·

make
ARCH unknown
GOOS=linux go build -o ./reload/build/linux/reload  ./reload/main.go; 
    GOOS=darwin go build -o ./reload/build/macos/reload  ./reload/main.go; 

go: k8s.io/client-go@v12.0.0+incompatible: reading https://goproxy.io/k8s.io/client-go/@v/v12.0.0+incompatible.mod: 410 Gone
go: k8s.io/client-go@v12.0.0+incompatible: reading https://goproxy.io/k8s.io/client-go/@v/v12.0.0+incompatible.mod: 410 Gone
Makefile:6: recipe for target 'all' failed
make: *** [all] Error 1

monitoring make执行的时候报了错 。是go版本不对吗? 还是要怎么编

是构建那个 tidb-monitor-reloader : v1.0.1

好,tikv 我们试试直接在镜像里跑编译好的 binary。

这个问题和网络原因有关,因为默认使用了 google 的代理,试下如下命令:

不开代理
1. GOPROXY=direct make
使用在国内搭的代理
2. GOPROXY=https://goproxy.cn,direct make

GOPROXY=https://goproxy.cn,direct make build make: *** No rule to make target ‘build’。 停止。

执行后如上 不能往下执行

抱歉,命令打多了,把 build 去掉,就在原来的 make 命令前面加环境变量

好的 可以往下了

command-line-arguments

/usr/local/go/pkg/tool/linux_arm64/link: running gcc failed: exit status 1 /usr/bin/ld:无法识别的 -a 选项‘gezero_size’ collect2: error: ld returned 1 exit status

Makefile:6: recipe for target ‘all’ failed make: *** [all] Error 2

这个 Makefile 会先后 build linux 和 mac 下的包:

GOOS=linux go build -o ./reload/build/linux/reload ./reload/main.go;

GOOS=darwin go build -o ./reload/build/linux/reload ./reload/main.go;

第二句命令是多余的,属于一个 bug,已反馈给社区。 实际上现在已经 build 成功了,可以检查一下生成的 ./reload/build/linux/reload

哦 是的·· 在这目录有文件了·· 多谢!

prom/prometheus grafana/grafana

tidb官方有没有改动过 是不是可以直接用最原始的就可以了

是的!

tidb-cloud-backup

tidb-enterprise-tools 这个的dockerfile在那 可以提供一下给我吗

对应 Dockerfile 是

FROM pingcap/alpine-glibc:mysql_client
COPY mydumper /mydumper
COPY importer /importer
COPY loader /loader
COPY syncer /syncer
CMD ["/syncer"]

从 history 里可以看到,比 alpine-glibc 多打了一个 mysql-client 进去。 https://hub.docker.com/layers/pingcap/alpine-glibc/mysql_client/images/sha256-03ea34292211cd48e58048aad7f2073259b4b1872ac23abdb729a8fae3d57fdf

另外咱们现阶段是不是可以先不去打工具镜像,先让服务在线上跑起来呢?否则会面临编译许多周边工具的工作量。

嗯 又面临一个工具包·· 并且COPY mydumper /mydumper COPY importer /importer COPY loader /loader COPY syncer /syncer那几个工具包还不知道去那下载下来·

我还是先跑主服务吧·· 这backup的可后续再打·

1 个赞

:+1::+1:

监控跑起来有点问题··
reloader 找不到文件
应该是因为找不到etc/prometheus/rules文件
这个文件我们打镜像的时候是没有的哦
是prometheus挂载出来的吗? 我应该如何修改