Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package docker-compose for openSUSE:Factory checked in at 2023-07-17 19:23:23 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/docker-compose (Old) and /work/SRC/openSUSE:Factory/.docker-compose.new.3193 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "docker-compose" Mon Jul 17 19:23:23 2023 rev:24 rq:1098800 version:2.20.0 Changes: -------- --- /work/SRC/openSUSE:Factory/docker-compose/docker-compose.changes 2023-06-30 19:59:55.466018965 +0200 +++ /work/SRC/openSUSE:Factory/.docker-compose.new.3193/docker-compose.changes 2023-07-17 19:23:43.885892100 +0200 @@ -1,0 +2,24 @@ +Tue Jul 11 13:36:01 UTC 2023 - ka...@b1-systems.de + +- Update to version 2.20.0: + * ci: speed up a couple Dockerfile targets w/ cache mount + * build(deps): bump github.com/docker/buildx from 0.11.0 to + 0.11.1 + * test: fix process leak in wait e2e test + * Apply no-deps before we select and mutate target service + * support `attach` + * build(deps): bump github.com/opencontainers/image-spec + * build(deps): bump gotest.tools/v3 from 3.4.0 to 3.5.0 + * build(deps): bump github.com/docker/docker + * deps: bump docker/cli-docs-tool to v0.6.0 + * build(deps): bump google.golang.org/grpc from 1.56.0 to 1.56.2 + * fix(secrets): file permission value does not comply with spec + * when --index is not set select first service container + * network: fix random missing network when service has more than + one + * don't use unitialized cli to setup DryRunClient + * fix some comments + * add support of --builder and BUILDX_BUILDER + * Add `docker compose wait` + +------------------------------------------------------------------- Old: ---- compose-2.19.1.obscpio New: ---- compose-2.20.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ docker-compose.spec ++++++ --- /var/tmp/diff_new_pack.9pR6tT/_old 2023-07-17 19:23:44.909898032 +0200 +++ /var/tmp/diff_new_pack.9pR6tT/_new 2023-07-17 19:23:44.917898078 +0200 @@ -19,7 +19,7 @@ %define __arch_install_post export NO_BRP_STRIP_DEBUG=true Name: docker-compose -Version: 2.19.1 +Version: 2.20.0 Release: 0 Summary: Define and run multi-container applications with Docker License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.9pR6tT/_old 2023-07-17 19:23:44.945898240 +0200 +++ /var/tmp/diff_new_pack.9pR6tT/_new 2023-07-17 19:23:44.945898240 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/docker/compose</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v2.19.1</param> + <param name="revision">v2.20.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="versionrewrite-pattern">v(.*)</param> @@ -17,7 +17,7 @@ <param name="compression">gz</param> </service> <service name="go_modules" mode="disabled"> - <param name="archive">compose-2.19.1.obscpio</param> + <param name="archive">compose-2.20.0.obscpio</param> </service> </services> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.9pR6tT/_old 2023-07-17 19:23:44.965898356 +0200 +++ /var/tmp/diff_new_pack.9pR6tT/_new 2023-07-17 19:23:44.965898356 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/docker/compose</param> - <param name="changesrevision">c496c230710d299834cf2586d0f75066dc60d06c</param></service></servicedata> + <param name="changesrevision">e28b223650807aa24a5c7637b6ad17189fb9276c</param></service></servicedata> (No newline at EOF) ++++++ compose-2.19.1.obscpio -> compose-2.20.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/Dockerfile new/compose-2.20.0/Dockerfile --- old/compose-2.19.1/Dockerfile 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/Dockerfile 2023-07-10 19:26:41.000000000 +0200 @@ -91,6 +91,7 @@ ARG BUILD_TAGS RUN --mount=type=bind,target=. \ --mount=type=cache,target=/root/.cache \ + --mount=type=cache,target=/go/pkg/mod \ --mount=from=golangci-lint,source=/usr/bin/golangci-lint,target=/usr/bin/golangci-lint \ golangci-lint run --build-tags "$BUILD_TAGS" ./... @@ -129,6 +130,7 @@ WORKDIR /src RUN --mount=target=. \ --mount=target=/root/.cache,type=cache \ + --mount=type=cache,target=/go/pkg/mod \ go build -o /out/docsgen ./docs/yaml/main/generate.go FROM --platform=${BUILDPLATFORM} alpine AS docs-build diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/cmd/compose/build.go new/compose-2.20.0/cmd/compose/build.go --- old/compose-2.19.1/cmd/compose/build.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/cmd/compose/build.go 2023-07-10 19:26:41.000000000 +0200 @@ -43,6 +43,7 @@ noCache bool memory cliopts.MemBytes ssh string + builder string } func (opts buildOptions) toAPIBuildOptions(services []string) (api.BuildOptions, error) { @@ -54,6 +55,10 @@ return api.BuildOptions{}, err } } + builderName := opts.builder + if builderName == "" { + builderName = os.Getenv("BUILDX_BUILDER") + } return api.BuildOptions{ Pull: opts.pull, @@ -64,6 +69,7 @@ Quiet: opts.quiet, Services: services, SSHs: SSHKeys, + Builder: builderName, }, nil } @@ -101,6 +107,7 @@ cmd.Flags().BoolVar(&opts.pull, "pull", false, "Always attempt to pull a newer version of the image.") cmd.Flags().StringArrayVar(&opts.args, "build-arg", []string{}, "Set build-time variables for services.") cmd.Flags().StringVar(&opts.ssh, "ssh", "", "Set SSH authentications used when building service images. (use 'default' for using your default SSH Agent)") + cmd.Flags().StringVar(&opts.builder, "builder", "", "Set builder to use.") cmd.Flags().Bool("parallel", true, "Build images in parallel. DEPRECATED") cmd.Flags().MarkHidden("parallel") //nolint:errcheck cmd.Flags().Bool("compress", true, "Compress the build context using gzip. DEPRECATED") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/cmd/compose/compose.go new/compose-2.20.0/cmd/compose/compose.go --- old/compose-2.19.1/cmd/compose/compose.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/cmd/compose/compose.go 2023-07-10 19:26:41.000000000 +0200 @@ -26,6 +26,7 @@ "strings" "syscall" + "github.com/compose-spec/compose-go/dotenv" buildx "github.com/docker/buildx/util/progress" "github.com/docker/cli/cli/command" @@ -431,6 +432,7 @@ pullCommand(&opts, backend), createCommand(&opts, backend), copyCommand(&opts, backend), + waitCommand(&opts, backend), alphaCommand(&opts, backend), ) @@ -471,7 +473,7 @@ return err } - envFromFile, err := cli.GetEnvFromFile(composegoutils.GetAsEqualsMap(os.Environ()), workingDir, options.EnvFiles) + envFromFile, err := dotenv.GetEnvFromFile(composegoutils.GetAsEqualsMap(os.Environ()), workingDir, options.EnvFiles) if err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/cmd/compose/cp.go new/compose-2.20.0/cmd/compose/cp.go --- old/compose-2.19.1/cmd/compose/cp.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/cmd/compose/cp.go 2023-07-10 19:26:41.000000000 +0200 @@ -64,10 +64,10 @@ } flags := copyCmd.Flags() - flags.IntVar(&opts.index, "index", 0, "Index of the container if there are multiple instances of a service .") - flags.BoolVar(&opts.all, "all", false, "Copy to all the containers of the service.") + flags.IntVar(&opts.index, "index", 0, "index of the container if service has multiple replicas") + flags.BoolVar(&opts.all, "all", false, "copy to all the containers of the service.") flags.MarkHidden("all") //nolint:errcheck - flags.MarkDeprecated("all", "By default all the containers of the service will get the source file/directory to be copied.") //nolint:errcheck + flags.MarkDeprecated("all", "by default all the containers of the service will get the source file/directory to be copied.") //nolint:errcheck flags.BoolVarP(&opts.followLink, "follow-link", "L", false, "Always follow symbol link in SRC_PATH") flags.BoolVarP(&opts.copyUIDGID, "archive", "a", false, "Archive mode (copy all uid/gid information)") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/cmd/compose/exec.go new/compose-2.20.0/cmd/compose/exec.go --- old/compose-2.19.1/cmd/compose/exec.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/cmd/compose/exec.go 2023-07-10 19:26:41.000000000 +0200 @@ -65,7 +65,7 @@ runCmd.Flags().BoolVarP(&opts.detach, "detach", "d", false, "Detached mode: Run command in the background.") runCmd.Flags().StringArrayVarP(&opts.environment, "env", "e", []string{}, "Set environment variables") - runCmd.Flags().IntVar(&opts.index, "index", 1, "index of the container if there are multiple instances of a service [default: 1].") + runCmd.Flags().IntVar(&opts.index, "index", 0, "index of the container if service has multiple replicas") runCmd.Flags().BoolVarP(&opts.privileged, "privileged", "", false, "Give extended privileges to the process.") runCmd.Flags().StringVarP(&opts.user, "user", "u", "", "Run the command as this user.") runCmd.Flags().BoolVarP(&opts.noTty, "no-TTY", "T", !streams.Out().IsTerminal(), "Disable pseudo-TTY allocation. By default `docker compose exec` allocates a TTY.") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/cmd/compose/port.go new/compose-2.20.0/cmd/compose/port.go --- old/compose-2.19.1/cmd/compose/port.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/cmd/compose/port.go 2023-07-10 19:26:41.000000000 +0200 @@ -57,7 +57,7 @@ ValidArgsFunction: completeServiceNames(p), } cmd.Flags().StringVar(&opts.protocol, "protocol", "tcp", "tcp or udp") - cmd.Flags().IntVar(&opts.index, "index", 1, "index of the container if service has multiple replicas") + cmd.Flags().IntVar(&opts.index, "index", 0, "index of the container if service has multiple replicas") return cmd } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/cmd/compose/run.go new/compose-2.20.0/cmd/compose/run.go --- old/compose-2.19.1/cmd/compose/run.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/cmd/compose/run.go 2023-07-10 19:26:41.000000000 +0200 @@ -63,6 +63,13 @@ } func (options runOptions) apply(project *types.Project) error { + if options.noDeps { + err := project.ForServices([]string{options.Service}, types.IgnoreDependencies) + if err != nil { + return err + } + } + target, err := project.GetService(options.Service) if err != nil { return err @@ -93,13 +100,6 @@ } } - if options.noDeps { - err := project.ForServices([]string{options.Service}, types.IgnoreDependencies) - if err != nil { - return err - } - } - for i, s := range project.Services { if s.Name == options.Service { project.Services[i] = target diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/cmd/compose/up.go new/compose-2.20.0/cmd/compose/up.go --- old/compose-2.19.1/cmd/compose/up.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/cmd/compose/up.go 2023-07-10 19:26:41.000000000 +0200 @@ -21,9 +21,8 @@ "fmt" "time" - "github.com/docker/compose/v2/cmd/formatter" - "github.com/compose-spec/compose-go/types" + "github.com/docker/compose/v2/cmd/formatter" "github.com/spf13/cobra" "github.com/docker/compose/v2/pkg/api" @@ -164,17 +163,31 @@ consumer = formatter.NewLogConsumer(ctx, streams.Out(), streams.Err(), !upOptions.noColor, !upOptions.noPrefix, upOptions.timestamp) } - attachTo := services + attachTo := utils.Set[string]{} if len(upOptions.attach) > 0 { - attachTo = upOptions.attach + attachTo.AddAll(upOptions.attach...) } if upOptions.attachDependencies { - attachTo = project.ServiceNames() + if err := project.WithServices(attachTo.Elements(), func(s types.ServiceConfig) error { + if s.Attach == nil || *s.Attach { + attachTo.Add(s.Name) + } + return nil + }); err != nil { + return err + } } if len(attachTo) == 0 { - attachTo = project.ServiceNames() + if err := project.WithServices(services, func(s types.ServiceConfig) error { + if s.Attach == nil || *s.Attach { + attachTo.Add(s.Name) + } + return nil + }); err != nil { + return err + } } - attachTo = utils.Remove(attachTo, upOptions.noAttach...) + attachTo.RemoveAll(upOptions.noAttach...) create := api.CreateOptions{ Services: services, @@ -198,7 +211,7 @@ Start: api.StartOptions{ Project: project, Attach: consumer, - AttachTo: attachTo, + AttachTo: attachTo.Elements(), ExitCodeFrom: upOptions.exitCodeFrom, CascadeStop: upOptions.cascadeStop, Wait: upOptions.wait, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/cmd/compose/wait.go new/compose-2.20.0/cmd/compose/wait.go --- old/compose-2.19.1/cmd/compose/wait.go 1970-01-01 01:00:00.000000000 +0100 +++ new/compose-2.20.0/cmd/compose/wait.go 2023-07-10 19:26:41.000000000 +0200 @@ -0,0 +1,72 @@ +/* + Copyright 2023 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package compose + +import ( + "context" + "os" + + "github.com/docker/cli/cli" + "github.com/docker/compose/v2/pkg/api" + "github.com/spf13/cobra" +) + +type waitOptions struct { + *ProjectOptions + + services []string + + downProject bool +} + +func waitCommand(p *ProjectOptions, backend api.Service) *cobra.Command { + opts := waitOptions{ + ProjectOptions: p, + } + + var statusCode int64 + var err error + cmd := &cobra.Command{ + Use: "wait SERVICE [SERVICE...] [OPTIONS]", + Short: "Block until the first service container stops", + Args: cli.RequiresMinArgs(1), + RunE: Adapt(func(ctx context.Context, services []string) error { + opts.services = services + statusCode, err = runWait(ctx, backend, &opts) + return err + }), + PostRun: func(cmd *cobra.Command, args []string) { + os.Exit(int(statusCode)) + }, + } + + cmd.Flags().BoolVar(&opts.downProject, "down-project", false, "Drops project when the first container stops") + + return cmd +} + +func runWait(ctx context.Context, backend api.Service, opts *waitOptions) (int64, error) { + _, name, err := opts.projectOrName() + if err != nil { + return 0, err + } + + return backend.Wait(ctx, name, api.WaitOptions{ + Services: opts.services, + DownProjectOnContainerExit: opts.downProject, + }) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/compose.md new/compose-2.20.0/docs/reference/compose.md --- old/compose-2.19.1/docs/reference/compose.md 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/compose.md 2023-07-10 19:26:41.000000000 +0200 @@ -7,7 +7,6 @@ | Name | Description | |:--------------------------------|:------------------------------------------------------------------------| -| [`alpha`](compose_alpha.md) | Experimental commands | | [`build`](compose_build.md) | Build or rebuild services | | [`config`](compose_config.md) | Parse, resolve and render compose file in canonical format | | [`cp`](compose_cp.md) | Copy files/folders between a service container and the local filesystem | @@ -33,6 +32,7 @@ | [`unpause`](compose_unpause.md) | Unpause services | | [`up`](compose_up.md) | Create and start containers | | [`version`](compose_version.md) | Show the Docker Compose version information | +| [`wait`](compose_wait.md) | Block until the first service container stops | ### Options diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/compose_build.md new/compose-2.20.0/docs/reference/compose_build.md --- old/compose-2.19.1/docs/reference/compose_build.md 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/compose_build.md 2023-07-10 19:26:41.000000000 +0200 @@ -8,6 +8,7 @@ | Name | Type | Default | Description | |:-----------------|:--------------|:--------|:------------------------------------------------------------------------------------------------------------| | `--build-arg` | `stringArray` | | Set build-time variables for services. | +| `--builder` | `string` | | Set builder to use. | | `--dry-run` | | | Execute command in dry run mode | | `-m`, `--memory` | `bytes` | `0` | Set memory limit for the build container. Not supported by BuildKit. | | `--no-cache` | | | Do not use cache when building the image | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/compose_cp.md new/compose-2.20.0/docs/reference/compose_cp.md --- old/compose-2.19.1/docs/reference/compose_cp.md 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/compose_cp.md 2023-07-10 19:26:41.000000000 +0200 @@ -5,12 +5,12 @@ ### Options -| Name | Type | Default | Description | -|:----------------------|:------|:--------|:----------------------------------------------------------------------| -| `-a`, `--archive` | | | Archive mode (copy all uid/gid information) | -| `--dry-run` | | | Execute command in dry run mode | -| `-L`, `--follow-link` | | | Always follow symbol link in SRC_PATH | -| `--index` | `int` | `0` | Index of the container if there are multiple instances of a service . | +| Name | Type | Default | Description | +|:----------------------|:------|:--------|:--------------------------------------------------------| +| `-a`, `--archive` | | | Archive mode (copy all uid/gid information) | +| `--dry-run` | | | Execute command in dry run mode | +| `-L`, `--follow-link` | | | Always follow symbol link in SRC_PATH | +| `--index` | `int` | `0` | index of the container if service has multiple replicas | <!---MARKER_GEN_END--> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/compose_exec.md new/compose-2.20.0/docs/reference/compose_exec.md --- old/compose-2.19.1/docs/reference/compose_exec.md 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/compose_exec.md 2023-07-10 19:26:41.000000000 +0200 @@ -5,16 +5,16 @@ ### Options -| Name | Type | Default | Description | -|:------------------|:--------------|:--------|:----------------------------------------------------------------------------------| -| `-d`, `--detach` | | | Detached mode: Run command in the background. | -| `--dry-run` | | | Execute command in dry run mode | -| `-e`, `--env` | `stringArray` | | Set environment variables | -| `--index` | `int` | `1` | index of the container if there are multiple instances of a service [default: 1]. | -| `-T`, `--no-TTY` | | | Disable pseudo-TTY allocation. By default `docker compose exec` allocates a TTY. | -| `--privileged` | | | Give extended privileges to the process. | -| `-u`, `--user` | `string` | | Run the command as this user. | -| `-w`, `--workdir` | `string` | | Path to workdir directory for this command. | +| Name | Type | Default | Description | +|:------------------|:--------------|:--------|:---------------------------------------------------------------------------------| +| `-d`, `--detach` | | | Detached mode: Run command in the background. | +| `--dry-run` | | | Execute command in dry run mode | +| `-e`, `--env` | `stringArray` | | Set environment variables | +| `--index` | `int` | `0` | index of the container if service has multiple replicas | +| `-T`, `--no-TTY` | | | Disable pseudo-TTY allocation. By default `docker compose exec` allocates a TTY. | +| `--privileged` | | | Give extended privileges to the process. | +| `-u`, `--user` | `string` | | Run the command as this user. | +| `-w`, `--workdir` | `string` | | Path to workdir directory for this command. | <!---MARKER_GEN_END--> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/compose_port.md new/compose-2.20.0/docs/reference/compose_port.md --- old/compose-2.19.1/docs/reference/compose_port.md 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/compose_port.md 2023-07-10 19:26:41.000000000 +0200 @@ -8,7 +8,7 @@ | Name | Type | Default | Description | |:-------------|:---------|:--------|:--------------------------------------------------------| | `--dry-run` | | | Execute command in dry run mode | -| `--index` | `int` | `1` | index of the container if service has multiple replicas | +| `--index` | `int` | `0` | index of the container if service has multiple replicas | | `--protocol` | `string` | `tcp` | tcp or udp | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/compose_wait.md new/compose-2.20.0/docs/reference/compose_wait.md --- old/compose-2.19.1/docs/reference/compose_wait.md 1970-01-01 01:00:00.000000000 +0100 +++ new/compose-2.20.0/docs/reference/compose_wait.md 2023-07-10 19:26:41.000000000 +0200 @@ -0,0 +1,15 @@ +# docker compose wait + +<!---MARKER_GEN_START--> +Block until the first service container stops + +### Options + +| Name | Type | Default | Description | +|:-----------------|:-----|:--------|:---------------------------------------------| +| `--down-project` | | | Drops project when the first container stops | +| `--dry-run` | | | Execute command in dry run mode | + + +<!---MARKER_GEN_END--> + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose.yaml new/compose-2.20.0/docs/reference/docker_compose.yaml --- old/compose-2.19.1/docs/reference/docker_compose.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -171,6 +171,7 @@ - docker compose unpause - docker compose up - docker compose version + - docker compose wait clink: - docker_compose_build.yaml - docker_compose_config.yaml @@ -197,6 +198,7 @@ - docker_compose_unpause.yaml - docker_compose_up.yaml - docker_compose_version.yaml + - docker_compose_wait.yaml options: - option: ansi value_type: string @@ -345,6 +347,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_alpha.yaml new/compose-2.20.0/docs/reference/docker_compose_alpha.yaml --- old/compose-2.19.1/docs/reference/docker_compose_alpha.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_alpha.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -21,6 +21,7 @@ kubernetes: false swarm: false deprecated: false +hidden: true experimental: false experimentalcli: true kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_alpha_viz.yaml new/compose-2.20.0/docs/reference/docker_compose_alpha_viz.yaml --- old/compose-2.19.1/docs/reference/docker_compose_alpha_viz.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_alpha_viz.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -69,6 +69,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: true kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_alpha_watch.yaml new/compose-2.20.0/docs/reference/docker_compose_alpha_watch.yaml --- old/compose-2.19.1/docs/reference/docker_compose_alpha_watch.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_alpha_watch.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -29,6 +29,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: true kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_build.yaml new/compose-2.20.0/docs/reference/docker_compose_build.yaml --- old/compose-2.19.1/docs/reference/docker_compose_build.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_build.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -24,6 +24,15 @@ experimentalcli: false kubernetes: false swarm: false + - option: builder + value_type: string + description: Set builder to use. + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false - option: compress value_type: bool default_value: "true" @@ -150,6 +159,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_config.yaml new/compose-2.20.0/docs/reference/docker_compose_config.yaml --- old/compose-2.19.1/docs/reference/docker_compose_config.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_config.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -152,6 +152,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_cp.yaml new/compose-2.20.0/docs/reference/docker_compose_cp.yaml --- old/compose-2.19.1/docs/reference/docker_compose_cp.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_cp.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -10,7 +10,7 @@ - option: all value_type: bool default_value: "false" - description: Copy to all the containers of the service. + description: copy to all the containers of the service. deprecated: true hidden: true experimental: false @@ -42,8 +42,7 @@ - option: index value_type: int default_value: "0" - description: | - Index of the container if there are multiple instances of a service . + description: index of the container if service has multiple replicas deprecated: false hidden: false experimental: false @@ -62,6 +61,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_create.yaml new/compose-2.20.0/docs/reference/docker_compose_create.yaml --- old/compose-2.19.1/docs/reference/docker_compose_create.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_create.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -90,6 +90,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_down.yaml new/compose-2.20.0/docs/reference/docker_compose_down.yaml --- old/compose-2.19.1/docs/reference/docker_compose_down.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_down.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -73,6 +73,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_events.yaml new/compose-2.20.0/docs/reference/docker_compose_events.yaml --- old/compose-2.19.1/docs/reference/docker_compose_events.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_events.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -46,6 +46,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_exec.yaml new/compose-2.20.0/docs/reference/docker_compose_exec.yaml --- old/compose-2.19.1/docs/reference/docker_compose_exec.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_exec.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -33,9 +33,8 @@ swarm: false - option: index value_type: int - default_value: "1" - description: | - index of the container if there are multiple instances of a service [default: 1]. + default_value: "0" + description: index of the container if service has multiple replicas deprecated: false hidden: false experimental: false @@ -118,6 +117,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_images.yaml new/compose-2.20.0/docs/reference/docker_compose_images.yaml --- old/compose-2.19.1/docs/reference/docker_compose_images.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_images.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -38,6 +38,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_kill.yaml new/compose-2.20.0/docs/reference/docker_compose_kill.yaml --- old/compose-2.19.1/docs/reference/docker_compose_kill.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_kill.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -43,6 +43,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_logs.yaml new/compose-2.20.0/docs/reference/docker_compose_logs.yaml --- old/compose-2.19.1/docs/reference/docker_compose_logs.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_logs.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -91,6 +91,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_ls.yaml new/compose-2.20.0/docs/reference/docker_compose_ls.yaml --- old/compose-2.19.1/docs/reference/docker_compose_ls.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_ls.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -58,6 +58,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_pause.yaml new/compose-2.20.0/docs/reference/docker_compose_pause.yaml --- old/compose-2.19.1/docs/reference/docker_compose_pause.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_pause.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -17,6 +17,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_port.yaml new/compose-2.20.0/docs/reference/docker_compose_port.yaml --- old/compose-2.19.1/docs/reference/docker_compose_port.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_port.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -7,7 +7,7 @@ options: - option: index value_type: int - default_value: "1" + default_value: "0" description: index of the container if service has multiple replicas deprecated: false hidden: false @@ -37,6 +37,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_ps.yaml new/compose-2.20.0/docs/reference/docker_compose_ps.yaml --- old/compose-2.19.1/docs/reference/docker_compose_ps.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_ps.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -180,6 +180,7 @@ The `docker compose ps` command currently only supports the `--filter status=<status>` option, but additional filter options may be added in the future. deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_pull.yaml new/compose-2.20.0/docs/reference/docker_compose_pull.yaml --- old/compose-2.19.1/docs/reference/docker_compose_pull.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_pull.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -124,6 +124,7 @@ `docker compose pull` will try to pull image for services with a build section. If pull fails, it will let user know this service image MUST be built. You can skip this by setting `--ignore-buildable` flag deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_push.yaml new/compose-2.20.0/docs/reference/docker_compose_push.yaml --- old/compose-2.19.1/docs/reference/docker_compose_push.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_push.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -66,6 +66,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_restart.yaml new/compose-2.20.0/docs/reference/docker_compose_restart.yaml --- old/compose-2.19.1/docs/reference/docker_compose_restart.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_restart.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -48,6 +48,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_rm.yaml new/compose-2.20.0/docs/reference/docker_compose_rm.yaml --- old/compose-2.19.1/docs/reference/docker_compose_rm.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_rm.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -76,6 +76,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_run.yaml new/compose-2.20.0/docs/reference/docker_compose_run.yaml --- old/compose-2.19.1/docs/reference/docker_compose_run.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_run.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -286,6 +286,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_start.yaml new/compose-2.20.0/docs/reference/docker_compose_start.yaml --- old/compose-2.19.1/docs/reference/docker_compose_start.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_start.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -16,6 +16,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_stop.yaml new/compose-2.20.0/docs/reference/docker_compose_stop.yaml --- old/compose-2.19.1/docs/reference/docker_compose_stop.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_stop.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -29,6 +29,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_top.yaml new/compose-2.20.0/docs/reference/docker_compose_top.yaml --- old/compose-2.19.1/docs/reference/docker_compose_top.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_top.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -23,6 +23,7 @@ root 142353 142331 2 15:33 ? 00:00:00 ping localhost -c 5 ``` deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_unpause.yaml new/compose-2.20.0/docs/reference/docker_compose_unpause.yaml --- old/compose-2.19.1/docs/reference/docker_compose_unpause.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_unpause.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -16,6 +16,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_up.yaml new/compose-2.20.0/docs/reference/docker_compose_up.yaml --- old/compose-2.19.1/docs/reference/docker_compose_up.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_up.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -285,6 +285,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_version.yaml new/compose-2.20.0/docs/reference/docker_compose_version.yaml --- old/compose-2.19.1/docs/reference/docker_compose_version.yaml 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/docs/reference/docker_compose_version.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -37,6 +37,7 @@ kubernetes: false swarm: false deprecated: false +hidden: false experimental: false experimentalcli: false kubernetes: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/docs/reference/docker_compose_wait.yaml new/compose-2.20.0/docs/reference/docker_compose_wait.yaml --- old/compose-2.19.1/docs/reference/docker_compose_wait.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/compose-2.20.0/docs/reference/docker_compose_wait.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -0,0 +1,35 @@ +command: docker compose wait +short: Block until the first service container stops +long: Block until the first service container stops +usage: docker compose wait SERVICE [SERVICE...] [OPTIONS] +pname: docker compose +plink: docker_compose.yaml +options: + - option: down-project + value_type: bool + default_value: "false" + description: Drops project when the first container stops + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false +inherited_options: + - option: dry-run + value_type: bool + default_value: "false" + description: Execute command in dry run mode + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false +deprecated: false +hidden: false +experimental: false +experimentalcli: false +kubernetes: false +swarm: false + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/go.mod new/compose-2.20.0/go.mod --- old/compose-2.19.1/go.mod 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/go.mod 2023-07-10 19:26:41.000000000 +0200 @@ -6,15 +6,15 @@ github.com/AlecAivazis/survey/v2 v2.3.7 github.com/Microsoft/go-winio v0.6.1 github.com/buger/goterm v1.0.4 - github.com/compose-spec/compose-go v1.15.1 + github.com/compose-spec/compose-go v1.16.0 github.com/containerd/console v1.0.3 github.com/containerd/containerd v1.7.2 github.com/cucumber/godog v0.0.0-00010101000000-000000000000 // replaced; see replace for the actual version used github.com/distribution/distribution/v3 v3.0.0-20230601133803-97b1d649c493 - github.com/docker/buildx v0.11.0 + github.com/docker/buildx v0.11.1 github.com/docker/cli v24.0.2+incompatible - github.com/docker/cli-docs-tool v0.5.1 - github.com/docker/docker v24.0.2+incompatible + github.com/docker/cli-docs-tool v0.6.0 + github.com/docker/docker v24.0.4+incompatible github.com/docker/go-connections v0.4.0 github.com/docker/go-units v0.5.0 github.com/fsnotify/fsevents v0.1.1 @@ -29,7 +29,7 @@ github.com/moby/term v0.5.0 github.com/morikuni/aec v1.0.0 github.com/opencontainers/go-digest v1.0.0 - github.com/opencontainers/image-spec v1.1.0-rc3 + github.com/opencontainers/image-spec v1.1.0-rc4 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 @@ -44,9 +44,9 @@ go.opentelemetry.io/otel/trace v1.14.0 go.uber.org/goleak v1.2.1 golang.org/x/sync v0.3.0 - google.golang.org/grpc v1.56.0 + google.golang.org/grpc v1.56.2 gopkg.in/yaml.v2 v2.4.0 - gotest.tools/v3 v3.4.0 + gotest.tools/v3 v3.5.0 ) require ( @@ -150,7 +150,7 @@ github.com/subosito/gotenv v1.4.1 // indirect github.com/tonistiigi/fsutil v0.0.0-20230407161946-9e7a6df48576 // indirect github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea // indirect - github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f // indirect + github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/go.sum new/compose-2.20.0/go.sum --- old/compose-2.19.1/go.sum 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/go.sum 2023-07-10 19:26:41.000000000 +0200 @@ -131,8 +131,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= -github.com/compose-spec/compose-go v1.15.1 h1:0yaEt6/66dLN0bNWYDTj0CDx626uCdQ9ipJVIJx8O8M= -github.com/compose-spec/compose-go v1.15.1/go.mod h1:3yngGBGfls6FHGQsg4B1z6gz8ej9SOvmAJtxCwgbcnc= +github.com/compose-spec/compose-go v1.16.0 h1:HYk4uYWXgArHh6NG+WE4yGYayOXw+hjqJ+eJxpjWWjk= +github.com/compose-spec/compose-go v1.16.0/go.mod h1:3yngGBGfls6FHGQsg4B1z6gz8ej9SOvmAJtxCwgbcnc= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= @@ -167,17 +167,17 @@ github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/distribution/distribution/v3 v3.0.0-20230601133803-97b1d649c493 h1:fm5DpBD+A7o0+x9Nf+o9/4/qPGbfxLpr9qIPVuV8vQc= github.com/distribution/distribution/v3 v3.0.0-20230601133803-97b1d649c493/go.mod h1:+fqBJ4vPYo4Uu1ZE4d+bUtTLRXfdSL3NvCZIZ9GHv58= -github.com/docker/buildx v0.11.0 h1:DNCOIYT/7J0sPBlU/ozEhFd4MtbnbFByn45yeTMHXVU= -github.com/docker/buildx v0.11.0/go.mod h1:Yq7ZNjrwXKzW0uSFMk46dl5Gl903k5+bp6U4apsM5rs= +github.com/docker/buildx v0.11.1 h1:xfmrAkOJrN+NLRcwhZn1iBgJVAK1dEBEv8lWu1Wxg14= +github.com/docker/buildx v0.11.1/go.mod h1:qAxs3bsJEfVo7DOc9riES/f9Z187CeGM5nLPmadk8AA= github.com/docker/cli v24.0.2+incompatible h1:QdqR7znue1mtkXIJ+ruQMGQhpw2JzMJLRXp6zpzF6tM= github.com/docker/cli v24.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli-docs-tool v0.5.1 h1:jIk/cCZurZERhALPVKhqlNxTQGxn2kcI+56gE57PQXg= -github.com/docker/cli-docs-tool v0.5.1/go.mod h1:zMjqTFCU361PRh8apiXzeAZ1Q/xupbIwTusYpzCXS/o= +github.com/docker/cli-docs-tool v0.6.0 h1:Z9x10SaZgFaB6jHgz3OWooynhSa40CsWkpe5hEnG/qA= +github.com/docker/cli-docs-tool v0.6.0/go.mod h1:zMjqTFCU361PRh8apiXzeAZ1Q/xupbIwTusYpzCXS/o= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.2+incompatible h1:eATx+oLz9WdNVkQrr0qjQ8HvRJ4bOOxfzEo8R+dA3cg= -github.com/docker/docker v24.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= +github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= @@ -511,8 +511,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.1.0-rc3 h1:fzg1mXZFj8YdPeNkRXMg+zb88BFV0Ys52cJydRwBkb8= -github.com/opencontainers/image-spec v1.1.0-rc3/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/runc v1.1.7 h1:y2EZDS8sNng4Ksf0GUYNhKbTShZJPJg1FiXJNH/uoCk= github.com/opencontainers/runc v1.1.7/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= github.com/opencontainers/runtime-spec v1.1.0-rc.2 h1:ucBtEms2tamYYW/SvGpvq9yUN0NEVL6oyLEwDcTSrk8= @@ -630,8 +630,8 @@ github.com/tonistiigi/fsutil v0.0.0-20230407161946-9e7a6df48576/go.mod h1:q1CxMSzcAbjUkVGHoZeQUcCaALnaE4XdWk+zJcgMYFw= github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= -github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f h1:DLpt6B5oaaS8jyXHa9VA4rrZloBVPVXeCtrOsrFauxc= -github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 h1:Y/M5lygoNPKwVNLMPXgVfsRT40CSFKXCxuU8LoHySjs= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= github.com/weppos/publicsuffix-go v0.15.1-0.20220329081811-9a40b608a236 h1:vMJBP3PQViZsF6cOINtvyMC8ptpLsyJ4EwyFnzuWNxc= github.com/weppos/publicsuffix-go v0.15.1-0.20220329081811-9a40b608a236/go.mod h1:HYux0V0Zi04bHNwOHy4cXJVz/TQjYonnF6aoYhj+3QE= @@ -1039,8 +1039,8 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.56.0 h1:+y7Bs8rtMd07LeXmL3NxcTLn7mUkbKZqEpPhMNkwJEE= -google.golang.org/grpc v1.56.0/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1088,8 +1088,8 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/api/api.go new/compose-2.20.0/pkg/api/api.go --- old/compose-2.19.1/pkg/api/api.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/api/api.go 2023-07-10 19:26:41.000000000 +0200 @@ -84,6 +84,15 @@ Watch(ctx context.Context, project *types.Project, services []string, options WatchOptions) error // Viz generates a graphviz graph of the project services Viz(ctx context.Context, project *types.Project, options VizOptions) (string, error) + // Wait blocks until at least one of the services' container exits + Wait(ctx context.Context, projectName string, options WaitOptions) (int64, error) +} + +type WaitOptions struct { + // Services passed in the command line to be waited + Services []string + // Executes a down when a container exits + DownProjectOnContainerExit bool } type VizOptions struct { @@ -121,6 +130,8 @@ SSHs []types.SSHKey // Memory limit for the build container Memory int64 + // Builder name passed in the command line + Builder string } // Apply mutates project according to build options diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/api/dryrunclient.go new/compose-2.20.0/pkg/api/dryrunclient.go --- old/compose-2.19.1/pkg/api/dryrunclient.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/api/dryrunclient.go 2023-07-10 19:26:41.000000000 +0200 @@ -70,7 +70,7 @@ } // NewDryRunClient produces a DryRunClient -func NewDryRunClient(apiClient client.APIClient, cli *command.DockerCli) (*DryRunClient, error) { +func NewDryRunClient(apiClient client.APIClient, cli command.Cli) (*DryRunClient, error) { b, err := builder.New(cli, builder.WithSkippedValidation()) if err != nil { return nil, err diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/api/proxy.go new/compose-2.20.0/pkg/api/proxy.go --- old/compose-2.19.1/pkg/api/proxy.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/api/proxy.go 2023-07-10 19:26:41.000000000 +0200 @@ -54,6 +54,7 @@ MaxConcurrencyFn func(parallel int) DryRunModeFn func(ctx context.Context, dryRun bool) (context.Context, error) VizFn func(ctx context.Context, project *types.Project, options VizOptions) (string, error) + WaitFn func(ctx context.Context, projectName string, options WaitOptions) (int64, error) interceptors []Interceptor } @@ -95,6 +96,7 @@ s.MaxConcurrencyFn = service.MaxConcurrency s.DryRunModeFn = service.DryRunMode s.VizFn = service.Viz + s.WaitFn = service.Wait return s } @@ -215,7 +217,7 @@ return s.ListFn(ctx, options) } -// Convert implements Service interface +// Config implements Service interface func (s *ServiceProxy) Config(ctx context.Context, project *types.Project, options ConfigOptions) ([]byte, error) { if s.ConfigFn == nil { return nil, ErrNotImplemented @@ -325,7 +327,7 @@ return s.WatchFn(ctx, project, services, options) } -// Viz implements Viz interface +// Viz implements Service interface func (s *ServiceProxy) Viz(ctx context.Context, project *types.Project, options VizOptions) (string, error) { if s.VizFn == nil { return "", ErrNotImplemented @@ -333,6 +335,14 @@ return s.VizFn(ctx, project, options) } +// Wait implements Service interface +func (s *ServiceProxy) Wait(ctx context.Context, projectName string, options WaitOptions) (int64, error) { + if s.WaitFn == nil { + return 0, ErrNotImplemented + } + return s.WaitFn(ctx, projectName, options) +} + func (s *ServiceProxy) MaxConcurrency(i int) { s.MaxConcurrencyFn(i) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/compose/build.go new/compose-2.20.0/pkg/compose/build.go --- old/compose-2.19.1/pkg/compose/build.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/compose/build.go 2023-07-10 19:26:41.000000000 +0200 @@ -116,7 +116,7 @@ } buildOptions.BuildArgs = mergeArgs(buildOptions.BuildArgs, flatten(args)) - digest, err := s.doBuildBuildkit(ctx, service.Name, buildOptions, w) + digest, err := s.doBuildBuildkit(ctx, service.Name, buildOptions, w, options.Builder) if err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/compose/build_buildkit.go new/compose-2.20.0/pkg/compose/build_buildkit.go --- old/compose-2.19.1/pkg/compose/build_buildkit.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/compose/build_buildkit.go 2023-07-10 19:26:41.000000000 +0200 @@ -34,8 +34,8 @@ "github.com/moby/buildkit/client" ) -func (s *composeService) doBuildBuildkit(ctx context.Context, service string, opts build.Options, p *buildx.Printer) (string, error) { - b, err := builder.New(s.dockerCli) +func (s *composeService) doBuildBuildkit(ctx context.Context, service string, opts build.Options, p *buildx.Printer, builderName string) (string, error) { + b, err := builder.New(s.dockerCli, builder.WithName(builderName)) if err != nil { return "", err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/compose/compose.go new/compose-2.20.0/pkg/compose/compose.go --- old/compose-2.19.1/pkg/compose/compose.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/compose/compose.go 2023-07-10 19:26:41.000000000 +0200 @@ -88,8 +88,11 @@ if err != nil { return ctx, err } - err = cli.Initialize(flags.NewClientOptions(), command.WithInitializeClient(func(cli *command.DockerCli) (client.APIClient, error) { - return api.NewDryRunClient(s.apiClient(), cli) + + options := flags.NewClientOptions() + options.Context = s.dockerCli.CurrentContext() + err = cli.Initialize(options, command.WithInitializeClient(func(cli *command.DockerCli) (client.APIClient, error) { + return api.NewDryRunClient(s.apiClient(), s.dockerCli) })) if err != nil { return ctx, err diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/compose/containers.go new/compose-2.20.0/pkg/compose/containers.go --- old/compose-2.19.1/pkg/compose/containers.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/compose/containers.go 2023-07-10 19:26:41.000000000 +0200 @@ -20,6 +20,7 @@ "context" "fmt" "sort" + "strconv" "github.com/docker/compose/v2/pkg/api" "github.com/docker/compose/v2/pkg/utils" @@ -72,7 +73,9 @@ func (s *composeService) getSpecifiedContainer(ctx context.Context, projectName string, oneOff oneOff, stopped bool, serviceName string, containerIndex int) (moby.Container, error) { defaultFilters := getDefaultFilters(projectName, oneOff, serviceName) - defaultFilters = append(defaultFilters, containerNumberFilter(containerIndex)) + if containerIndex > 0 { + defaultFilters = append(defaultFilters, containerNumberFilter(containerIndex)) + } containers, err := s.apiClient().ContainerList(ctx, moby.ContainerListOptions{ Filters: filters.NewArgs( defaultFilters..., @@ -83,8 +86,16 @@ return moby.Container{}, err } if len(containers) < 1 { - return moby.Container{}, fmt.Errorf("service %q is not running container #%d", serviceName, containerIndex) - } + if containerIndex > 0 { + return moby.Container{}, fmt.Errorf("service %q is not running container #%d", serviceName, containerIndex) + } + return moby.Container{}, fmt.Errorf("service %q is not running", serviceName) + } + sort.Slice(containers, func(i, j int) bool { + x, _ := strconv.Atoi(containers[i].Labels[api.ContainerNumberLabel]) + y, _ := strconv.Atoi(containers[j].Labels[api.ContainerNumberLabel]) + return x < y + }) container := containers[0] return container, nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/compose/convergence.go new/compose-2.20.0/pkg/compose/convergence.go --- old/compose-2.19.1/pkg/compose/convergence.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/compose/convergence.go 2023-07-10 19:26:41.000000000 +0200 @@ -549,13 +549,15 @@ // call via container.NetworkMode & network.NetworkingConfig // any remaining networks are connected one-by-one here after creation (but before start) serviceNetworks := service.NetworksByPriority() - if len(serviceNetworks) > 1 { - for _, networkKey := range serviceNetworks[1:] { - mobyNetworkName := project.Networks[networkKey].Name - epSettings := createEndpointSettings(project, service, number, networkKey, cfgs.Links, opts.UseNetworkAliases) - if err := s.apiClient().NetworkConnect(ctx, mobyNetworkName, created.ID, epSettings); err != nil { - return created, err - } + for _, networkKey := range serviceNetworks { + mobyNetworkName := project.Networks[networkKey].Name + if string(cfgs.Host.NetworkMode) == mobyNetworkName { + // primary network already configured as part of ContainerCreate + continue + } + epSettings := createEndpointSettings(project, service, number, networkKey, cfgs.Links, opts.UseNetworkAliases) + if err := s.apiClient().NetworkConnect(ctx, mobyNetworkName, created.ID, epSettings); err != nil { + return created, err } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/compose/port.go new/compose-2.20.0/pkg/compose/port.go --- old/compose-2.19.1/pkg/compose/port.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/compose/port.go 2023-07-10 19:26:41.000000000 +0200 @@ -24,25 +24,14 @@ "github.com/docker/compose/v2/pkg/api" moby "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" ) func (s *composeService) Port(ctx context.Context, projectName string, service string, port uint16, options api.PortOptions) (string, int, error) { projectName = strings.ToLower(projectName) - list, err := s.apiClient().ContainerList(ctx, moby.ContainerListOptions{ - Filters: filters.NewArgs( - projectFilter(projectName), - serviceFilter(service), - containerNumberFilter(options.Index), - ), - }) + container, err := s.getSpecifiedContainer(ctx, projectName, oneOffInclude, false, service, options.Index) if err != nil { return "", 0, err } - if len(list) == 0 { - return "", 0, fmt.Errorf("no container found for %s%s%d", service, api.Separator, options.Index) - } - container := list[0] for _, p := range container.Ports { if p.PrivatePort == port && p.Type == options.Protocol { return p.IP, int(p.PublicPort), nil diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/compose/secrets.go new/compose-2.20.0/pkg/compose/secrets.go --- old/compose-2.19.1/pkg/compose/secrets.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/compose/secrets.go 2023-07-10 19:26:41.000000000 +0200 @@ -58,7 +58,7 @@ value := []byte(env) b := bytes.Buffer{} tarWriter := tar.NewWriter(&b) - mode := uint32(0o400) + mode := uint32(0o444) if config.Mode != nil { mode = *config.Mode } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/compose/wait.go new/compose-2.20.0/pkg/compose/wait.go --- old/compose-2.19.1/pkg/compose/wait.go 1970-01-01 01:00:00.000000000 +0100 +++ new/compose-2.20.0/pkg/compose/wait.go 2023-07-10 19:26:41.000000000 +0200 @@ -0,0 +1,67 @@ +/* + Copyright 2020 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package compose + +import ( + "context" + "fmt" + + "github.com/docker/compose/v2/pkg/api" + "golang.org/x/sync/errgroup" +) + +func (s *composeService) Wait(ctx context.Context, projectName string, options api.WaitOptions) (int64, error) { + containers, err := s.getContainers(ctx, projectName, oneOffInclude, false, options.Services...) + if err != nil { + return 0, err + } + if len(containers) == 0 { + return 0, fmt.Errorf("no containers for project %q", projectName) + } + + eg, waitCtx := errgroup.WithContext(ctx) + var statusCode int64 + for _, c := range containers { + c := c + eg.Go(func() error { + var err error + resultC, errC := s.dockerCli.Client().ContainerWait(waitCtx, c.ID, "") + + select { + case result := <-resultC: + fmt.Fprintf(s.dockerCli.Out(), "container %q exited with status code %d\n", c.ID, result.StatusCode) + statusCode = result.StatusCode + case err = <-errC: + } + + return err + }) + } + + err = eg.Wait() + if err != nil { + return 42, err // Ignore abort flag in case of error in wait + } + + if options.DownProjectOnContainerExit { + return statusCode, s.Down(ctx, projectName, api.DownOptions{ + RemoveOrphans: true, + }) + } + + return statusCode, err +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/e2e/build_test.go new/compose-2.20.0/pkg/e2e/build_test.go --- old/compose-2.19.1/pkg/e2e/build_test.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/e2e/build_test.go 2023-07-10 19:26:41.000000000 +0200 @@ -17,6 +17,7 @@ package e2e import ( + "fmt" "net/http" "runtime" "strings" @@ -422,4 +423,31 @@ }) }) +} + +func TestBuildBuilder(t *testing.T) { + c := NewParallelCLI(t) + builderName := "build-with-builder" + // declare builder + result := c.RunDockerCmd(t, "buildx", "create", "--name", builderName, "--use", "--bootstrap") + assert.NilError(t, result.Error) + + t.Cleanup(func() { + c.RunDockerComposeCmd(t, "--project-directory", "fixtures/build-test/", "down") + _ = c.RunDockerCmd(t, "buildx", "rm", "-f", builderName) + }) + + t.Run("use specific builder to run build command", func(t *testing.T) { + res := c.RunDockerComposeCmdNoCheck(t, "--project-directory", "fixtures/build-test", "build", "--builder", builderName) + assert.NilError(t, res.Error, res.Stderr()) + }) + + t.Run("error when using specific builder to run build command", func(t *testing.T) { + res := c.RunDockerComposeCmdNoCheck(t, "--project-directory", "fixtures/build-test", "build", "--builder", "unknown-builder") + res.Assert(t, icmd.Expected{ + ExitCode: 1, + Err: fmt.Sprintf(`no builder %q found`, "unknown-builder"), + }) + }) + } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/e2e/compose_run_test.go new/compose-2.20.0/pkg/e2e/compose_run_test.go --- old/compose-2.19.1/pkg/e2e/compose_run_test.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/e2e/compose_run_test.go 2023-07-10 19:26:41.000000000 +0200 @@ -136,4 +136,12 @@ c.RunDockerComposeCmd(t, "-f", "./fixtures/run-test/deps.yaml", "down", "--remove-orphans") }) + + t.Run("run without dependencies", func(t *testing.T) { + res := c.RunDockerComposeCmd(t, "-f", "./fixtures/run-test/deps.yaml", "run", "--no-deps", "service_a") + assert.Assert(t, !strings.Contains(res.Combined(), "shared_dep"), res.Combined()) + assert.Assert(t, !strings.Contains(res.Combined(), "service_b"), res.Combined()) + + c.RunDockerComposeCmd(t, "-f", "./fixtures/run-test/deps.yaml", "down", "--remove-orphans") + }) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/e2e/fixtures/wait/compose.yaml new/compose-2.20.0/pkg/e2e/fixtures/wait/compose.yaml --- old/compose-2.19.1/pkg/e2e/fixtures/wait/compose.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/compose-2.20.0/pkg/e2e/fixtures/wait/compose.yaml 2023-07-10 19:26:41.000000000 +0200 @@ -0,0 +1,11 @@ +services: + faster: + image: alpine + command: sleep 2 + slower: + image: alpine + command: sleep 5 + infinity: + image: alpine + command: sleep infinity + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/e2e/networks_test.go new/compose-2.20.0/pkg/e2e/networks_test.go --- old/compose-2.19.1/pkg/e2e/networks_test.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/e2e/networks_test.go 2023-07-10 19:26:41.000000000 +0200 @@ -29,47 +29,34 @@ func TestNetworks(t *testing.T) { // fixture is shared with TestNetworkModes and is not safe to run concurrently - c := NewCLI(t) - const projectName = "network-e2e" + c := NewCLI(t, WithEnv( + "COMPOSE_PROJECT_NAME="+projectName, + "COMPOSE_FILE=./fixtures/network-test/compose.yaml", + )) + + c.RunDockerComposeCmd(t, "down", "-t0", "-v") + + c.RunDockerComposeCmd(t, "up", "-d") + + res := c.RunDockerComposeCmd(t, "ps") + res.Assert(t, icmd.Expected{Out: `web`}) + + endpoint := "http://localhost:80" + output := HTTPGetWithRetry(t, endpoint+"/words/noun", http.StatusOK, 2*time.Second, 20*time.Second) + assert.Assert(t, strings.Contains(output, `"word":`)) + + res = c.RunDockerCmd(t, "network", "ls") + res.Assert(t, icmd.Expected{Out: projectName + "_dbnet"}) + res.Assert(t, icmd.Expected{Out: "microservices"}) + + res = c.RunDockerComposeCmd(t, "port", "words", "8080") + res.Assert(t, icmd.Expected{Out: `0.0.0.0:8080`}) - t.Run("ensure we do not reuse previous networks", func(t *testing.T) { - c.RunDockerOrExitError(t, "network", "rm", projectName+"-dbnet") - c.RunDockerOrExitError(t, "network", "rm", "microservices") - }) - - t.Run("up", func(t *testing.T) { - c.RunDockerComposeCmd(t, "-f", "./fixtures/network-test/compose.yaml", "--project-name", projectName, "up", - "-d") - }) - - t.Run("check running project", func(t *testing.T) { - res := c.RunDockerComposeCmd(t, "-p", projectName, "ps") - res.Assert(t, icmd.Expected{Out: `web`}) - - endpoint := "http://localhost:80" - output := HTTPGetWithRetry(t, endpoint+"/words/noun", http.StatusOK, 2*time.Second, 20*time.Second) - assert.Assert(t, strings.Contains(output, `"word":`)) - - res = c.RunDockerCmd(t, "network", "ls") - res.Assert(t, icmd.Expected{Out: projectName + "_dbnet"}) - res.Assert(t, icmd.Expected{Out: "microservices"}) - }) - - t.Run("port", func(t *testing.T) { - res := c.RunDockerComposeCmd(t, "--project-name", projectName, "port", "words", "8080") - res.Assert(t, icmd.Expected{Out: `0.0.0.0:8080`}) - }) - - t.Run("down", func(t *testing.T) { - _ = c.RunDockerComposeCmd(t, "--project-name", projectName, "down") - }) - - t.Run("check networks after down", func(t *testing.T) { - res := c.RunDockerCmd(t, "network", "ls") - assert.Assert(t, !strings.Contains(res.Combined(), projectName), res.Combined()) - assert.Assert(t, !strings.Contains(res.Combined(), "microservices"), res.Combined()) - }) + c.RunDockerComposeCmd(t, "down", "-t0", "-v") + res = c.RunDockerCmd(t, "network", "ls") + assert.Assert(t, !strings.Contains(res.Combined(), projectName), res.Combined()) + assert.Assert(t, !strings.Contains(res.Combined(), "microservices"), res.Combined()) } func TestNetworkAliases(t *testing.T) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/e2e/wait_test.go new/compose-2.20.0/pkg/e2e/wait_test.go --- old/compose-2.19.1/pkg/e2e/wait_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/compose-2.20.0/pkg/e2e/wait_test.go 2023-07-10 19:26:41.000000000 +0200 @@ -0,0 +1,107 @@ +/* + Copyright 2020 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package e2e + +import ( + "strings" + "testing" + "time" + + "gotest.tools/v3/icmd" + + "gotest.tools/v3/assert" +) + +func TestWaitOnFaster(t *testing.T) { + const projectName = "e2e-wait-faster" + c := NewParallelCLI(t) + + cleanup := func() { + c.RunDockerComposeCmd(t, "--project-name", projectName, "down", "--timeout=0", "--remove-orphans") + } + t.Cleanup(cleanup) + cleanup() + + c.RunDockerComposeCmd(t, "-f", "./fixtures/wait/compose.yaml", "--project-name", projectName, "up", "-d") + c.RunDockerComposeCmd(t, "--project-name", projectName, "wait", "faster") +} + +func TestWaitOnSlower(t *testing.T) { + const projectName = "e2e-wait-slower" + c := NewParallelCLI(t) + + cleanup := func() { + c.RunDockerComposeCmd(t, "--project-name", projectName, "down", "--timeout=0", "--remove-orphans") + } + t.Cleanup(cleanup) + cleanup() + + c.RunDockerComposeCmd(t, "-f", "./fixtures/wait/compose.yaml", "--project-name", projectName, "up", "-d") + c.RunDockerComposeCmd(t, "--project-name", projectName, "wait", "slower") +} + +func TestWaitOnInfinity(t *testing.T) { + const projectName = "e2e-wait-infinity" + c := NewParallelCLI(t) + + cleanup := func() { + c.RunDockerComposeCmd(t, "--project-name", projectName, "down", "--timeout=0", "--remove-orphans") + } + t.Cleanup(cleanup) + cleanup() + + c.RunDockerComposeCmd(t, "-f", "./fixtures/wait/compose.yaml", "--project-name", projectName, "up", "-d") + + cmd := c.NewDockerComposeCmd(t, "--project-name", projectName, "wait", "infinity") + r := icmd.StartCmd(cmd) + assert.NilError(t, r.Error) + t.Cleanup(func() { + if r.Cmd.Process != nil { + _ = r.Cmd.Process.Kill() + } + }) + + finished := make(chan struct{}) + ticker := time.NewTicker(7 * time.Second) + go func() { + _ = r.Cmd.Wait() + finished <- struct{}{} + }() + + select { + case <-finished: + t.Fatal("wait infinity should not finish") + case <-ticker.C: + } +} + +func TestWaitAndDrop(t *testing.T) { + const projectName = "e2e-wait-and-drop" + c := NewParallelCLI(t) + + cleanup := func() { + c.RunDockerComposeCmd(t, "--project-name", projectName, "down", "--timeout=0", "--remove-orphans") + } + t.Cleanup(cleanup) + cleanup() + + c.RunDockerComposeCmd(t, "-f", "./fixtures/wait/compose.yaml", "--project-name", projectName, "up", "-d") + c.RunDockerComposeCmd(t, "--project-name", projectName, "wait", "--down-project", "faster") + + res := c.RunDockerCmd(t, "ps", "--all") + assert.Assert(t, !strings.Contains(res.Combined(), projectName), res.Combined()) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/mocks/mock_docker_compose_api.go new/compose-2.20.0/pkg/mocks/mock_docker_compose_api.go --- old/compose-2.19.1/pkg/mocks/mock_docker_compose_api.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/mocks/mock_docker_compose_api.go 2023-07-10 19:26:41.000000000 +0200 @@ -423,6 +423,21 @@ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Viz", reflect.TypeOf((*MockService)(nil).Viz), ctx, project, options) } +// Wait mocks base method. +func (m *MockService) Wait(ctx context.Context, projectName string, options api.WaitOptions) (int64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Wait", ctx, projectName, options) + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Wait indicates an expected call of Wait. +func (mr *MockServiceMockRecorder) Wait(ctx, projectName, options interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Wait", reflect.TypeOf((*MockService)(nil).Wait), ctx, projectName, options) +} + // Watch mocks base method. func (m *MockService) Watch(ctx context.Context, project *types.Project, services []string, options api.WatchOptions) error { m.ctrl.T.Helper() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/utils/set.go new/compose-2.20.0/pkg/utils/set.go --- old/compose-2.19.1/pkg/utils/set.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/utils/set.go 2023-07-10 19:26:41.000000000 +0200 @@ -47,3 +47,9 @@ } return elements } + +func (s Set[T]) RemoveAll(elements ...T) { + for _, e := range elements { + s.Remove(e) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compose-2.19.1/pkg/utils/slices.go new/compose-2.20.0/pkg/utils/slices.go --- old/compose-2.19.1/pkg/utils/slices.go 2023-06-29 22:50:10.000000000 +0200 +++ new/compose-2.20.0/pkg/utils/slices.go 2023-07-10 19:26:41.000000000 +0200 @@ -29,7 +29,7 @@ return false } -// RemoveAll removes all elements from origin slice +// Remove removes all elements from origin slice func Remove[T any](origin []T, elements ...T) []T { var filtered []T for _, v := range origin { ++++++ compose.obsinfo ++++++ --- /var/tmp/diff_new_pack.9pR6tT/_old 2023-07-17 19:23:45.177899585 +0200 +++ /var/tmp/diff_new_pack.9pR6tT/_new 2023-07-17 19:23:45.181899607 +0200 @@ -1,5 +1,5 @@ name: compose -version: 2.19.1 -mtime: 1688071810 -commit: c496c230710d299834cf2586d0f75066dc60d06c +version: 2.20.0 +mtime: 1689010001 +commit: e28b223650807aa24a5c7637b6ad17189fb9276c ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/docker-compose/vendor.tar.gz /work/SRC/openSUSE:Factory/.docker-compose.new.3193/vendor.tar.gz differ: char 5, line 1