RDC支持镜像构建,并集成了阿里云容器服务作为RDC的一种发布类型。
选择容器类型的应用
构建配置快速开始
配置镜像构建的用户名密码
一个企业内部可以共享一个docker login的用户名密码。可以在企业设置-> 容器服务账号中添加。
示例
容器构建的行为通过release文件来控制(点击
这里了解更多关于release文件的作用)。
下面给出一个容器构建配置的完整示例(假设应用名为container-app):
代码库
- $ tree .
- .
- ├── Dockerfile
- ├── pom.xml
- ├── src
- └── container-app.release
container-app.release:
- # 构建语言相关的配置
- code.language=java
- baseline.jdk=jdk-1.7.0_51
- build.tools.maven=maven2.2.1
- # 配置RDC对什么文件进行打包,RDC会把这个文件打成 container-app.tgz,并且会在docker 构建之前把这个文件放到docker.file所指定的文件的同级目录。对于本例来说,就是代码库根目录。
- build.output=target/container-app.war
- # docker构建所用的Dockerfile的路径
- docker.file=Dockerfile
- # docker构建完成之后,要push到的docker repo
- docker.repo=registry.cn-hangzhou.aliyuncs.com/mynamespace/container-app
- # 使用时间戳做docker tag,这样打出来的docker镜像就形如:registry.cn-hangzhou.aliyuncs.com/mynamespace/container-app:20170622232633
- docker.tag=${TIMESTAMP}
Dockerfile:
- # 为自己的应用程序打一个基础镜像,把基础的软件安装好,并且包括启动的entrypoint
- FROM registry.cn-hangzhou.aliyuncs.com/mynamespace/container-app:base
- # 上面提到了,RDC会把container-app.tgz放到Dockerfile的同级目录,所以可以这么写,把RDC打出来的软件包拷贝到镜像中
- COPY container-app.tgz /home/admin/container-app.tgz
pom.xml,src 略
按照上述的配置,RDC会:
- 先按照默认的Java语言的构建方式打出war包在target/container-app.war。
- 把target/container-app.war打成container-app.tgz,并放置在代码库根目录。
- 运行docker login命令:docker login -u "xxx" -p "xxx" registry.cn-hangzhou.aliyuncs.com。
- 运行docker构建命令:dockerbuild --pull -f Dockerfile -tregistry.cn-hangzhou.aliyuncs.com/mynamespace/container-app:20170622232633/home/admin/xxxxx/container-app/
- 再次运行第3步中的命令。
- 运行docker push命令:docker push registry.cn-hangzhou.aliyuncs.com/mynamespace/container-app:20170622232633
构建配置详解
容器构建配置项
- docker.repo:必填,镜像仓库的地址。
- docker.file:选填,dockerfile相对代码根目录的相对路径。
- docker.tag:选填,镜像tag的规则。
可用的环境变量
RDC提供了三个环境变量可以在镜像构建相关的配置项中使用:
- ENV_TYPE:标识当前环境级别。其值分别为日常环境:testing,预发环境:staging,正式环境:produciton。
- CODE_BRANCH:标识当前构建的分支名称。如果使用分支模式,则每次构建的分支是一个集成分支,形如:releases/20170623154859032_r_release_35191_app-code。这时最好不要使用CODE_BRANCH。
- TIMESTAMP:当前时间戳,形如:20170622232633。
配置项默认值规则
- docker.repo:无默认值。
- docker.file:默认值为Dockerfile。
- docker.tag:默认值为${ENV_TYPE}_${TIMESTAMP}。
镜像构建的Context
关于镜像构建的Context的基础知识见
链接。
RDC会使用Dockerfile所在的路径进行镜像构建,也就是说镜像构建的Context就是Dockerfile所在的目录。
举个例子,如果Dockerfile的路径是docker/files/Dockerfile_testing,那么RDC会把docker/files作为镜像构建的Context。
RDC还会把打包产物自动拷贝到镜像构建的Context中。在上面的例子中,会把打出来的tgz包拷贝到docker/files目录下。tgz包的默认名称为<应用名>.tgz。这就意味着你可以在Dockerfile中直接这么写:
- COPY `<应用名>.tgz` /home/admin/app-path/
典型场景
可以通过上述环境变量的不同组合来满足不同的使用场景:
不同环境使用不同的Dockerfile
release文件:
- ...
- docker.file=Dockerfile_${ENV_TYPE}
- ...
这样,在日常环境就会使用Dockerfile_testing,预发环境使用Dockerfile_staging,正式环境使用Dockerfile_production
使用时间戳作为镜像tag
release文件:
- ...
- docker.tag=${TIMESTAMP}
- ...
这样,生成的tag就是形如20170622232633这样的字符串。
在tag中区分环境
使用同一个Dockerfile的用户,如果希望从镜像的tag中,看出来镜像是哪个环境的,则可以这样配置release文件:
- ...
- # 这也是tag的默认值
- docker.tag=${ENV_TYPE}_${TIMESTAMP}
- # 或者
- docker.tag=${TIMESTAMP}_${ENV_TYPE}
- ...
在tag中使用分支
有些团队会使用分支区分开发状态,比如develop分支上打出来的包都是测试包,master上打出来的是正式包。这时候可以在tag中包含CODE_BRANCH这个环境变量。比如 docker.tag=${TIMESTAMP}_${ENV_TYPE}_${CODE_BRANCH}。
容器部署
你需要在阿里云容器服务中已经有集群,应用和服务。
导入集群证书:在企业设置-容器服务账号中,点击导入证书。
这里的集群就是容器服务中当前用户下的所有集群。
对于不需要展示的集群也可以在rdc中删除,再次点导入就会重新全部导入。
在环境页面中,点击部署配置,选择该环境要发到容器中对应的集群、应用、服务。
部署中,可以点击查看部署日志查看部署进度。
如果您当前登录RDC的阿里云账号,没有该容器服务应用的权限,则无法看到该日志。
部署成功或者失败后,流程就会结束。