全部产品
研发协同 RDC

Docker镜像构建配置

更新时间:2017-09-19 16:18:26   分享:   

在完成Web应用构建的基础上,继续构建生成Docker镜像,以便通过阿里云容器服务部署。本文讲解如何够间生成Docker镜像。

关于Web应用构建的一般方法,请参考Web应用构建配置。关于构建的更多内容,请从构建配置概述读起。

完成构建配置后,请继续部署配置。关于通过容器服务部署,请参见部署配置:通过容器服务部署。关于部署的更多内容,请从部署配置概述读起。

配置镜像构建的用户名密码

一个企业内部可以共享一个docker login的用户名密码。可以在企业设置-> 容器服务账号中添加。

示例

容器构建的行为通过release文件来控制(点击这里了解更多关于release文件的作用)。

下面给出一个容器构建配置的完整示例(假设应用名为container-app):

代码库

  1. $ tree .
  2. .
  3. ├── Dockerfile
  4. ├── pom.xml
  5. ├── src
  6. └── container-app.release

container-app.release:

  1. # 构建语言相关的配置
  2. code.language=java
  3. baseline.jdk=jdk-1.7.0_51
  4. build.tools.maven=maven2.2.1
  5. # 配置RDC对什么文件进行打包,RDC会把这个文件打成 container-app.tgz,并且会在docker 构建之前把这个文件放到docker.file所指定的文件的同级目录。对于本例来说,就是代码库根目录。
  6. build.output=target/container-app.war
  7. # docker构建所用的Dockerfile的路径
  8. docker.file=Dockerfile
  9. # docker构建完成之后,要push到的docker repo
  10. docker.repo=registry.cn-hangzhou.aliyuncs.com/mynamespace/container-app
  11. # 使用时间戳做docker tag,这样打出来的docker镜像就形如:registry.cn-hangzhou.aliyuncs.com/mynamespace/container-app:20170622232633
  12. docker.tag=${TIMESTAMP}

Dockerfile:

  1. # 为自己的应用程序打一个基础镜像,把基础的软件安装好,并且包括启动的entrypoint
  2. FROM registry.cn-hangzhou.aliyuncs.com/mynamespace/container-app:base
  3. # 上面提到了,RDC会把container-app.tgz放到Dockerfile的同级目录,所以可以这么写,把RDC打出来的软件包拷贝到镜像中
  4. COPY container-app.tgz /home/admin/container-app.tgz

pom.xml,src 略

按照上述的配置,RDC会:

  1. 先按照默认的Java语言的构建方式打出war包在target/container-app.war
  2. target/container-app.war打成container-app.tgz,并放置在代码库根目录。
  3. 运行docker login命令:docker login -u "xxx" -p "xxx" registry.cn-hangzhou.aliyuncs.com
  4. 运行docker构建命令:docker build --pull -f Dockerfile -t registry.cn-hangzhou.aliyuncs.com/mynamespace/container-app:20170622232633 /home/admin/xxxxx/container-app/
  5. 再次运行第3步中的命令。
  6. 运行docker push命令:docker push registry.cn-hangzhou.aliyuncs.com/mynamespace/container-app:20170622232633

构建配置详解

容器构建配置项

  1. docker.repo:必填,镜像仓库的地址。
  2. docker.file:选填,dockerfile相对代码根目录的相对路径。
  3. docker.tag:选填,镜像tag的规则。

可用的环境变量

想要知道所有可用的环境变量,您可以参看构建日志的输出,或者该文档。下面列举几个常用的环境变量。

  1. PACKAGE_LABEL:标识当前构建的参数。对于自定义流水线来说,如果您没有进行特殊配置,则PACKAGE_LABEL的值为default。您可以在自定义流水线的配置页面,对不同的包配置不同的PACKAGE_LABEL的值。如果您使用的是非自定义流水线,则PACKAGE_LABEL的值与ENV_TYPE的值相同。其值可以为testing, staging, production
  2. CODE_BRANCH:标识当前构建的分支名称。如果使用分支模式,则每次构建的分支是一个集成分支,形如:releases/20170623154859032_r_release_35191_app-code。这时最好不要使用CODE_BRANCH
  3. TIMESTAMP:当前时间戳,形如:20170622232633

配置项默认值规则

  1. docker.repo:无默认值。
  2. docker.file:默认值为Dockerfile
  3. docker.tag:默认值为${PACKAGE_LABEL}_${TIMESTAMP}

镜像构建的Context

关于镜像构建的Context的基础知识见链接

RDC会使用Dockerfile所在的路径进行镜像构建,也就是说镜像构建的Context就是Dockerfile所在的目录。

举个例子,如果Dockerfile的路径是docker/files/Dockerfile_testing,那么RDC会把docker/files作为镜像构建的Context

RDC还会把打包产物自动拷贝到镜像构建的Context中。在上面的例子中,会把打出来的tgz包拷贝到docker/files目录下。tgz包的默认名称为<应用名>.tgz。这就意味着你可以在Dockerfile中直接这么写:

  1. COPY `<应用名>.tgz` /home/admin/app-path/

典型场景

可以通过上述环境变量的不同组合来满足不同的使用场景:

不同环境使用不同的Dockerfile

release文件:

  1. ...
  2. docker.file=Dockerfile_${PACKAGE_LABEL}
  3. ...

这样,在日常环境就会使用Dockerfile_testing,预发环境使用Dockerfile_staging,正式环境使用Dockerfile_production

使用时间戳作为镜像tag

release文件:

  1. ...
  2. docker.tag=${TIMESTAMP}
  3. ...

这样,生成的tag就是形如20170622232633这样的字符串。

在tag中区分环境

使用同一个Dockerfile的用户,如果希望从镜像的tag中,看出来镜像是哪个环境的,则可以这样配置release文件:

  1. ...
  2. # 这也是tag的默认值
  3. docker.tag=${PACKAGE_LABEL}_${TIMESTAMP}
  4. # 或者
  5. docker.tag=${TIMESTAMP}_${PACKAGE_LABEL}
  6. ...

在tag中使用分支

有些团队会使用分支区分开发状态,比如develop分支上打出来的包都是测试包,master上打出来的是正式包。这时候可以在tag中包含CODE_BRANCH这个环境变量。比如 docker.tag=${TIMESTAMP}_${PACKAGE_LABEL}_${CODE_BRANCH}

本文导读目录
本文导读目录
以上内容是否对您有帮助?