Skip to content

Commit

Permalink
update compose-go
Browse files Browse the repository at this point in the history
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
  • Loading branch information
ndeloof committed Dec 20, 2022
1 parent ab79187 commit 3a76748
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 58 deletions.
2 changes: 1 addition & 1 deletion go.mod
Expand Up @@ -5,7 +5,7 @@ go 1.19
require (
github.com/AlecAivazis/survey/v2 v2.3.6
github.com/buger/goterm v1.0.4
github.com/compose-spec/compose-go v1.8.0
github.com/compose-spec/compose-go v1.8.1
github.com/containerd/console v1.0.3
github.com/containerd/containerd v1.6.14
github.com/distribution/distribution/v3 v3.0.0-20221201083218-92d136e113cf
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Expand Up @@ -115,8 +115,8 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/compose-spec/compose-go v1.8.0 h1:fD2b8YDZVcSicKM0EEXsUdy+97PKza6+bjuXfSloNdM=
github.com/compose-spec/compose-go v1.8.0/go.mod h1:Tb5Ae2PsYN3GTqYqzl2IRbTPiJtPZZjMw8UKUvmehFk=
github.com/compose-spec/compose-go v1.8.1 h1:TiWxTWtaxUe3XsWMyl7vo8s9IYxlrgtp0pZ+COBMjEw=
github.com/compose-spec/compose-go v1.8.1/go.mod h1:Tb5Ae2PsYN3GTqYqzl2IRbTPiJtPZZjMw8UKUvmehFk=
github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw=
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
Expand Down
8 changes: 5 additions & 3 deletions pkg/compose/build.go
Expand Up @@ -42,6 +42,11 @@ import (

func (s *composeService) Build(ctx context.Context, project *types.Project, options api.BuildOptions) error {
return progress.Run(ctx, func(ctx context.Context) error {
if buildkitEnabled, err := s.dockerCli.BuildKitEnabled(); err != nil || !buildkitEnabled {
_, err := s.doBuildClassic(ctx, project, options)
return err
}

return s.build(ctx, project, options)
})
}
Expand Down Expand Up @@ -210,9 +215,6 @@ func (s *composeService) doBuild(ctx context.Context, project *types.Project, op
if len(opts) == 0 {
return nil, nil
}
if buildkitEnabled, err := s.dockerCli.BuildKitEnabled(); err != nil || !buildkitEnabled {
return s.doBuildClassic(ctx, project, opts)
}
return s.doBuildBuildkit(ctx, opts, mode)
}

Expand Down
81 changes: 29 additions & 52 deletions pkg/compose/build_classic.go
Expand Up @@ -27,10 +27,11 @@ import (
"strings"

"github.com/compose-spec/compose-go/types"
buildx "github.com/docker/buildx/build"
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command/image/build"
"github.com/docker/compose/v2/pkg/utils"
dockertypes "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/builder/remotecontext/urlutil"
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/idtools"
Expand All @@ -43,31 +44,29 @@ import (
"github.com/docker/compose/v2/pkg/api"
)

func (s *composeService) doBuildClassic(ctx context.Context, project *types.Project, opts map[string]buildx.Options) (map[string]string, error) {
func (s *composeService) doBuildClassic(ctx context.Context, project *types.Project, options api.BuildOptions) (map[string]string, error) {
var nameDigests = make(map[string]string)
var errs error
err := project.WithServices(nil, func(service types.ServiceConfig) error {
imageName := api.GetImageNameOrDefault(service, project.Name)
o, ok := opts[imageName]
if !ok {
return nil

for _, service := range project.Services {
if service.Build == nil {
continue
}
digest, err := s.doBuildClassicSimpleImage(ctx, o)
if len(options.Services) > 0 && utils.StringContains(options.Services, service.Name) {
continue
}
imageName := api.GetImageNameOrDefault(service, project.Name)
digest, err := s.doBuildClassicSimpleImage(ctx, service.Build, options)
if err != nil {
errs = multierror.Append(errs, err).ErrorOrNil()
}
nameDigests[imageName] = digest
return nil
})
if err != nil {
return nil, err
}

return nameDigests, errs
}

//nolint:gocyclo
func (s *composeService) doBuildClassicSimpleImage(ctx context.Context, options buildx.Options) (string, error) {
func (s *composeService) doBuildClassicSimpleImage(ctx context.Context, cfg *types.BuildConfig, options api.BuildOptions) (string, error) {
var (
buildCtx io.ReadCloser
dockerfileCtx io.ReadCloser
Expand All @@ -78,25 +77,19 @@ func (s *composeService) doBuildClassicSimpleImage(ctx context.Context, options
err error
)

dockerfileName := options.Inputs.DockerfilePath
specifiedContext := options.Inputs.ContextPath
dockerfileName := cfg.Dockerfile
specifiedContext := cfg.Context
progBuff := s.stdout()
buildBuff := s.stdout()
if options.ImageIDFile != "" {
// Avoid leaving a stale file if we eventually fail
if err := os.Remove(options.ImageIDFile); err != nil && !os.IsNotExist(err) {
return "", errors.Wrap(err, "removing image ID file")
}
}

if len(options.Platforms) > 1 {
if len(cfg.Platforms) > 1 {
return "", errors.Errorf("this builder doesn't support multi-arch build, set DOCKER_BUILDKIT=1 to use multi-arch builder")
}

if options.Labels == nil {
options.Labels = make(map[string]string)
if cfg.Labels == nil {
cfg.Labels = make(map[string]string)
}
options.Labels[api.ImageBuilderLabel] = "classic"
cfg.Labels[api.ImageBuilderLabel] = "classic"

switch {
case isLocalDir(specifiedContext):
Expand Down Expand Up @@ -175,7 +168,7 @@ func (s *composeService) doBuildClassicSimpleImage(ctx context.Context, options
for k, auth := range creds {
authConfigs[k] = dockertypes.AuthConfig(auth)
}
buildOptions := imageBuildOptions(options)
buildOptions := imageBuildOptions(cfg, options)
buildOptions.Version = dockertypes.BuilderV1
buildOptions.Dockerfile = relDockerfile
buildOptions.AuthConfigs = authConfigs
Expand Down Expand Up @@ -221,15 +214,6 @@ func (s *composeService) doBuildClassicSimpleImage(ctx context.Context, options
"files and directories.")
}

if options.ImageIDFile != "" {
if imageID == "" {
return "", errors.Errorf("Server did not provide an image ID. Cannot write %s", options.ImageIDFile)
}
if err := os.WriteFile(options.ImageIDFile, []byte(imageID), 0o666); err != nil {
return "", err
}
}

return imageID, nil
}

Expand All @@ -238,25 +222,18 @@ func isLocalDir(c string) bool {
return err == nil
}

func imageBuildOptions(options buildx.Options) dockertypes.ImageBuildOptions {
func imageBuildOptions(cfg *types.BuildConfig, options api.BuildOptions) dockertypes.ImageBuildOptions {
return dockertypes.ImageBuildOptions{
Tags: options.Tags,
Tags: cfg.Tags,
NoCache: options.NoCache,
Remove: true,
PullParent: options.Pull,
BuildArgs: toMapStringStringPtr(options.BuildArgs),
Labels: options.Labels,
NetworkMode: options.NetworkMode,
ExtraHosts: options.ExtraHosts,
Target: options.Target,
}
}

func toMapStringStringPtr(source map[string]string) map[string]*string {
dest := make(map[string]*string)
for k, v := range source {
v := v
dest[k] = &v
BuildArgs: cfg.Args,
Labels: cfg.Labels,
NetworkMode: cfg.Network,
ExtraHosts: cfg.ExtraHosts.AsList(),
Target: cfg.Target,
Isolation: container.Isolation(cfg.Isolation),
CacheFrom: cfg.CacheFrom,
}
return dest
}
1 change: 1 addition & 0 deletions pkg/compose/create.go
Expand Up @@ -375,6 +375,7 @@ func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project,
NetworkMode: container.NetworkMode(service.NetworkMode),
Init: service.Init,
IpcMode: container.IpcMode(service.Ipc),
CgroupnsMode: container.CgroupnsMode(service.Cgroup),
ReadonlyRootfs: service.ReadOnly,
RestartPolicy: getRestartPolicy(service),
ShmSize: int64(service.ShmSize),
Expand Down

0 comments on commit 3a76748

Please sign in to comment.