fix: try finding a socket, otherwise fail, respect user choice (#1745)
* fix: try finding a socket, otherwise fail, respect user choice * Update cmd/root.go Co-authored-by: Jason Song <i@wolfogre.com> * Update cmd/root.go Co-authored-by: Jason Song <i@wolfogre.com> --------- Co-authored-by: Jason Song <i@wolfogre.com>
This commit is contained in:
parent
3715266494
commit
b6718fdf5d
2 changed files with 50 additions and 21 deletions
68
cmd/root.go
68
cmd/root.go
|
@ -80,7 +80,7 @@ func Execute(ctx context.Context, version string) {
|
||||||
rootCmd.PersistentFlags().StringVarP(&input.envfile, "env-file", "", ".env", "environment file to read and use as env in the containers")
|
rootCmd.PersistentFlags().StringVarP(&input.envfile, "env-file", "", ".env", "environment file to read and use as env in the containers")
|
||||||
rootCmd.PersistentFlags().StringVarP(&input.inputfile, "input-file", "", ".input", "input file to read and use as action input")
|
rootCmd.PersistentFlags().StringVarP(&input.inputfile, "input-file", "", ".input", "input file to read and use as action input")
|
||||||
rootCmd.PersistentFlags().StringVarP(&input.containerArchitecture, "container-architecture", "", "", "Architecture which should be used to run containers, e.g.: linux/amd64. If not specified, will use host default architecture. Requires Docker server API Version 1.41+. Ignored on earlier Docker server platforms.")
|
rootCmd.PersistentFlags().StringVarP(&input.containerArchitecture, "container-architecture", "", "", "Architecture which should be used to run containers, e.g.: linux/amd64. If not specified, will use host default architecture. Requires Docker server API Version 1.41+. Ignored on earlier Docker server platforms.")
|
||||||
rootCmd.PersistentFlags().StringVarP(&input.containerDaemonSocket, "container-daemon-socket", "", "/var/run/docker.sock", "Path to Docker daemon socket which will be mounted to containers")
|
rootCmd.PersistentFlags().StringVarP(&input.containerDaemonSocket, "container-daemon-socket", "", "", "URI to Docker Engine socket (e.g.: unix://~/.docker/run/docker.sock)")
|
||||||
rootCmd.PersistentFlags().StringVarP(&input.containerOptions, "container-options", "", "", "Custom docker container options for the job container without an options property in the job definition")
|
rootCmd.PersistentFlags().StringVarP(&input.containerOptions, "container-options", "", "", "Custom docker container options for the job container without an options property in the job definition")
|
||||||
rootCmd.PersistentFlags().StringVarP(&input.githubInstance, "github-instance", "", "github.com", "GitHub instance to use. Don't use this if you are not using GitHub Enterprise Server.")
|
rootCmd.PersistentFlags().StringVarP(&input.githubInstance, "github-instance", "", "github.com", "GitHub instance to use. Don't use this if you are not using GitHub Enterprise Server.")
|
||||||
rootCmd.PersistentFlags().StringVarP(&input.artifactServerPath, "artifact-server-path", "", "", "Defines the path where the artifact server stores uploads and retrieves downloads from. If not specified the artifact server will not start.")
|
rootCmd.PersistentFlags().StringVarP(&input.artifactServerPath, "artifact-server-path", "", "", "Defines the path where the artifact server stores uploads and retrieves downloads from. If not specified the artifact server will not start.")
|
||||||
|
@ -118,6 +118,33 @@ func configLocations() []string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var commonSocketPaths = []string{
|
||||||
|
"/var/run/docker.sock",
|
||||||
|
"/var/run/podman/podman.sock",
|
||||||
|
"$HOME/.colima/docker.sock",
|
||||||
|
"$XDG_RUNTIME_DIR/docker.sock",
|
||||||
|
`\\.\pipe\docker_engine`,
|
||||||
|
"$HOME/.docker/run/docker.sock",
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns socket path or false if not found any
|
||||||
|
func socketLocation() (string, bool) {
|
||||||
|
if dockerHost, exists := os.LookupEnv("DOCKER_HOST"); exists {
|
||||||
|
return dockerHost, true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, p := range commonSocketPaths {
|
||||||
|
if _, err := os.Lstat(os.ExpandEnv(p)); err == nil {
|
||||||
|
if strings.HasPrefix(p, `\\.\`) {
|
||||||
|
return "npipe://" + os.ExpandEnv(p), true
|
||||||
|
}
|
||||||
|
return "unix://" + os.ExpandEnv(p), true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
func args() []string {
|
func args() []string {
|
||||||
actrc := configLocations()
|
actrc := configLocations()
|
||||||
|
|
||||||
|
@ -131,15 +158,6 @@ func args() []string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func bugReport(ctx context.Context, version string) error {
|
func bugReport(ctx context.Context, version string) error {
|
||||||
var commonSocketPaths = []string{
|
|
||||||
"/var/run/docker.sock",
|
|
||||||
"/var/run/podman/podman.sock",
|
|
||||||
"$HOME/.colima/docker.sock",
|
|
||||||
"$XDG_RUNTIME_DIR/docker.sock",
|
|
||||||
`\\.\pipe\docker_engine`,
|
|
||||||
"$HOME/.docker/run/docker.sock",
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf := func(key, val string) string {
|
sprintf := func(key, val string) string {
|
||||||
return fmt.Sprintf("%-24s%s\n", key, val)
|
return fmt.Sprintf("%-24s%s\n", key, val)
|
||||||
}
|
}
|
||||||
|
@ -150,19 +168,20 @@ func bugReport(ctx context.Context, version string) error {
|
||||||
report += sprintf("NumCPU:", fmt.Sprint(runtime.NumCPU()))
|
report += sprintf("NumCPU:", fmt.Sprint(runtime.NumCPU()))
|
||||||
|
|
||||||
var dockerHost string
|
var dockerHost string
|
||||||
if dockerHost = os.Getenv("DOCKER_HOST"); dockerHost == "" {
|
var exists bool
|
||||||
dockerHost = "DOCKER_HOST environment variable is unset/empty."
|
if dockerHost, exists = os.LookupEnv("DOCKER_HOST"); !exists {
|
||||||
|
dockerHost = "DOCKER_HOST environment variable is not set"
|
||||||
|
} else if dockerHost == "" {
|
||||||
|
dockerHost = "DOCKER_HOST environment variable is empty."
|
||||||
}
|
}
|
||||||
|
|
||||||
report += sprintf("Docker host:", dockerHost)
|
report += sprintf("Docker host:", dockerHost)
|
||||||
report += fmt.Sprintln("Sockets found:")
|
report += fmt.Sprintln("Sockets found:")
|
||||||
for _, p := range commonSocketPaths {
|
for _, p := range commonSocketPaths {
|
||||||
if strings.HasPrefix(p, `$`) {
|
if _, err := os.Lstat(os.ExpandEnv(p)); err != nil {
|
||||||
v := strings.Split(p, `/`)[0]
|
|
||||||
p = strings.Replace(p, v, os.Getenv(strings.TrimPrefix(v, `$`)), 1)
|
|
||||||
}
|
|
||||||
if _, err := os.Stat(p); err != nil {
|
|
||||||
continue
|
continue
|
||||||
|
} else if _, err := os.Stat(os.ExpandEnv(p)); err != nil {
|
||||||
|
report += fmt.Sprintf("\t%s(broken)\n", p)
|
||||||
} else {
|
} else {
|
||||||
report += fmt.Sprintf("\t%s\n", p)
|
report += fmt.Sprintf("\t%s\n", p)
|
||||||
}
|
}
|
||||||
|
@ -342,6 +361,19 @@ func newRunCommand(ctx context.Context, input *Input) func(*cobra.Command, []str
|
||||||
return bugReport(ctx, cmd.Version)
|
return bugReport(ctx, cmd.Version)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var socketPath string
|
||||||
|
if input.containerDaemonSocket != "" {
|
||||||
|
socketPath = input.containerDaemonSocket
|
||||||
|
} else {
|
||||||
|
socket, found := socketLocation()
|
||||||
|
if !found && input.containerDaemonSocket == "" {
|
||||||
|
log.Errorln("daemon Docker Engine socket not found and containerDaemonSocket option was not set")
|
||||||
|
} else {
|
||||||
|
socketPath = socket
|
||||||
|
}
|
||||||
|
}
|
||||||
|
os.Setenv("DOCKER_HOST", socketPath)
|
||||||
|
|
||||||
if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" && input.containerArchitecture == "" {
|
if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" && input.containerArchitecture == "" {
|
||||||
l := log.New()
|
l := log.New()
|
||||||
l.SetFormatter(&log.TextFormatter{
|
l.SetFormatter(&log.TextFormatter{
|
||||||
|
@ -533,7 +565,7 @@ func newRunCommand(ctx context.Context, input *Input) func(*cobra.Command, []str
|
||||||
Privileged: input.privileged,
|
Privileged: input.privileged,
|
||||||
UsernsMode: input.usernsMode,
|
UsernsMode: input.usernsMode,
|
||||||
ContainerArchitecture: input.containerArchitecture,
|
ContainerArchitecture: input.containerArchitecture,
|
||||||
ContainerDaemonSocket: input.containerDaemonSocket,
|
ContainerDaemonSocket: socketPath,
|
||||||
ContainerOptions: input.containerOptions,
|
ContainerOptions: input.containerOptions,
|
||||||
UseGitIgnore: input.useGitIgnore,
|
UseGitIgnore: input.useGitIgnore,
|
||||||
GitHubInstance: input.githubInstance,
|
GitHubInstance: input.githubInstance,
|
||||||
|
|
|
@ -189,9 +189,6 @@ type containerReference struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetDockerClient(ctx context.Context) (cli client.APIClient, err error) {
|
func GetDockerClient(ctx context.Context) (cli client.APIClient, err error) {
|
||||||
// TODO: this should maybe need to be a global option, not hidden in here?
|
|
||||||
// though i'm not sure how that works out when there's another Executor :D
|
|
||||||
// I really would like something that works on OSX native for eg
|
|
||||||
dockerHost := os.Getenv("DOCKER_HOST")
|
dockerHost := os.Getenv("DOCKER_HOST")
|
||||||
|
|
||||||
if strings.HasPrefix(dockerHost, "ssh://") {
|
if strings.HasPrefix(dockerHost, "ssh://") {
|
||||||
|
|
Loading…
Add table
Reference in a new issue