【0成本】阿里云+Git+Docker自动构建系统

Docker是一个开源的应用容器引擎,将应用以及依赖打包到一个可移植的镜像中,然后发布到服务器上,并且可以实现虚拟化,有助于快捷高效的交付应用


Docker三个核心概念:

镜像Image,应用和依赖打包生成的文件,类似安装包。

仓库Repository,Docker存放镜像文件的地方。

容器Container,镜像创建运行应用的示例。


阿里云容器镜像服务提供Docker镜像仓库托管,配置项目代码Git仓库和构建规则,轻松实现自动化。进一步结合Dockerfile强大功能实现云端编译打包,不再需要常用的Jenkins构建服务器。相信吗?阿里云+Git+Docker组成的自动构建系统使用的服务全免费!


目录:

Dockerfile配置

扫描二维码关注公众号,回复: 8978354 查看本文章

代码托管

配置构建规则

常见问题和解决方法


一,Dockerfile是核心

Dockerfile是镜像描述文件,包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。Dockerfile基本结构:

- 基础镜像

- 维护者信息

- 镜像构建指令

- 容器启动时执行指令


阿里云+Git+Docker组成的自动构建系统使用了多个Dockerfile文件搭配组合,巧妙的通过容器镜像服务实现了构建服务器的功能:

image.png

- Dockerfile_ce,称为社区版,依赖本地开发环境,将编译好的项目运行文件打包进Docker镜像,多用于本地开发测试。

- Dockerfile_base,将完整的编译打包环境配置到镜像中,在项目生命周期中变动较少。

- Dockerfile_full,将Dockerfile_base作为基础镜像,从拉取源代码开始,编译生成项目运行文件,打包进Docker镜像,然后发布部署。阿里云容器镜像服务基于Dockerfile_full全量构建。


问答:

Dockerfile_ce和Dockerfile_full有什么区别?

构建镜像使用的项目运行文件来源不同。Dockerfile_ce多用于开发测试,打包使用本地开发环境编译生成的运行文件。Dockerfile_full从源代码编译出项目运行文件,不依赖本地环境,往往构建速度较慢,用于发布部署。


为什么拆分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常用指令:

image.png

三,代码托管和配置构建规则

image.png

镜像创建时自动生成了一个默认内置规则,由tag触发,并为构建的镜像设置版本号。我们为master分支增加一个latest构建规则,依次配置选项:

- 类型:选择Branch

- 分支:选择master

- Dockerfile目录:根目录/,或者子目录比如/base_admin/

- Dockerfile文件名:Dockerfile,或者其他名称,比如Dockerfile_ce

- 镜像版本:latest,也可以根据需要设置其他规则


配置完成后,有代码提交到Git仓库时,将自动触发构建。点击规则的”立即构建“可以手动触发。

image.png

查看构建日志:点击构建列表的”日志“查看过程信息,弹出窗口的右上角有两个贴心小功能:

- 输入”起始行“,点击”image.png前往“图标,可跳转到对应日志行数位置。

- 点击”image.png刷新“图标,将读取当前日志的下100条。

image.png


四,常见问题和解决方法

把实际使用中遇到的几个问题总结出来,供大家分享参考


构建失败,错误信息:curl: (7) Failed to receive SOCKS5 connect request ack. {"exitCode":1, "message":"get repo info failed, "}

image.png

解决:手动触发”立即构建“

原因:纯属猜测,阿里云容器镜像服务访问Github有时不稳定,偶发问题。


一直显示”构建中“

原因某些命令如apt update; apt install -y npm要从国外服务器下载较多文件,速度较慢,实际使用中经历的最长构建时间超过1小时。


RUN mvn package失败mvn not found

解决:使用命令RUN sh mvnw package

原因Maven版本和插件兼容性问题。另一个解决方案是apt install maven,不一定能解决问题。


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


RUN mv ./dist /usr/share/gninx/html,得到的目录结构不正确

/usr/share/nginx/html

├── dist

│   └── index.html

│   └── favicon.png

解决:使用命令RUN mv ./dist/* /usr/share/nginx/html

原因:目标文件夹已经存在。


启动Docker容器时运行launch.sh错误,Permission denied

解决CMD或者ENTRYPOINT命令指定shell,CMD ["sh", "launch.sh"]

原因*.sh文件没有正确设置可执行权限,可以执行chmod +x *.sh。如果使用Windows开发环境,建议使用指定shell的解决方案。


猜你喜欢

转载自blog.51cto.com/13851865/2469307