小言_互联网的博客

云计算 | 在ARM64系统上编译安装Gitlab Docker镜像

332人阅读  评论(0)

GitLab 是一个主要由 Ruby on Rails 语言开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问和管理,简而言之就是一个可以私有化部署的 github.com

Gitlab 官方实际上已经提供了 N 种安装和部署的方式,有直接通过操作系统软件源进行安装的,也有通过 Docker 方式部署的,甚至有通过源代码方式自行编译安装的(稍复杂)。

那么为什么这里要选择较复杂的方式呢?因为官方目前构建的软件包或者 Docker 镜像都是基于 X86 架构的,并没有对 ARM64v8 的支持。而通过搜索 Docker Hub 是能够找到构建好的支持 ARM64v8 的 Docker 镜像的,但任然存在一些瑕疵:

  1. 该镜像只能跑在 Ubuntu 系的 Linux 发行版上,在 CentOS 上跑则会出错,因为 Gitlab 使用了 redis,redis 默认依赖 jemalloc,jemalloc 在编译时使用到了操作系统内核 pagesize 参数,Ubuntu 系的 pagesize 是 4K,而 CentOS 则是 64K,在 pagesize 低的系统上编译的软件无法在 pagesize 高的系统上运行。
  2. 即使在 Ubuntu 上能够正常运行,其中个 grafana 组件也会报 Exec format error 错误,这是因为镜像作者在编译时没有注意到其中的 grafana 组件使用的是 X86 的软件包。

基于以上原因,选择自行构建能够在 CentOS 上运行的 Docker 镜像。

 

1 准备编译环境

编译前需要准备一个编译环境的,里面包含编译过程中所需要用到的工具链。这里选择通过 Docker 容器方式来构建编译环境,因为用完即可丢弃,不影响 Host 操作系统的环境。并且官方提供了 Dockerfile,构建起来非常方便:gitlab-omnibus-builder。以 Ubuntu 18.04 为例,官方提供的 Dockerfile 在这里,需要注意的是其中有两处地方使用了 X86 架构的软件包,需要改为 ARM64 版本的,关键之处如下:


  
  1. FROM ubuntu:bionic as builder
  2. ...
  3. 省略
  4. ...
  5. # 下面这里的 go 版本应由 amd64 改为 arm64
  6. RUN curl -fsSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" \
  7. | tar -xzC /usr/ local \
  8. && ln -sf /usr/ local/go/bin/go /usr/ local/go/bin/gofmt /usr/ local/go/bin/godoc /usr/ local/bin/
  9. ...
  10. 省略
  11. ...
  12. # 下面这里的 node 版本应由 x64 改为 arm64
  13. RUN curl -fsSL "https://nodejs.org/download/release/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz" \
  14. | tar --strip-components 1 -xzC /usr/ local/ \
  15. && node --version
  16. ...
  17. 省略
  18. ...

 

2 编译 Gitlab 安装包

根据 Docker Hub 上第三方 ARM64 版 Gitlab 镜像(gitlab-ce-arm64v8)作者提供的构建脚本,发现他在 Gitlab 官方提供的编译脚本上作了几处针对 ARM64 架构的修改,再整合上面提到的遗漏的 grafana 问题,得出的最终编译步骤如下:


  
  1. # 首先运行一个构建环境镜像,其中挂载了一个目录是为了方便将编译好的包拷贝出来:
  2. docker run -it --name gitlab-build -v /output/:/output/ -d gitlab_builder_arm64
  3. # 进入镜像内部并进入 output 目录:
  4. docker exec -it gitlab-build /bin/bash
  5. cd /output
  6. # 拉取 Gitlab 源代码,这里指定了版本 12.9.7+ce.0:
  7. git clone --depth=1 -b 12.9.7+ce.0 https://gitlab.com/gitlab-org/omnibus-gitlab.git
  8. # 进入代码目录并开始安装 Ruby 的依赖包
  9. cd ./omnibus-gitlab/
  10. ALTERNATIVE_SOURCES=true bundle install --path .bundle --binstubs
  11. # 修改几处针对 ARM64 架构的地方:
  12. sed -i "s/\.\/configure/\.\/configure --build=arm-linux/" config/software/ncurses.rb
  13. sed -i "s/\#{arch}/arm64/" config/software/grafana.rb
  14. # grafana 还需要修改对应的文件 hash,否则会校验不过,无法编译:
  15. sed -i "s/0104bfe14444cea2fa3f021b9a75fc78f66434f2ca8f3d0bdd422d108ce682e7/86ead48d7f1f4a5ec04b2d5544425a9d7657c731e66d3722b5a301ddb60f4923/" config/software/grafana.rb
  16. # 正式编译:
  17. ALTERNATIVE_SOURCES= true COMPILE_ASSETS= true bin/omnibus build --log-level=info gitlab
  18. # 编译时间较长,并且由于网络等因素,可能会出错,只能根据报错信息应对解决。
  19. # 小提示:如果编译途中有部分较大的软件包屡次下载失败的话,可以从别的地方下好拷进软件包临时目录,位于:/var/cache/omnibus/cache

