mirror of https://code.forgejo.org/forgejo/runner
Improve the usage of `docker_host` configuration (#260)
Follow #242, #244 Fixes #258 Users could use `docker_host` configuration to specify which docker daemon will be used by act_runner. - If `docker_host` is **empty**, act_runner will find an available docker host automatically. - If `docker_host` is **"-"**, act_runner will find an available docker host automatically, but the docker host won't be mounted to the job containers and service containers. - If `docker_host` is **not empty or "-"**, the specified docker host will be used. An error will be returned if it doesn't work. Reviewed-on: https://gitea.com/gitea/act_runner/pulls/260 Co-authored-by: Zettat123 <zettat123@gmail.com> Co-committed-by: Zettat123 <zettat123@gmail.com>pull/41/head
parent
b0bd503b11
commit
ccc27329dc
|
@ -63,9 +63,28 @@ func runDaemon(ctx context.Context, configFile *string) func(cmd *cobra.Command,
|
||||||
}
|
}
|
||||||
|
|
||||||
if ls.RequireDocker() {
|
if ls.RequireDocker() {
|
||||||
if err := envcheck.CheckIfDockerRunning(ctx, cfg); err != nil {
|
dockerSocketPath, err := getDockerSocketPath(cfg.Container.DockerHost)
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err := envcheck.CheckIfDockerRunning(ctx, dockerSocketPath); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// if dockerSocketPath passes the check, override DOCKER_HOST with dockerSocketPath
|
||||||
|
os.Setenv("DOCKER_HOST", dockerSocketPath)
|
||||||
|
// empty cfg.Container.DockerHost means act_runner need to find an available docker host automatically
|
||||||
|
// and assign the path to cfg.Container.DockerHost
|
||||||
|
if cfg.Container.DockerHost == "" {
|
||||||
|
cfg.Container.DockerHost = dockerSocketPath
|
||||||
|
}
|
||||||
|
// check the scheme, if the scheme is not npipe or unix
|
||||||
|
// set cfg.Container.DockerHost to "-" because it can't be mounted to the job conatiner
|
||||||
|
if protoIndex := strings.Index(cfg.Container.DockerHost, "://"); protoIndex != -1 {
|
||||||
|
scheme := cfg.Container.DockerHost[:protoIndex]
|
||||||
|
if !strings.EqualFold(scheme, "npipe") && !strings.EqualFold(scheme, "unix") {
|
||||||
|
cfg.Container.DockerHost = "-"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cli := client.New(
|
cli := client.New(
|
||||||
|
@ -140,3 +159,17 @@ func initLogging(cfg *config.Config) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getDockerSocketPath(configDockerHost string) (string, error) {
|
||||||
|
// a `-` means don't mount the docker socket to job containers
|
||||||
|
if configDockerHost != "" && configDockerHost != "-" {
|
||||||
|
return configDockerHost, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
socket, found := os.LookupEnv("DOCKER_HOST")
|
||||||
|
if found {
|
||||||
|
return socket, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", fmt.Errorf("daemon Docker Engine socket not found and docker_host config was invalid")
|
||||||
|
}
|
||||||
|
|
|
@ -195,6 +195,7 @@ func (r *Runner) run(ctx context.Context, task *runnerv1.Task, reporter *report.
|
||||||
ContainerMaxLifetime: maxLifetime,
|
ContainerMaxLifetime: maxLifetime,
|
||||||
ContainerNetworkMode: container.NetworkMode(r.cfg.Container.Network),
|
ContainerNetworkMode: container.NetworkMode(r.cfg.Container.Network),
|
||||||
ContainerOptions: r.cfg.Container.Options,
|
ContainerOptions: r.cfg.Container.Options,
|
||||||
|
ContainerDaemonSocket: r.cfg.Container.DockerHost,
|
||||||
Privileged: r.cfg.Container.Privileged,
|
Privileged: r.cfg.Container.Privileged,
|
||||||
DefaultActionsURLs: parseDefaultActionsURLs(taskContext["gitea_default_actions_url"].GetStringValue()),
|
DefaultActionsURLs: parseDefaultActionsURLs(taskContext["gitea_default_actions_url"].GetStringValue()),
|
||||||
PlatformPicker: r.labels.PickPlatform,
|
PlatformPicker: r.labels.PickPlatform,
|
||||||
|
|
|
@ -69,8 +69,9 @@ container:
|
||||||
# - '**'
|
# - '**'
|
||||||
valid_volumes: []
|
valid_volumes: []
|
||||||
# overrides the docker client host with the specified one.
|
# overrides the docker client host with the specified one.
|
||||||
# default value is the value of DOCKER_HOST environment variable.
|
# If it's empty, act_runner will find an available docker host automatically.
|
||||||
# if DOCKER_HOST is not set, the default value is unix:///var/run/docker.sock
|
# If it's "-", act_runner will find an available docker host automatically, but the docker host won't be mounted to the job containers and service containers.
|
||||||
|
# If it's not empty or "-", the specified docker host will be used. An error will be returned if it doesn't work.
|
||||||
docker_host: ""
|
docker_host: ""
|
||||||
|
|
||||||
host:
|
host:
|
||||||
|
|
|
@ -8,17 +8,15 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
|
|
||||||
"gitea.com/gitea/act_runner/internal/pkg/config"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func CheckIfDockerRunning(ctx context.Context, cfg *config.Config) error {
|
func CheckIfDockerRunning(ctx context.Context, configDockerHost string) error {
|
||||||
opts := []client.Opt{
|
opts := []client.Opt{
|
||||||
client.FromEnv,
|
client.FromEnv,
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Container.DockerHost != "" {
|
if configDockerHost != "" {
|
||||||
opts = append(opts, client.WithHost(cfg.Container.DockerHost))
|
opts = append(opts, client.WithHost(configDockerHost))
|
||||||
}
|
}
|
||||||
|
|
||||||
cli, err := client.NewClientWithOpts(opts...)
|
cli, err := client.NewClientWithOpts(opts...)
|
||||||
|
|
Loading…
Reference in New Issue