如何管理镜像

通过 dockerfile 构建镜像

  1. - stage:
  2. - dockerfile:
  3. params:
  4. workdir: ${git-checkout}
  5. path: Dockerfile
  6. build_args:
  7. JAVA_OPTS: -Xms700m
  8. NODE_OPTIONS: --max_old_space_size=3040

Dockerfile Action 用于自定义 dockerfile 进行打包,产出应用镜像用于部署。产出镜像将推送至平台的镜像仓库中。

具体参数说明如下:

  • workdir:声明命令在具体目录下执行。
  • path dockerfile:相对应用路径。
  • build_args Dockerfile build args:此处填写的键值对将被渲染为 Dockerfile 中的 ARG。

通过 docker push 推送镜像

  1. - stage:
  2. - docker-push:
  3. params:
  4. image: registry.erda.cloud/erdaxxx:v1.0
  5. from: imageResult.img
  6. service: test-server
  7. username: admin
  8. password: xxxx

docker-push 主要完成以下两个功能:

  1. 从本地文件读取镜像,推送至指定镜像仓库。
  2. 将外部仓库的镜像推送至平台内部仓库,供部署使用。

具体参数说明如下:

  • image:推送至外部的镜像名称。
  • from:应用下的文件,一般从 buildPack 出参中获取。
  • service:服务名称,需与镜像文件中的 module_name 保持一致。
  • username:外部镜像仓库用户名。
  • password:外部镜像仓库用密码。

通过 docker pull 拉取镜像

  1. - stage:
  2. - docker-push:
  3. params:
  4. image: registry.erda.cloud/erdaxxx:v1.0
  5. service: test-server
  6. username: admin
  7. password: xxxx
  8. pull: true

使用 docker-push Action,增加 pull 字段以申明是 docker pull。

具体参数说明如下:

  • image:推送至外部的镜像名称。
  • service:服务名称,需与镜像文件中的 module_name 保持一致。
  • username:外部镜像仓库用户名。
  • password:外部镜像仓库用密码。
  • pull:该值必须为 true,表示拉取代码。

自定义命令推送或拉取镜像

推送到平台仓库:

  1. - stage:
  2. - custom-script:
  3. alias: docker-push
  4. # 基于 docker hub 上的 docker 镜像
  5. image: docker
  6. commands:
  7. # 设置镜像加速
  8. - echo "http://mirrors.aliyun.com/alpine/v3.6/main/" > /etc/apk/repositories && echo "http://mirrors.aliyun.com/alpine/v3.6/community/" >> /etc/apk/repositories
  9. # 进入代码根目录
  10. - cd ${git-checkout}
  11. # 设置 repo 的名称,这里用 erda 内部的 dockerRegisterAddr, imageName,tagName 自行填写
  12. - repo=""$BP_DOCKER_ARTIFACT_REGISTRY"/"$DICE_PROJECT_APPLICATION":"imageName"-"tagName""
  13. # 构建镜像
  14. - docker build -t $repo .
  15. # login 和 registerAddr 地址看用户自定义情况来定,因为 $BP_DOCKER_ARTIFACT_REGISTRY 是 erda 自带 docker 的仓库,不需要登录,直接推送即可
  16. # - 否则需要执行 docker login --username= --password= registerAddr
  17. - docker push $repo
  18. # 写入 image 的名称给下面的 action 使用 -> ${{ outputs.docker.image }}
  19. - echo "image="$repo"" >> $METAFILE
  20. # 打个别名
  21. - docker tag $repo xxx/xx/xx:tag
  22. # 推送到 tag 的地址,如果需要登录请 docker login --username= --password= registerAddr
  23. - docker push xxx/xx/xx:tag

拉取平台仓库中的镜像,推送至外置仓库:

  1. - stage:
  2. - custom-script:
  3. alias: docker-tag
  4. # 基于 docker hub 上的 docker 镜像
  5. image: docker
  6. commands:
  7. # 设置镜像加速
  8. - echo "http://mirrors.aliyun.com/alpine/v3.6/main/" > /etc/apk/repositories && echo "http://mirrors.aliyun.com/alpine/v3.6/community/" >> /etc/apk/repositories
  9. # 进入代码根目录
  10. - cd ${git-checkout}
  11. # 如果需要登录请 docker login --username= --password= registerAddr
  12. - docker pull xxx/xxx/xx1:tag
  13. # 使用前置节点的镜像出参, ${{ outputs.xxx.image }} xxx 节点的出参
  14. # - docker tag ${{ outputs.xxx.image }} xxx/xx/xx:tag
  15. # 自己定义的镜像名称
  16. - docker tag xxx/xxx/xx1:tag xxx/xx/xx:tag
  17. # 推送到新的地址,如果需要登录请 docker login --username= --password= registerAddr
  18. - docker push xxx/xx/xx:tag

上述示例即使用 docker 命令进行镜像打包推送和拉取。Erda 的仓库地址需用 $BP_DOCKER_ARTIFACT_REGISTRY 获取,且无需登陆,其余命令均通过 dockerlinux 命令实现。