【免费】阿里云+Git+Docker自动构建系统
Docker是一个开源的应用容器引擎,将应用以及依赖打包到一个可移植的镜像中,然后发布到服务器上,并且可以实现虚拟化,有助于快捷高效的交付应用。
Docker三个核心概念:
l 镜像Image,应用和依赖打包生成的文件,类似安装包。
l 仓库Repository,Docker存放镜像文件的地方。
l 容器Container,镜像创建运行应用的示例。
阿里云容器镜像服务提供Docker镜像仓库托管,配置项目代码Git仓库和构建规则,轻松实现自动化。进一步结合Dockerfile强大功能实现云端编译打包,不再需要常用的Jenkins构建服务器。相信吗?阿里云+Git+Docker组成的自动构建系统使用的服务全免费!
目录:
l Dockerfile配置
l 代码托管
l 配置构建规则
l 常见问题和解决方法
一,Dockerfile是核心
Dockerfile是镜像描述文件,包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。Dockerfile基本结构:
- 基础镜像
- 维护者信息
- 镜像构建指令
- 容器启动时执行指令
阿里云+Git+Docker组成的自动构建系统使用了多个Dockerfile文件搭配组合,巧妙的通过容器镜像服务实现了构建服务器的功能:
- Dockerfile_ce,称为社区版,依赖本地开发环境,将编译好的项目运行文件打包进Docker镜像,多用于本地开发测试。
- Dockerfile_base,将完整的编译打包环境配置到镜像中,在项目生命周期中变动较少。
- Dockerfile_full,将Dockerfile_base作为基础镜像,从拉取源代码开始,编译生成项目运行文件,打包进Docker镜像,然后发布部署。阿里云容器镜像服务基于Dockerfile_full全量构建。
问答:
l Dockerfile_ce和Dockerfile_full有什么区别?
构建镜像使用的项目运行文件来源不同。Dockerfile_ce多用于开发测试,打包使用本地开发环境编译生成的运行文件。Dockerfile_full从源代码编译出项目运行文件,不依赖本地环境,往往构建速度较慢,用于发布部署。
l 为什么拆分Dockerfile_base和Dockerfile_full?
Dockerfile_base用于搭建编译打包环境,在项目周期中变动较少,并且跨项目共用,所以拆分出来单独维护。
Dockerfile_full依赖Dockerfile_base,拉取源代码和编译生成项目运行文件,并打包进Docker镜像。
二,代码下载:
https://github.com/jextop/StarterAdmin
├── Dockerfile
├── Dockerfile_ce
https://github.com/jextop/StarterDeploy
├── base_admin
│ └── Dockerfile
https://github.com/jextop/StarterApi
├── Dockerfile
├── Dockerfile_ce
项目StarterAdmin的Dockerfile_ce内容如下,基础镜像nginx增加web文件和conf配置,打开端口8010:
FROM nginx:latest
# copy web files
COPY ./deploy/web/ /usr/share/nginx/html
# config
COPY ./deploy/conf/ /etc/nginx/
WORKDIR /etc/nginx
EXPOSE 8010
项目StarterAdmin的Dockerfile从源代码开始全量编译并打包:
FROM registry.cn-shanghai.aliyuncs.com/jext/starter_admin_base:latest
# copy code
COPY ./ /code
WORKDIR /code
# package and copy web files
RUN cnpm install; \
npm run build; \
\
mv ./dist/* /usr/share/nginx/html; \
mv ./public/favicon.png /usr/share/nginx/html
# config
COPY ./deploy/conf/ /etc/nginx/
WORKDIR /etc/nginx
# delete code
RUN rm -rf /code
EXPOSE 8010
项目StarterDeploy子目录base_admin下的Dockerfile构建编译打包环境的基础镜像,安装npm后,并安装cnpm加速镜像:
FROM nginx:latest
WORKDIR /code
# install npm
RUN apt update; \
apt -y install npm; \
npm install -g cnpm --registry=https://registry.npm.taobao.org; \
\
cnpm -v; \
node -v
WORKDIR /etc/nginx
EXPOSE 80
Dockerfile常用指令:
三,代码托管和配置构建规则
镜像创建时自动生成了一个默认内置规则,由tag触发,并为构建的镜像设置版本号。我们为master分支增加一个latest构建规则,依次配置选项:
- 类型:选择Branch
- 分支:选择master
- Dockerfile目录:根目录/,或者子目录比如/base_admin/
- Dockerfile文件名:Dockerfile,或者其他名称,比如Dockerfile_ce
- 镜像版本:latest,也可以根据需要设置其他规则
配置完成后,有代码提交到Git仓库时,将自动触发构建。点击规则的”立即构建“可以手动触发。
查看构建日志:点击构建列表的”日志“查看过程信息,弹出窗口的右上角有两个贴心小功能:
- 输入”起始行“,点击”前往“图标,可跳转到对应日志行数位置。
- 点击”刷新“图标,将读取当前日志的下100条。
四,常见问题和解决方法
把实际使用中遇到的几个问题总结出来,供大家分享参考。
l 构建失败,错误信息:curl: (7) Failed to receive SOCKS5 connect request ack. {"exitCode":1, "message":"get repo info failed, "}
解决:手动触发”立即构建“
原因:纯属猜测,阿里云容器镜像服务访问Github有时不稳定,偶发问题。
l 一直显示”构建中“
原因:某些命令如apt update; apt install -y npm要从国外服务器下载较多文件,速度较慢,实际使用中经历的最长构建时间超过1小时。
l RUN mvn package失败,mvn not found
解决:使用命令RUN sh mvnw package
原因:Maven版本和插件兼容性问题。另一个解决方案是apt install maven,不一定能解决问题。
l RUN mvn package失败,[ERROR] Some problems were encountered while processing the POMs
解决:使用命令RUN sh mvnw package
原因:Maven版本和插件兼容性问题。
mvnw是何方神圣?全名MavenWrapper,是一个第三方提供的Maven插件,为SpringBoot项目提供一个独立的且指定版本的Maven,不影响全局版本和其他项目。在生成SpringBoot项目时已经自动安装。
SpringBoot项目下有两个文件mvnw和mvnw.cmd,还有一个.mvn目录下面有三个文件。
Spring-boot-project
├── .mvn
│ └── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
│ ├── MavenWrapperDownloader.java
├── mvnw
├── mvnw.cmd
单独安装时可以在项目根目录下运行命令:
mvn -N io.takari:maven:wrapper
也可以指定maven版本:
mvn -N io.takari:maven:wrapper -Dmaven=3.3.3
使用时和mvn类似,比如:./mvnw clean package
l RUN mv ./dist /usr/share/gninx/html,得到的目录结构不正确
/usr/share/nginx/html
├── dist
│ └── index.html
│ └── favicon.png
解决:使用命令RUN mv ./dist/* /usr/share/nginx/html
原因:目标文件夹已经存在。
l 启动Docker容器时运行launch.sh错误,Permission denied
解决:CMD或者ENTRYPOINT命令指定shell,CMD ["sh", "launch.sh"]
原因:*.sh文件没有正确设置可执行权限,可以执行chmod +x *.sh。如果使用Windows开发环境,建议使用指定shell的解决方案。