Docker镜像构建配置
在完成Web应用构建的基础上,继续构建生成Docker镜像,以便通过阿里云容器服务部署。本文讲解如何构建生成Docker镜像。
关于Web应用构建的一般方法,请参考Web应用构建配置。关于构建的更多内容,请从构建配置概述读起。
完成构建配置后,请继续部署配置。关于通过容器服务部署,请参见部署配置:通过容器服务部署。关于部署的更多内容,请从部署配置概述读起。
企业全局配置
镜像构建的用户名密码:一个企业内部可以共享一个docker login
的用户名密码。可以在企业设置
-> 容器服务账号
中添加。
一个构建配置示例
下面给出一个容器构建配置的完整示例(假设应用名为container-app
)。
代码库目录结构:
$ tree .
.
├── Dockerfile
├── pom.xml
├── src
└── container-app.release
构建配置文件container-app.release
:
code.language=oracle-jdk1.9
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
# 上面提到了,云效会把container-app.tgz放到Dockerfile的同级目录,所以可以这么写,把云效打出来的软件包拷贝到镜像中
COPY container-app.tgz /home/admin/container-app.tgz
pom.xml,src 略。
按照上述的配置,云效会:
先按照默认的
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构建命令:
docker build --pull -f Dockerfile -t registry.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
的规则。
更多见可配置键的完整列表。
可用的环境变量
系统提供的所有环境变量见构建传入系统环境变量的完整列表。下面列举几个常用的环境变量。
PACKAGE_LABEL
:标识当前构建的参数。对于自定义流水线来说,如果您没有进行特殊配置,则PACKAGE_LABEL
的值为default
。您可以在自定义流水线的配置页面,对不同的包配置不同的PACKAGE_LABEL
的值。如果您使用的是非自定义流水线,则PACKAGE_LABEL
的值与ENV_TYPE
的值相同。其值可以为testing
,staging
,production
。CODE_BRANCH
:标识当前构建的分支名称。如果使用分支模式,则每次构建的分支是一个集成分支,形如:releases/20170623154859032_r_release_35191_app-code
。这时最好不要使用CODE_BRANCH
。TIMESTAMP
:当前时间戳,形如:20170622232633
。
配置项默认值规则
docker.repo
:无默认值。docker.file
:默认值为Dockerfile
。docker.tag
:默认值为${PACKAGE_LABEL}_${TIMESTAMP}
。
镜像构建的Context
关于镜像构建的Context的基础知识见链接。
云效会使用Dockerfile
所在的路径进行镜像构建,也就是说镜像构建的Context
就是Dockerfile
所在的目录。
举个例子,如果Dockerfile
的路径是docker/files/Dockerfile_testing
,那么云效会把docker/files
作为镜像构建的Context
。
云效还会把打包产物自动拷贝到镜像构建的Context
中。在上面的例子中,会把打出来的tgz包拷贝到docker/files
目录下。tgz包的默认名称为<应用名>.tgz
。这就意味着你可以在Dockerfile
中直接这么写:
COPY `<应用名>.tgz` /home/admin/app-path/
典型场景
可以通过上述环境变量的不同组合来满足不同的使用场景:
不同环境使用不同的Dockerfile
release
文件:
...
docker.file=Dockerfile_${PACKAGE_LABEL}
...
这样,在日常环境就会使用Dockerfile_testing
,预发环境使用Dockerfile_staging
,正式环境使用Dockerfile_production
使用时间戳作为镜像tag
release
文件:
...
docker.tag=${TIMESTAMP}
...
这样,生成的tag
就是形如20170622232633
这样的字符串。
在tag中区分环境
使用同一个Dockerfile
的用户,如果希望从镜像的tag
中,看出来镜像是哪个环境的,则可以这样配置release
文件:
...
# 这也是tag的默认值
docker.tag=${PACKAGE_LABEL}_${TIMESTAMP}
# 或者
docker.tag=${TIMESTAMP}_${PACKAGE_LABEL}
...
在tag中使用分支
有些团队会使用分支区分开发状态,比如develop
分支上打出来的包都是测试包,master
上打出来的是正式包。这时候可以在tag
中包含CODE_BRANCH
这个环境变量。比如 docker.tag=${TIMESTAMP}_${PACKAGE_LABEL}_${CODE_BRANCH}
。