mirror of
https://code.forgejo.org/forgejo/runner.git
synced 2025-09-15 18:57:01 +00:00
use container image platform only on docker 1.41+ (#591)
Commit fef399d057
introduced support for
specifying a container image platform for cross-platform image building.
Unfortunately, attempting to execute a docker command that includes the
`--platform` flag against Docker daemons using API Version 1.40 and
before results in the following error:
```
"specify container image platform" requires API version 1.41, but the Docker daemon API version is 1.40
```
To allow `act` to be used on the 19.03 Docker CE and earlier versions,
this patch simply checks the Docker daemon API version and only
specifies platform specification when the daemon API version is 1.41 or
greater.
Fixes Issue #586
This commit is contained in:
parent
12268f9242
commit
6d023b011e
2 changed files with 33 additions and 9 deletions
|
@ -26,6 +26,7 @@ import (
|
|||
"github.com/docker/docker/pkg/stdcopy"
|
||||
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
|
||||
"github.com/Masterminds/semver"
|
||||
"github.com/pkg/errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"golang.org/x/term"
|
||||
|
@ -77,6 +78,25 @@ func NewContainer(input *NewContainerInput) Container {
|
|||
return cr
|
||||
}
|
||||
|
||||
// supportsContainerImagePlatform returns true if the underlying Docker server
|
||||
// API version is 1.41 and beyond
|
||||
func supportsContainerImagePlatform(cli *client.Client) bool {
|
||||
ctx := context.TODO()
|
||||
logger := common.Logger(ctx)
|
||||
ver, err := cli.ServerVersion(ctx)
|
||||
if err != nil {
|
||||
logger.Panicf("Failed to get Docker API Version: %s", err)
|
||||
return false
|
||||
}
|
||||
sv, err := semver.NewVersion(ver.APIVersion)
|
||||
if err != nil {
|
||||
logger.Panicf("Failed to unmarshal Docker Version: %s", err)
|
||||
return false
|
||||
}
|
||||
constraint, _ := semver.NewConstraint(">= 1.41")
|
||||
return constraint.Check(sv)
|
||||
}
|
||||
|
||||
func (cr *containerReference) Create() common.Executor {
|
||||
return common.
|
||||
NewDebugExecutor("%sdocker create image=%s platform=%s entrypoint=%+q cmd=%+q", logPrefix, cr.input.Image, cr.input.Platform, cr.input.Entrypoint, cr.input.Cmd).
|
||||
|
@ -272,22 +292,26 @@ func (cr *containerReference) create() common.Executor {
|
|||
})
|
||||
}
|
||||
|
||||
desiredPlatform := strings.SplitN(cr.input.Platform, `/`, 2)
|
||||
var platSpecs *specs.Platform
|
||||
if supportsContainerImagePlatform(cr.cli) {
|
||||
desiredPlatform := strings.SplitN(cr.input.Platform, `/`, 2)
|
||||
|
||||
if len(desiredPlatform) != 2 {
|
||||
logger.Panicf("Incorrect container platform option. %s is not a valid platform.", cr.input.Platform)
|
||||
if len(desiredPlatform) != 2 {
|
||||
logger.Panicf("Incorrect container platform option. %s is not a valid platform.", cr.input.Platform)
|
||||
}
|
||||
|
||||
platSpecs = &specs.Platform{
|
||||
Architecture: desiredPlatform[1],
|
||||
OS: desiredPlatform[0],
|
||||
}
|
||||
}
|
||||
|
||||
resp, err := cr.cli.ContainerCreate(ctx, config, &container.HostConfig{
|
||||
Binds: input.Binds,
|
||||
Mounts: mounts,
|
||||
NetworkMode: container.NetworkMode(input.NetworkMode),
|
||||
Privileged: input.Privileged,
|
||||
UsernsMode: container.UsernsMode(input.UsernsMode),
|
||||
}, nil, &specs.Platform{
|
||||
Architecture: desiredPlatform[1],
|
||||
OS: desiredPlatform[0],
|
||||
}, input.Name)
|
||||
}, nil, platSpecs, input.Name)
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue