华为云软件开发平台(DevCloud)是一站式云端DevOps平台,开发者使用DevCloud可以快速体验全流程的DevOps,轻松开启云端开发之旅。同时,DevCloud集成有鲲鹏开发套件的编译器,支持开发者将软件自动部署到华为云鲲鹏ECS或容器等云服务上。本文说明使用DevCloud在华为云鲲鹏ECS上自动部署DevOps全流程样例项目——凤凰商城示例程序所需的配置修改,作为鲲鹏移植的应用参考。
实践准备工作
本次实践假设DevCloud在已配置有鲲鹏执行机的“北京四”区域,对于未配置鲲鹏执行机的区域,可能需要客户自行配置执行机,配置过程详见后续说明。
首先,按照HE2E DevOps实践的实践准备工作完成项目创建,本次实践截图中的项目名称为“phoenix-test”。
失败的构建尝试
按照官方文档步骤六:构建应用,登录容器镜像服务控制台获取SWR服务器地址,并且创建组织(或复制已创建组织的名称)。
在编译构建页签下,在构建任务列表中单击构建任务“phoenix-sample-ci”最右侧“操作”那一列3个小点的图标,在快捷菜单中选择“复制”,然后在复制任务的基本信息页签中修改任务名称为“phoenix-sample-ci-kunpeng”,修改构建环境主机类型为“鲲鹏(ARM)服务器”,单击“复制并执行”,在接下来的对话框中修改构建配置参数dockerServer和dockerOrg为合适的值。
然而,只进行构建任务配置的修改,会出现“制作Docker镜像失败”的错误。
从全量日志的第66行可以看出在构建镜像时出现了“exec format error”错误,其原因一般是基础镜像的指令集与执行机不一致。
...
64 [2021/06/22 15:23:17.707] Step 4/7 : RUN pip install -i https://repo.huaweicloud.com/repository/pypi/simple -r requirements.txt
65 [2021/06/22 15:23:17.954] ---> Running in e8bc2ac602fd
66 [2021/06/22 15:23:18.245] ·[91mstandard_init_linux.go:219: exec user process caused "exec format error"
67 [2021/06/22 15:23:18.614] The command '/bin/sh -c pip install -i https://repo.huaweicloud.com/repository/pypi/simple -r requirements.txt' returned a non-zero code: 1
68 [2021/06/22 15:23:18.645] [ERROR] [制作Vote镜像并推送到SWR仓库:制作镜像并推送到SWR仓库] : 错误信息: DEV.CB.0210043, 制作Docker镜像失败。
69 [2021/06/22 15:23:18.753] [ERROR] [制作Vote镜像并推送到SWR仓库:制作镜像并推送到SWR仓库] : 该步骤执行失败。
70 [2021/06/22 15:23:18.757] [ERROR] : 该步骤执行失败,错误信息:DEV.CB.0210043, 制作Docker镜像失败。
71 [2021/06/22 15:23:24.594] [INFO] : [JobStatusPlugin] onCompleted: j_hWvUWwku #1
72 [2021/06/22 15:23:24.595] [INFO] : [JobStatusPlugin] onCompleted end: j_hWvUWwku #1
73 [2021/06/22 15:23:24.678] Finished: FAILURE
就如同在x86服务器上构建的镜像在鲲鹏ECS上运行时出现的错误:
# docker run -it b57c09a0fa62 /bin/sh
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
standard_init_linux.go:228: exec user process caused: exec format error
问题修复
在代码托管服务中查看代码仓phoenix-sample中的vote/Dockerfile文件:
# Using official python runtime base image
FROM python:2.7-alpine
...
在容器镜像服务的镜像中心搜索python, 然后在“python 镜像详情”页面找到支持的架构“arm64v8”点击链接进入该页面查找合适的版本。
非常不幸的是2.7版本的python已经无法从这个页面查到,更新的版本又不一定适合应用,这里我们假设旧有的版本尚未删除,复制vote/Dockerfile为vote/Dockerfile.kunpeng,将vote/Dockerfile.kunpeng中的基础镜像修改为:
FROM arm64v8/python:2.7-alpine
同样,复制result/Dockerfile为result/Dockerfile.kunpeng,并将其中的基础镜像修改为:
FROM arm64v8/node:12.22.1-slim
复制worker/Dockerfile.j2为result/Dockerfile.j2.kunpeng,并将其中的基础镜像修改为:
FROM arm64v8/openjdk:18-ea-1-jdk-slim-buster
修改构建任务phoenix-sample-ci-kunpeng中有制作镜像的构建步骤中的Dockerfile路径为其对应的鲲鹏版本,修改“生成Postgres and Redis Dockerfile”这一构建步骤中的命令为:
echo FROM arm64v8/postgres:9.6.22-alpine > Dockerfile-postgres
echo FROM arm64v8/redis:5.0.12-alpine > Dockerfile-redis
完成以上修改后保存并执行构建任务phoenix-sample-ci-kunpeng,能够成功构建出可在鲲鹏ECS运行的版本。
应用部署和测试
按照官方文档步骤七:部署应用(弹性云服务器篇)可以将构建任务phoenix-sample-ci-kunpeng构建的软件部署到鲲鹏ECS。
其中Docker Compose的安装可参考官方文档鲲鹏移植指南中的安装Docker Compose中的方法。
在网上商城(5000端口的前端应用)点击喜欢某一商品,在管理端(5001端口的前端应用)的仪表盘中能够看到相应的数据变化,说明除了2个前端应用外,worker、postgres和redis这3个微服务也可以正常工作。
保存基础镜像到私有镜像仓库
作为DevOps全流程样例项目,凤凰商城使用dockerhub中的公共镜像作为基础镜像,这也无可厚非。
而对于正式的项目,出于性能、安全等方面的考虑,我们应采用私有的容器镜像服务存储验证过的基础镜像,以避免因公共镜像变化甚至删除造成安全或可用性方面的问题。
此外,华为云容器镜像服务SWR文档中一些最佳实践,如编写高效的Dockerfile,值得认真阅读。
结论
凤凰商城示例程序采用的技术栈无需修改源代码即可迁移到鲲鹏计算平台,但仍需修改一些微服务组件运行依赖的基础镜像,同时需要修改编译构建任务的配置信息,这可能是因为凤凰商城示例程序编写时还没有考虑对鲲鹏计算平台的支持。此外,凤凰商城示例程序使用的一些基础镜像并没有如编写高效的Dockerfile说明的那样使用特定的标签,一些镜像版本在dockerhub中已难以找到完全对应的arm64v8版本,有必要考虑进一步完善。而通过简单的配置修改就可以轻松将凤凰商城示例程序迁移到鲲鹏计算平台,也说明DevCloud和鲲鹏计算平台在产品、文档等方面都已非常成熟,可以让开发者放心使用。