跳到主要内容

Docker Compose

这个示例 docker-compose 设置展示了连接到 GitHub 的 Woodpecker 实例部署(WOODPECKER_GITHUB=true)。如果您使用其他代码托管平台,请更改此设置以及相应的密钥设置。

它为服务器和代理配置目录创建持久卷。捆绑的 SQLite 数据库存储在 /var/lib/woodpecker 中,这是需要持久化的最重要部分,因为它保存了所有用户和仓库信息。

服务器使用默认端口 8000 并在此处暴露给主机,因此可以通过主机上的此端口或前面的反向代理访问 Woodpecker。

docker-compose.yaml
services:
woodpecker-server:
image: woodpeckerci/woodpecker-server:v3
ports:
- 8000:8000
volumes:
- woodpecker-server-data:/var/lib/woodpecker/
environment:
- WOODPECKER_OPEN=true
- WOODPECKER_HOST=${WOODPECKER_HOST}
- WOODPECKER_GITHUB=true
- WOODPECKER_GITHUB_CLIENT=${WOODPECKER_GITHUB_CLIENT}
- WOODPECKER_GITHUB_SECRET=${WOODPECKER_GITHUB_SECRET}
- WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}

woodpecker-agent:
image: woodpeckerci/woodpecker-agent:v3
command: agent
restart: always
depends_on:
- woodpecker-server
volumes:
- woodpecker-agent-config:/etc/woodpecker
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WOODPECKER_SERVER=woodpecker-server:9000
- WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}

volumes:
woodpecker-server-data:
woodpecker-agent-config:

Woodpecker 必须知道自己的地址。因此,您必须以 <scheme>://<hostname> 格式指定公共地址。请省略任何尾随斜杠:

docker-compose.yaml
 services:
woodpecker-server:
[...]
environment:
- [...]
+ - WOODPECKER_HOST=${WOODPECKER_HOST}

也可以自定义使用的端口。Woodpecker 为 gRPC 和 HTTP 使用单独的端口。代理进行 gRPC 调用并连接到 gRPC 端口。可以使用 *_ADDR 变量配置它们:

docker-compose.yaml
 services:
woodpecker-server:
[...]
environment:
- [...]
+ - WOODPECKER_GRPC_ADDR=${WOODPECKER_GRPC_ADDR}
+ - WOODPECKER_SERVER_ADDR=${WOODPECKER_HTTP_ADDR}

如果代理通过互联网建立连接,应该为 gRPC 激活 TLS 加密。然后必须正确配置代理:

docker-compose.yaml
 services:
woodpecker-agent:
[...]
environment:
- [...]
+ - WOODPECKER_GRPC_SECURE=true # 默认为 false
+ - WOODPECKER_GRPC_VERIFY=true # 默认值

由于代理将管道步骤作为 Docker 容器执行,它们需要访问主机的 Docker 守护进程:

docker-compose.yaml
 services:
[...]
woodpecker-agent:
[...]
+ volumes:
+ - /var/run/docker.sock:/var/run/docker.sock

代理需要服务器地址来进行代理和服务器之间的通信。代理连接到服务器的 gRPC 端口:

docker-compose.yaml
 services:
woodpecker-agent:
[...]
environment:
+ - WOODPECKER_SERVER=woodpecker-server:9000

服务器和代理使用共享密钥来验证通信。这应该是一个随机字符串,您应该保密。您可以使用 openssl rand -hex 32 创建这样的字符串:

docker-compose.yaml
 services:
woodpecker-server:
[...]
environment:
- [...]
+ - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
woodpecker-agent:
[...]
environment:
- [...]
+ - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}

处理敏感数据

docker composedocker swarm 配置中处理敏感数据有几个选项:

对于 Docker Compose,您可以在 compose 配置旁边使用 .env 文件,将密钥存储在 compose 文件外部。虽然这将配置与密钥分离,但仍然不是很安全。

或者,您也可以使用 docker-secrets。由于对环境变量使用 docker-secrets 可能很困难,Woodpecker 允许通过为所有敏感配置变量提供 *_FILE 选项来从文件读取敏感数据。然后 Woodpecker 将尝试直接从该文件读取值。请注意,如果同时指定了原始环境变量,它将覆盖从文件读取的值。

docker-compose.yaml
 services:
woodpecker-server:
[...]
environment:
- [...]
+ - WOODPECKER_AGENT_SECRET_FILE=/run/secrets/woodpecker-agent-secret
+ secrets:
+ - woodpecker-agent-secret
+
+ secrets:
+ woodpecker-agent-secret:
+ external: true

要在 docker secret 中存储值,您可以使用以下命令:

echo "my_agent_secret_key" | docker secret create woodpecker-agent-secret -