编译完成后,在 pkg 目录下会生成一个 deb 安装包:gitlab-ce_12.9.7-ce.0_arm64.deb

 

3 通过 Gitlab 安装包构建镜像

同样,Gitlab 官方在源码仓库的 docker 目录下提供了 构建 Gitlab docker 镜像的 Dockerfile,但是其中有一个文件 RELEASE 没有说明清楚,通过查询资料得知里面存放了一些用到的变量,具体如下:


  
  1. PACKAGECLOUD_REPO=gitlab-ce
  2. RELEASE_PACKAGE=gitlab-ce
  3. RELEASE_VERSION= 12.9. 7-ce. 0
  4. DOWNLOAD_URL=https://xxxx:xx/gitlab.deb

DOWNLOAD_URL 是存放 Gitlab 的 deb 安装包的地方,也就是上面步骤中构建好的。后面构建 Docker 镜像时会下载这个包,其实本来打算去掉这个下载步骤,直接将包拷贝到镜像容器里面,安装完再删除的,但是这样会使得镜像体积增大,因为增加了一个镜像的 layer,因此还是临时搭了一个 nginx 放包下载。

此外,还需要修改的几处地方,最终整个构架步骤如下:


  
  1. git clone --depth= 1 -b 12. 9. 7+ce. 0 https://gitlab.com/gitlab-org/omnibus-gitlab.git
  2. cd ./omnibus-gitlab/docker
  3. echo "PACKAGECLOUD_REPO=gitlab-ce" > RELEASE
  4. echo "RELEASE_PACKAGE=gitlab-ce" >> RELEASE
  5. echo "RELEASE_VERSION=12.9.7-ce.0" >> RELEASE
  6. echo "DOWNLOAD_URL=http://https://xxxx:xx/gitlab.deb" >> RELEASE
  7. sed -i "s/16\.04/18\.04/" ./Dockerfile # 升级为 ubuntu 18. 04 版本
  8. sed -i "s/\-\-header\s.*\s.*\s//" assets/download-package # 去掉 access token,因为 nginx 没有这方面限制
  9. # 构建 Gitlab Docker 镜像:
  10. docker build -t gitlab-ce_ubuntu_ 18. 04_arm 64 .

 

4 运行 Gitlab Docker 容器

运行 Gitlab 容器官方也提供了 N 种方案,这里不再赘述,仅复制一个通过 docker-compose 启动的最简单的例子:


  
  1. web:
  2. image: 'gitlab-ce_ubuntu_18.04_arm64'
  3. restart: always
  4. hostname: 'gitlab.example.com'
  5. environment:
  6. GITLAB_OMNIBUS_CONFIG: |
  7. external_url 'https://gitlab.example.com'
  8. # Add any other gitlab.rb configuration here, each on its own line
  9. ports:
  10. - '80:80'
  11. - '443:443'
  12. - '22:22'
  13. volumes:
  14. - '/docker-data/gitlab/config:/etc/gitlab'
  15. - '/docker-data/gitlab/logs:/var/log/gitlab'
  16. - '/docker-data/gitlab/data:/var/opt/gitlab'

 

 

作者:李凌


转载:https://blog.csdn.net/m0_46573967/article/details/111880163
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场