Docker 插件可用于使用 Docker-in-Docker 构建映像并将其发布到 Docker 注册表。以下流水线配置使用 Docker 插件构建和发布 Docker 映像。
-
示例配置使用 git 存储库根目录中的 Dockerfile 构建和发布镜像。docker 上下文也默认为 git 存储库的根目录。
1 2 3 4 5 6 7 8 9 10 11 12
kind: pipeline name: default steps: - name: docker image: plugins/docker settings: username: kevinbacon password: pa55word repo: foo/bar tags: - latest
-
使用多个标签的示例配置:
5 6 7 8 9 10 11 12 13 14 15
steps: - name: docker image: plugins/docker settings: username: kevinbacon password: pa55word repo: foo/bar tags: - latest - '1.0.1' - '1.0'
-
示例配置使用
.tags
文件(逗号分隔的标签列表)来动态配置标签。该插件会自动加载此文件(如果存在)。5 6 7 8 9 10 11 12 13 14 15 16 17 18
steps: - name: build image: golang commands: - go build - go test - echo -n "5.2.6,5.2.4" > .tags - name: docker image: plugins/docker settings: username: kevinbacon password: pa55word repo: foo/bar
-
使用构建参数的示例配置:
5 6 7 8 9 10 11 12 13
steps: - name: docker image: plugins/docker settings: username: kevinbacon password: pa55word repo: foo/bar build_args: - HTTP_PROXY=http://yourproxy.com
-
将 Secrets 作为构建参数传递的示例配置:
5 6 7 8 9 10 11 12 13 14 15 16
steps: - name: build-image image: plugins/docker environment: TOKEN: from_secret: one_of_the_tokens settings: username: kevinbacon password: pa55word repo: foo/bar build_args_from_env: - TOKEN
-
使用备用 Dockerfile 的示例配置:
4 5 6 7 8 9 10 11
steps: - name: docker image: plugins/docker settings: username: kevinbacon password: pa55word repo: foo/bar dockerfile: path/to/Dockerfile
-
使用自定义注册表的示例配置:
4 5 6 7 8 9 10 11
steps: - name: docker image: plugins/docker settings: username: kevinbacon password: pa55word repo: index.company.com/foo/bar registry: index.company.com
Secrets
从 Secrets 中获取敏感配置参数被认为是最佳实践。以下示例演示了如何从 Secrets 中获取用户名和密码:
|
|
Autotag
Docker 插件可以配置为自动标记你的镜像。当启用此功能且事件类型为标记时,插件将使用标准的主要、次要、发布约定自动标记镜像。例如:
v1.0.0
将会生成 docker 标签1
、1.0
、1.0.0
v1.0.0-rc.1
将会生成 docker 标签1.0.0-rc.1
当事件类型为推送且目标分支是你的默认分支(例如 master)时,插件会自动将镜像标记为 latest
。所有其他事件类型和分支都将被忽略。
以下是示例配置:
|
|
带有标记后缀的示例配置:
|
|
请注意,自动标记功能是故意设计得如此简单且自以为是的。我们目前不接受 Pull Request 以进一步自定义逻辑。
参数
-
registry
- 对此注册表进行身份验证
-
username
- 使用用户名进行身份验证
-
password
- 使用密码进行身份验证
-
repo
- 镜像的存储库名称
-
tags
- 镜像的存储库标签
-
dockerfile
- 要使用的 dockerfile,默认为 Dockerfile
-
dry_run
- 布尔值,是否应该在最后推送 docker 镜像
-
purge
- 布尔值,是否应该在最后完成 docker 镜像的清理
-
context
- 要使用的上下文路径,默认为 git repo 的根目录
-
target
- 要使用的构建目标,必须在 docker 文件中定义
-
force_tag=false
- 替换现有的匹配镜像标签
-
insecure=false
- 启用与此注册表的不安全通信
-
mirror
- 使用镜像 registry 而不是直接从中央 Hub 拉取镜像
-
bip=false
- 用于打通 Bridge 网络的 IP
-
custom_dns
- 为容器设置自定义 DNS 服务器
-
custom_dns_search
- 为 docker 守护进程设置 dns 搜索域
-
storage_driver
- 支持 aufs、overlay 或 vfs 驱动程序
-
storage_path
- docker 守护进程存储路径
-
build_args
- 将自定义参数传递给 docker build
-
build_args_from_env
- 将环境变量作为自定义参数传递给 docker build
-
auto_tag=false
- 根据 git branch 和 git tag 自动生成标签名
-
auto_tag_suffix
- 生成带有此后缀的标签名称
-
debug, launch_debug
- 以详细调试模式启动 docker 守护进程
-
mtu
- docker 守护进程自定义 mtu 设置
-
ipv6
- docker 守护进程 IPv6 网络
-
experimental
- docker daemon 实验模式
-
daemon_off
- 不要启动 docker 守护进程
-
cache_from
- 被视为缓存源的镜像
-
squash
- 在构建时 squash 图层
-
pull_image
- 在构建时强制拉取基础镜像
-
compress
- 使用 gzip 压缩构建上下文
-
custom_labels
- additional k=v labels
-
label_schema
- label-schema labels
-
email
- docker 邮箱
-
no_cache
- 不使用缓存的中间容器
-
add_host
- 附加主机:IP 映射
常见问题
缺少用户名或密码
如果注册表用户名或密码丢失,你将在流水线日志中看到以下内容。此问题最常见的根本原因是配置 Secret 不正确。
|
|
无效的用户名或密码
如果注册表用户名和密码无效,你将在流水线日志中看到以下内容。这个问题最常见的根本原因是在创建 Secret 时复制/粘贴问题,例如换行符或特殊字符被意外复制到 Secret 字符串中。
|
|
不安全的注册表
如果注册表是自托管的,并且如果注册表使用纯 http 或自签名证书,则 docker 客户端将无法与注册表建立安全连接。这将导致 docker 登录失败并出现以下错误:
|
|
这可以通过以下插件配置来解决:
|
|
使用卷 (Volumes)
如果你尝试将卷 (volume) 装载到插件中,你将在流水线日志中看到以下内容。出于安全原因,docker 插件限制安装卷 (volume)。
|
|
这可以通过删除已安装的卷或将插件步骤配置为在特权模式 (privileged mode) 下运行来解决:
|
|
Docker In Docker 相关问题
如果无法在插件容器内启动 docker 守护进程,你将在流水线日志中看到以下内容。此问题最常见的根本原因是安全软件(selinux、apparmor 等)阻止了嵌套容器化。
|
|
这可以通过以下插件配置进一步分类:
|
|
如果 docker 运行失败,你将在流水线日志中看到以下内容:
|
|
如果 docker 运行成功,你将在流水线日志中看到以下内容:
|
|