Add support to define a custom docker network and enable docker ipv6 (#893)

- Add support to define a custom docker network and enable docker ipv6
- Adjust docs
This commit is contained in:
Anbraten 2022-04-29 15:15:32 +02:00 committed by GitHub
parent 9c6c4559a7
commit 62a1fd8dcb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 68 additions and 43 deletions

View file

@ -155,6 +155,10 @@ Configures if the gRPC server certificate should be verified, only valid when `W
Configures the backend engine to run pipelines on. Possible values are `auto-detect`, `docker`, `local` or `ssh`. Configures the backend engine to run pipelines on. Possible values are `auto-detect`, `docker`, `local` or `ssh`.
### `WOODPECKER_BACKEND_DOCKER_*`
See [Docker backend configuration](backends/docker/#configuration)
### `WOODPECKER_BACKEND_SSH_*` ### `WOODPECKER_BACKEND_SSH_*`
See [SSH backend configuration](backends/ssh/#configuration) See [SSH backend configuration](backends/ssh/#configuration)

View file

@ -1 +1,15 @@
# Docker backend # Docker backend
This is the original backend used with Woodpecker. The docker backend executes each step inside a separate container started on the agent.
## Configuration
### `WOODPECKER_BACKEND_DOCKER_NETWORK`
> Default: empty
Set to the name of an existing network which will be attached to all your pipeline containers (steps). Please be careful as this allows the containers of different piplines to access each other!
### `WOODPECKER_BACKEND_DOCKER_ENABLE_IPV6`
> Default: `false`
Enable IPv6 for the networks used by pipeline containers (steps). Make sure you configured your docker daemon to support IPv6.

View file

@ -254,37 +254,37 @@ execute a local build
**--build-created**="": (default: 0) **--build-created**="": (default: 0)
**--build-event**="": **--build-event**="":
**--build-finished**="": (default: 0) **--build-finished**="": (default: 0)
**--build-link**="": **--build-link**="":
**--build-number**="": (default: 0) **--build-number**="": (default: 0)
**--build-started**="": (default: 0) **--build-started**="": (default: 0)
**--build-status**="": **--build-status**="":
**--build-target**="": **--build-target**="":
**--commit-author-avatar**="": **--commit-author-avatar**="":
**--commit-author-email**="": **--commit-author-email**="":
**--commit-author-name**="": **--commit-author-name**="":
**--commit-branch**="": **--commit-branch**="":
**--commit-message**="": **--commit-message**="":
**--commit-ref**="": **--commit-ref**="":
**--commit-refspec**="": **--commit-refspec**="":
**--commit-sha**="": **--commit-sha**="":
**--env**="": **--env**="":
**--job-number**="": (default: 0) **--job-number**="": (default: 0)
@ -292,11 +292,11 @@ execute a local build
**--log-level**="": set logging level (default: info) **--log-level**="": set logging level (default: info)
**--netrc-machine**="": **--netrc-machine**="":
**--netrc-password**="": **--netrc-password**="":
**--netrc-username**="": **--netrc-username**="":
**--network**="": external networks **--network**="": external networks
@ -304,43 +304,43 @@ execute a local build
**--prev-build-created**="": (default: 0) **--prev-build-created**="": (default: 0)
**--prev-build-event**="": **--prev-build-event**="":
**--prev-build-finished**="": (default: 0) **--prev-build-finished**="": (default: 0)
**--prev-build-link**="": **--prev-build-link**="":
**--prev-build-number**="": (default: 0) **--prev-build-number**="": (default: 0)
**--prev-build-started**="": (default: 0) **--prev-build-started**="": (default: 0)
**--prev-build-status**="": **--prev-build-status**="":
**--prev-commit-author-avatar**="": **--prev-commit-author-avatar**="":
**--prev-commit-author-email**="": **--prev-commit-author-email**="":
**--prev-commit-author-name**="": **--prev-commit-author-name**="":
**--prev-commit-branch**="": **--prev-commit-branch**="":
**--prev-commit-message**="": **--prev-commit-message**="":
**--prev-commit-ref**="": **--prev-commit-ref**="":
**--prev-commit-refspec**="": **--prev-commit-refspec**="":
**--prev-commit-sha**="": **--prev-commit-sha**="":
**--privileged**="": privileged plugins (default: [plugins/docker plugins/gcr plugins/ecr woodpeckerci/plugin-docker woodpeckerci/plugin-docker-buildx]) **--privileged**="": privileged plugins (default: [plugins/docker plugins/gcr plugins/ecr woodpeckerci/plugin-docker woodpeckerci/plugin-docker-buildx])
**--repo-link**="": **--repo-link**="":
**--repo-name**="": **--repo-name**="":
**--repo-private**="": **--repo-private**="":
**--repo-remote-url**="": **--repo-remote-url**="":
**--server, -s**="": server address **--server, -s**="": server address

View file

@ -4,6 +4,7 @@ import (
"context" "context"
"io" "io"
"os" "os"
"strconv"
"strings" "strings"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
@ -19,7 +20,9 @@ import (
) )
type docker struct { type docker struct {
client client.APIClient client client.APIClient
enableIPv6 bool
network string
} }
// make sure docker implements Engine // make sure docker implements Engine
@ -52,6 +55,10 @@ func (e *docker) Load() error {
} }
e.client = cli e.client = cli
e.enableIPv6, _ = strconv.ParseBool(os.Getenv("WOODPECKER_BACKEND_DOCKER_ENABLE_IPV6"))
e.network = os.Getenv("WOODPECKER_BACKEND_DOCKER_NETWORK")
return nil return nil
} }
@ -69,8 +76,9 @@ func (e *docker) Setup(_ context.Context, conf *backend.Config) error {
} }
for _, n := range conf.Networks { for _, n := range conf.Networks {
_, err := e.client.NetworkCreate(noContext, n.Name, types.NetworkCreate{ _, err := e.client.NetworkCreate(noContext, n.Name, types.NetworkCreate{
Driver: n.Driver, Driver: n.Driver,
Options: n.DriverOpts, Options: n.DriverOpts,
EnableIPv6: e.enableIPv6,
// Labels: defaultLabels, // Labels: defaultLabels,
}) })
if err != nil { if err != nil {
@ -137,16 +145,15 @@ func (e *docker) Exec(ctx context.Context, proc *backend.Step) error {
return err return err
} }
} }
}
// if proc.Network != "host" { // or bridge, overlay, none, internal, container:<name> .... // join the container to an existing network
// err = e.client.NetworkConnect(ctx, proc.Network, proc.Name, &network.EndpointSettings{ if e.network != "" {
// Aliases: proc.NetworkAliases, err = e.client.NetworkConnect(ctx, e.network, proc.Name, &network.EndpointSettings{})
// }) if err != nil {
// if err != nil { return err
// return err }
// } }
// } }
return e.client.ContainerStart(ctx, proc.Name, startOpts) return e.client.ContainerStart(ctx, proc.Name, startOpts)
} }