Drone CI 中文文档

Docker 插件

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 中获取用户名和密码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
kind: pipeline
name: default

steps:
- name: docker  
  image: plugins/docker
  settings:
    username:
      from_secret: docker_username
    password:
      from_secret: docker_password
    repo: foo/bar
    tags:
    - latest

Autotag

Docker 插件可以配置为自动标记你的镜像。当启用此功能且事件类型为标记时,插件将使用标准的主要、次要、发布约定自动标记镜像。例如:

  • v1.0.0 将会生成 docker 标签 11.01.0.0
  • v1.0.0-rc.1 将会生成 docker 标签 1.0.0-rc.1

当事件类型为推送且目标分支是你的默认分支(例如 master)时,插件会自动将镜像标记为 latest。所有其他事件类型和分支都将被忽略。

以下是示例配置:

1
2
3
4
5
6
7
8
steps:
- name: docker  
  image: plugins/docker
  settings:
    repo: foo/bar
    auto_tag: true
    username: kevinbacon
    password: pa55word

带有标记后缀的示例配置:

1
2
3
4
5
6
7
8
9
steps:
- name: docker  
  image: plugins/docker
  settings:
    repo: foo/bar
    auto_tag: true
    auto_tag_suffix: linux-amd64
    username: kevinbacon
    password: pa55word

请注意,自动标记功能是故意设计得如此简单且自以为是的。我们目前不接受 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 不正确。

1
Registry credentials or Docker config not provided. Guest mode enabled.

无效的用户名或密码

如果注册表用户名和密码无效,你将在流水线日志中看到以下内容。这个问题最常见的根本原因是在创建 Secret 时复制/粘贴问题,例如换行符或特殊字符被意外复制到 Secret 字符串中。

1
level=fatal msg="Error authenticating: exit status 1"

不安全的注册表

如果注册表是自托管的,并且如果注册表使用纯 http 或自签名证书,则 docker 客户端将无法与注册表建立安全连接。这将导致 docker 登录失败并出现以下错误:

1
level=fatal msg="Error authenticating: exit status 1"

这可以通过以下插件配置来解决:

1
2
3
4
5
6
7
8
steps:
- name: docker  
  image: plugins/docker
  settings:
    repo: foo/bar
    username: kevinbacon
    password: pa55word
    insecure: true

使用卷 (Volumes)

如果你尝试将卷 (volume) 装载到插件中,你将在流水线日志中看到以下内容。出于安全原因,docker 插件限制安装卷 (volume)。

1
2
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
exit status 1

这可以通过删除已安装的卷或将插件步骤配置为在特权模式 (privileged mode) 下运行来解决:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
steps:
- name: docker  
  image: plugins/docker
  privileged: true
  settings:
    repo: foo/bar
    username: kevinbacon
    password: pa55word
  volumes:
  - name: temp
    path: /tmp

Docker In Docker 相关问题

如果无法在插件容器内启动 docker 守护进程,你将在流水线日志中看到以下内容。此问题最常见的根本原因是安全软件(selinux、apparmor 等)阻止了嵌套容器化。

1
level=fatal msg="Error authenticating: exit status 1"

这可以通过以下插件配置进一步分类:

1
2
3
4
5
6
7
8
steps:
- name: docker  
  image: plugins/docker
  settings:
    repo: foo/bar
    username: kevinbacon
    password: pa55word
    debug: true

如果 docker 运行失败,你将在流水线日志中看到以下内容:

1
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed: iptables -t nat -N DOCKER: iptables v1.8.3 (legacy): can’t initialize iptables table `nat’: Permission denied (you must be root)

如果 docker 运行成功,你将在流水线日志中看到以下内容:

1
2
time=“2021-01-21T14:15:59.634657433Z” level=info msg=“Daemon has completed initialization”
time=“2021-01-21T14:15:59.661299094Z” level=info msg=“API listen on /var/run/docker.sock”