Repository: docker/compose-cli
Pull request #1628 (2021-05-04 00:33:57)

Support bypass envvars
**What I did**
Support bypass envvars

**Related issue**
Resolves https://github.com/docker/compose-cli/issues/1560



Patch:
diff --git a/aci/compose.go b/aci/compose.go
index 06626f90..22300c29 100644
--- a/aci/compose.go
+++ b/aci/compose.go
@@ -80,10 +80,6 @@ func (cs *aciComposeService) UnPause(ctx context.Context, project string, option
 	return errdefs.ErrNotImplemented
 }
 
-func (cs *aciComposeService) Copy(ctx context.Context, project *types.Project, options compose.CopyOptions) error {
-	return errdefs.ErrNotImplemented
-}
-
 func (cs *aciComposeService) Up(ctx context.Context, project *types.Project, options compose.UpOptions) error {
 	logrus.Debugf("Up on project with name %q", project.Name)
 
diff --git a/aci/context.go b/aci/context.go
index 2ce1b6c1..7f9cdb4c 100644
--- a/aci/context.go
+++ b/aci/context.go
@@ -99,10 +99,7 @@ func (helper contextCreateACIHelper) createContextData(ctx context.Context, opts
 		}
 	}
 
-	location := opts.Location
-	if opts.Location == "" {
-		location = *group.Location
-	}
+	location := *group.Location
 
 	description := fmt.Sprintf("%s@%s", *group.Name, location)
 	if opts.Description != "" {
diff --git a/api/client/compose.go b/api/client/compose.go
index 38179057..77a7e34f 100644
--- a/api/client/compose.go
+++ b/api/client/compose.go
@@ -96,10 +96,6 @@ func (c *composeService) Exec(ctx context.Context, project *types.Project, opts
 	return 0, errdefs.ErrNotImplemented
 }
 
-func (c *composeService) Copy(ctx context.Context, project *types.Project, opts compose.CopyOptions) error {
-	return errdefs.ErrNotImplemented
-}
-
 func (c *composeService) Pause(ctx context.Context, project string, options compose.PauseOptions) error {
 	return errdefs.ErrNotImplemented
 }
diff --git a/api/compose/api.go b/api/compose/api.go
index c4c3d8c5..5b210adf 100644
--- a/api/compose/api.go
+++ b/api/compose/api.go
@@ -62,8 +62,6 @@ type Service interface {
 	Remove(ctx context.Context, project *types.Project, options RemoveOptions) ([]string, error)
 	// Exec executes a command in a running service container
 	Exec(ctx context.Context, project *types.Project, opts RunOptions) (int, error)
-	// Copy copies a file/folder between a service container and the local filesystem
-	Copy(ctx context.Context, project *types.Project, opts CopyOptions) error
 	// Pause executes the equivalent to a `compose pause`
 	Pause(ctx context.Context, project string, options PauseOptions) error
 	// UnPause executes the equivalent to a `compose unpause`
@@ -247,22 +245,6 @@ func (e Event) String() string {
 
 }
 
-// EnvironmentMap return RunOptions.Environment as a MappingWithEquals
-func (opts *RunOptions) EnvironmentMap() types.MappingWithEquals {
-	environment := types.MappingWithEquals{}
-	for _, s := range opts.Environment {
-		parts := strings.SplitN(s, "=", 2)
-		key := parts[0]
-		switch {
-		case len(parts) == 1:
-			environment[key] = nil
-		default:
-			environment[key] = &parts[1]
-		}
-	}
-	return environment
-}
-
 // ListOptions group options of the ls API
 type ListOptions struct {
 	All bool
@@ -270,18 +252,7 @@ type ListOptions struct {
 
 // PsOptions group options of the Ps API
 type PsOptions struct {
-	All      bool
-	Services []string
-}
-
-// CopyOptions group options of the cp API
-type CopyOptions struct {
-	Source      string
-	Destination string
-	All         bool
-	Index       int
-	FollowLink  bool
-	CopyUIDGID  bool
+	All bool
 }
 
 // PortPublisher hold status about published port
diff --git a/api/compose/delegator.go b/api/compose/delegator.go
index 08905bd5..bab938db 100644
--- a/api/compose/delegator.go
+++ b/api/compose/delegator.go
@@ -112,11 +112,6 @@ func (s *ServiceDelegator) Exec(ctx context.Context, project *types.Project, opt
 	return s.Delegate.Exec(ctx, project, options)
 }
 
-//Copy implements Service interface
-func (s *ServiceDelegator) Copy(ctx context.Context, project *types.Project, options CopyOptions) error {
-	return s.Delegate.Copy(ctx, project, options)
-}
-
 //Pause implements Service interface
 func (s *ServiceDelegator) Pause(ctx context.Context, project string, options PauseOptions) error {
 	return s.Delegate.Pause(ctx, project, options)
diff --git a/api/compose/noimpl.go b/api/compose/noimpl.go
index 356b9a99..ec7963ef 100644
--- a/api/compose/noimpl.go
+++ b/api/compose/noimpl.go
@@ -112,11 +112,6 @@ func (s NoImpl) Exec(ctx context.Context, project *types.Project, opts RunOption
 	return 0, errdefs.ErrNotImplemented
 }
 
-//Copy implements Service interface
-func (s NoImpl) Copy(ctx context.Context, project *types.Project, opts CopyOptions) error {
-	return errdefs.ErrNotImplemented
-}
-
 //Pause implements Service interface
 func (s NoImpl) Pause(ctx context.Context, project string, options PauseOptions) error {
 	return errdefs.ErrNotImplemented
diff --git a/builder.Makefile b/builder.Makefile
index 65d50240..79c7b0f0 100644
--- a/builder.Makefile
+++ b/builder.Makefile
@@ -28,7 +28,7 @@ STATIC_FLAGS=CGO_ENABLED=0
 
 GIT_TAG?=$(shell git describe --tags --match "v[0-9]*")
 
-LDFLAGS="-s -w -X $(PKG_NAME)/internal.Version=${GIT_TAG} -X $(PKG_NAME)/internal.ComposePluginVersion=2.0.0-beta.2"
+LDFLAGS="-s -w -X $(PKG_NAME)/internal.Version=${GIT_TAG} -X $(PKG_NAME)/internal.ComposePluginVersion=2.0.0-beta.1"
 GO_BUILD=$(STATIC_FLAGS) go build -trimpath -ldflags=$(LDFLAGS)
 
 BINARY?=bin/docker
diff --git a/cli/cmd/compose/compose.go b/cli/cmd/compose/compose.go
index 43fc7afd..0c205f42 100644
--- a/cli/cmd/compose/compose.go
+++ b/cli/cmd/compose/compose.go
@@ -120,13 +120,11 @@ func (o *projectOptions) toProject(services []string, po ...cli.ProjectOptionsFn
 		return nil, metrics.WrapComposeError(err)
 	}
 
-	if len(services) > 0 {
-		s, err := project.GetServices(services...)
-		if err != nil {
-			return nil, err
-		}
-		o.Profiles = append(o.Profiles, s.GetProfiles()...)
+	s, err := project.GetServices(services...)
+	if err != nil {
+		return nil, err
 	}
+	o.Profiles = append(o.Profiles, s.GetProfiles()...)
 
 	if profiles, ok := options.Environment["COMPOSE_PROFILES"]; ok {
 		o.Profiles = append(o.Profiles, strings.Split(profiles, ",")...)
@@ -230,7 +228,6 @@ func RootCommand(contextType string, backend compose.Service) *cobra.Command {
 			pushCommand(&opts, backend),
 			pullCommand(&opts, backend),
 			createCommand(&opts, backend),
-			copyCommand(&opts, backend),
 		)
 	}
 	command.Flags().SetInterspersed(false)
diff --git a/cli/cmd/compose/cp.go b/cli/cmd/compose/cp.go
deleted file mode 100644
index 7ed29265..00000000
--- a/cli/cmd/compose/cp.go
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
-   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"
-	"errors"
-
-	"github.com/docker/cli/cli"
-	"github.com/spf13/cobra"
-
-	"github.com/docker/compose-cli/api/compose"
-)
-
-type copyOptions struct {
-	*projectOptions
-
-	source      string
-	destination string
-	index       int
-	all         bool
-	followLink  bool
-	copyUIDGID  bool
-}
-
-func copyCommand(p *projectOptions, backend compose.Service) *cobra.Command {
-	opts := copyOptions{
-		projectOptions: p,
-	}
-	copyCmd := &cobra.Command{
-		Use: `cp [OPTIONS] SERVICE:SRC_PATH DEST_PATH|-
-	docker compose cp [OPTIONS] SRC_PATH|- SERVICE:DEST_PATH`,
-		Short: "Copy files/folders between a service container and the local filesystem",
-		Args:  cli.ExactArgs(2),
-		RunE: Adapt(func(ctx context.Context, args []string) error {
-			if args[0] == "" {
-				return errors.New("source can not be empty")
-			}
-			if args[1] == "" {
-				return errors.New("destination can not be empty")
-			}
-
-			opts.source = args[0]
-			opts.destination = args[1]
-			return runCopy(ctx, backend, opts)
-		}),
-	}
-
-	flags := copyCmd.Flags()
-	flags.IntVar(&opts.index, "index", 1, "Index of the container if there are multiple instances of a service [default: 1].")
-	flags.BoolVar(&opts.all, "all", false, "Copy to all the containers of the service.")
-	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)")
-
-	return copyCmd
-}
-
-func runCopy(ctx context.Context, backend compose.Service, opts copyOptions) error {
-	projects, err := opts.toProject(nil)
-	if err != nil {
-		return err
-	}
-
-	return backend.Copy(ctx, projects, compose.CopyOptions{
-		Source:      opts.source,
-		Destination: opts.destination,
-		All:         opts.all,
-		Index:       opts.index,
-		FollowLink:  opts.followLink,
-		CopyUIDGID:  opts.copyUIDGID,
-	})
-}
diff --git a/cli/cmd/compose/ps.go b/cli/cmd/compose/ps.go
index c67ea580..20e99c32 100644
--- a/cli/cmd/compose/ps.go
+++ b/cli/cmd/compose/ps.go
@@ -47,7 +47,7 @@ func psCommand(p *projectOptions, backend compose.Service) *cobra.Command {
 		Use:   "ps",
 		Short: "List containers",
 		RunE: Adapt(func(ctx context.Context, args []string) error {
-			return runPs(ctx, backend, args, opts)
+			return runPs(ctx, backend, opts)
 		}),
 	}
 	psCmd.Flags().StringVar(&opts.Format, "format", "pretty", "Format the output. Values: [pretty | json].")
@@ -57,14 +57,13 @@ func psCommand(p *projectOptions, backend compose.Service) *cobra.Command {
 	return psCmd
 }
 
-func runPs(ctx context.Context, backend compose.Service, services []string, opts psOptions) error {
+func runPs(ctx context.Context, backend compose.Service, opts psOptions) error {
 	projectName, err := opts.toProjectName()
 	if err != nil {
 		return err
 	}
 	containers, err := backend.Ps(ctx, projectName, compose.PsOptions{
-		All:      opts.All,
-		Services: services,
+		All: opts.All,
 	})
 	if err != nil {
 		return err
diff --git a/cli/cmd/context/create_aci.go b/cli/cmd/context/create_aci.go
index 775fd810..3efaee52 100644
--- a/cli/cmd/context/create_aci.go
+++ b/cli/cmd/context/create_aci.go
@@ -49,8 +49,8 @@ func createAciCommand() *cobra.Command {
 	}
 
 	addDescriptionFlag(cmd, &opts.Description)
-	cmd.Flags().StringVar(&opts.Location, "location", "", "Location")
-	cmd.Flags().StringVar(&opts.SubscriptionID, "subscription-id", "", "Subscription id")
+	cmd.Flags().StringVar(&opts.Location, "location", "eastus", "Location")
+	cmd.Flags().StringVar(&opts.SubscriptionID, "subscription-id", "", "Location")
 	cmd.Flags().StringVar(&opts.ResourceGroup, "resource-group", "", "Resource group")
 
 	return cmd
diff --git a/cli/metrics/commands.go b/cli/metrics/commands.go
index e021897f..af491a89 100644
--- a/cli/metrics/commands.go
+++ b/cli/metrics/commands.go
@@ -63,7 +63,6 @@ var commands = []string{
 	"deploy",
 	"list",
 	"ls",
-	"cp",
 	"merge",
 	"pull",
 	"push",
diff --git a/docs/ecs-compose-examples.md b/docs/ecs-compose-examples.md
index 9137b762..f0e4e7f4 100644
--- a/docs/ecs-compose-examples.md
+++ b/docs/ecs-compose-examples.md
@@ -92,8 +92,7 @@ services:
   foo:
     image: nginx
     deploy:
-      x-aws-autoscaling: 
-        cpu: 75
+      x-aws-autoscaling: 75
 ```
 
 
diff --git a/docs/ecs-compose-features.md b/docs/ecs-compose-features.md
index 17aced96..5fb4b7e2 100644
--- a/docs/ecs-compose-features.md
+++ b/docs/ecs-compose-features.md
@@ -176,6 +176,6 @@ services:
         deploy:
           resources:
             limits:
-              cpu: '0.5'
+              cpu: 0.5
               memory: 2Gb
 ```
diff --git a/docs/reference/docker_compose.yaml b/docs/reference/docker_compose.yaml
index cd6d2030..1910fdb7 100644
--- a/docs/reference/docker_compose.yaml
+++ b/docs/reference/docker_compose.yaml
@@ -33,17 +33,12 @@ long: "You can use compose subcommand, `docker compose [-f <arg>...] [options] [
     pull db\n```\n\n### Use `-p` to specify a project name\n\nEach configuration has
     a project name. If you supply a `-p` flag, you can specify a project name. If
     you don’t \nspecify the flag, Compose uses the current directory name. \nProject
-    name can also be set by `COMPOSE_PROJECT_NAME` environment variable.\n\nMost compose
-    subcommand can be ran without a compose file, just passing \nproject name to retrieve
-    the relevant resources.\n\n```\n$ docker compose -p my_project ps -a\nNAME                 SERVICE
-    \   STATUS     PORTS\nmy_project_demo_1    demo       running             \n\n$
-    docker compose -p my_project logs\ndemo_1  | PING localhost (127.0.0.1): 56 data
-    bytes\ndemo_1  | 64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.095 ms\n```\n\n###
-    Use profiles to enable optional services\n\nUse `--profile` to specify one or
-    more active profiles\nCalling `docker compose --profile frontend up` will start
-    the services with the profile `frontend` and services \nwithout any specified
-    profiles. \nYou can also enable multiple profiles, e.g. with `docker compose --profile
-    frontend --profile debug up` the profiles `frontend` and `debug` will be enabled.\n\nProfiles
+    name can also be set by `COMPOSE_PROJECT_NAME` environment variable.\n\n### Use
+    profiles to enable optional services\n\nUse `--profile` to specify one or more
+    active profiles\nCalling `docker compose --profile frontend up` will start the
+    services with the profile `frontend` and services \nwithout any specified profiles.
+    \nYou can also enable multiple profiles, e.g. with `docker compose --profile frontend
+    --profile debug up` the profiles `frontend` and `debug` will be enabled.\n\nProfiles
     can also be set by `COMPOSE_PROFILES` environment variable.\n\n### Set up environment
     variables\n\nYou can set environment variables for various docker-compose options,
     including the `-f`, `-p` and `--profiles` flags.\n\nSetting the `COMPOSE_FILE`
@@ -51,7 +46,6 @@ long: "You can use compose subcommand, `docker compose [-f <arg>...] [options] [
     environment variable does the same for to the `-p` flag,\nand so does `COMPOSE_PROFILES`
     environment variable for to the `--profiles` flag.\n\nIf flags are explicitly
     set on command line, associated environment variable is ignored"
-usage: docker compose
 pname: docker
 plink: docker.yaml
 cname:
@@ -61,12 +55,10 @@ cname:
   - docker compose down
   - docker compose events
   - docker compose exec
-  - docker compose images
   - docker compose kill
   - docker compose logs
   - docker compose ls
   - docker compose pause
-  - docker compose port
   - docker compose ps
   - docker compose pull
   - docker compose push
@@ -85,12 +77,10 @@ clink:
   - docker_compose_down.yaml
   - docker_compose_events.yaml
   - docker_compose_exec.yaml
-  - docker_compose_images.yaml
   - docker_compose_kill.yaml
   - docker_compose_logs.yaml
   - docker_compose_ls.yaml
   - docker_compose_pause.yaml
-  - docker_compose_port.yaml
   - docker_compose_ps.yaml
   - docker_compose_pull.yaml
   - docker_compose_push.yaml
@@ -131,15 +121,6 @@ options:
     experimentalcli: false
     kubernetes: false
     swarm: false
-  - option: no-ansi
-    value_type: bool
-    default_value: "false"
-    description: Do not print ANSI control characters (DEPRECATED)
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
   - option: profile
     value_type: stringArray
     default_value: '[]'
diff --git a/docs/reference/docker_compose_build.yaml b/docs/reference/docker_compose_build.yaml
index 8a5e8972..1921bd31 100644
--- a/docs/reference/docker_compose_build.yaml
+++ b/docs/reference/docker_compose_build.yaml
@@ -14,62 +14,6 @@ options:
     experimentalcli: false
     kubernetes: false
     swarm: false
-  - option: compress
-    value_type: bool
-    default_value: "true"
-    description: Compress the build context using gzip. DEPRECATED
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-  - option: force-rm
-    value_type: bool
-    default_value: "true"
-    description: Always remove intermediate containers. DEPRECATED
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-  - option: memory
-    shorthand: m
-    value_type: string
-    description: |
-        Set memory limit for the build container. Not supported on buildkit yet.
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-  - option: no-cache
-    value_type: bool
-    default_value: "false"
-    description: Do not use cache when building the image
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-  - option: no-rm
-    value_type: bool
-    default_value: "false"
-    description: |
-        Do not remove intermediate containers after a successful build. DEPRECATED
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-  - option: parallel
-    value_type: bool
-    default_value: "true"
-    description: Build images in parallel. DEPRECATED
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
   - option: progress
     value_type: string
     default_value: auto
diff --git a/docs/reference/docker_compose_convert.yaml b/docs/reference/docker_compose_convert.yaml
index 1b8a1b99..d9884048 100644
--- a/docs/reference/docker_compose_convert.yaml
+++ b/docs/reference/docker_compose_convert.yaml
@@ -4,8 +4,7 @@ short: Converts the compose file to platform's canonical format
 long: "`docker compose convert` render the actual data model to be applied on target
     platform. When used with Docker engine,\nit merges the Compose files set by `-f`
     flags, resolves variables in Compose file, and expands short-notation into \nfully
-    defined Compose model. \n\nTo allow smooth migration from docker-compose, this
-    subcommand declares alias `docker compose config`"
+    defined Compose model."
 usage: docker compose convert SERVICES
 pname: docker compose
 plink: docker_compose.yaml
@@ -19,32 +18,6 @@ options:
     experimentalcli: false
     kubernetes: false
     swarm: false
-  - option: hash
-    value_type: string
-    description: Print the service config hash, one per line.
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-  - option: no-interpolate
-    value_type: bool
-    default_value: "false"
-    description: Don't interpolate environment variables.
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-  - option: profiles
-    value_type: bool
-    default_value: "false"
-    description: Print the profile names, one per line.
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
   - option: quiet
     shorthand: q
     value_type: bool
@@ -64,24 +37,6 @@ options:
     experimentalcli: false
     kubernetes: false
     swarm: false
-  - option: services
-    value_type: bool
-    default_value: "false"
-    description: Print the service names, one per line.
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-  - option: volumes
-    value_type: bool
-    default_value: "false"
-    description: Print the volume names, one per line.
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
 deprecated: false
 experimental: false
 experimentalcli: false
diff --git a/docs/reference/docker_compose_images.yaml b/docs/reference/docker_compose_images.yaml
deleted file mode 100644
index 4af06e31..00000000
--- a/docs/reference/docker_compose_images.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-command: docker compose images
-short: List images used by the created containers
-long: List images used by the created containers
-usage: docker compose images [SERVICE...]
-pname: docker compose
-plink: docker_compose.yaml
-options:
-  - option: quiet
-    shorthand: q
-    value_type: bool
-    default_value: "false"
-    description: Only display IDs
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-deprecated: false
-experimental: false
-experimentalcli: false
-kubernetes: false
-swarm: false
-
diff --git a/docs/reference/docker_compose_port.yaml b/docs/reference/docker_compose_port.yaml
deleted file mode 100644
index 1f8f0f01..00000000
--- a/docs/reference/docker_compose_port.yaml
+++ /dev/null
@@ -1,31 +0,0 @@
-command: docker compose port
-short: Print the public port for a port binding.
-long: Print the public port for a port binding.
-usage: docker compose port [options] [--] SERVICE PRIVATE_PORT
-pname: docker compose
-plink: docker_compose.yaml
-options:
-  - option: index
-    value_type: int
-    default_value: "1"
-    description: index of the container if service has multiple replicas
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-  - option: protocol
-    value_type: string
-    default_value: tcp
-    description: tcp or udp
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-deprecated: false
-experimental: false
-experimentalcli: false
-kubernetes: false
-swarm: false
-
diff --git a/docs/reference/docker_compose_pull.yaml b/docs/reference/docker_compose_pull.yaml
index 389db578..37ae5867 100644
--- a/docs/reference/docker_compose_pull.yaml
+++ b/docs/reference/docker_compose_pull.yaml
@@ -6,15 +6,6 @@ usage: docker compose pull [SERVICE...]
 pname: docker compose
 plink: docker_compose.yaml
 options:
-  - option: ignore-pull-failures
-    value_type: bool
-    default_value: "false"
-    description: Pull what it can and ignores images with pull failures
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
   - option: include-deps
     value_type: bool
     default_value: "false"
@@ -24,24 +15,6 @@ options:
     experimentalcli: false
     kubernetes: false
     swarm: false
-  - option: no-parallel
-    value_type: bool
-    default_value: "true"
-    description: DEPRECATED disable parallel pulling.
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
-  - option: parallel
-    value_type: bool
-    default_value: "true"
-    description: DEPRECATED pull multiple images in parallel.
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
   - option: quiet
     shorthand: q
     value_type: bool
diff --git a/docs/reference/docker_compose_rm.yaml b/docs/reference/docker_compose_rm.yaml
index 6f9e6786..70d00d37 100644
--- a/docs/reference/docker_compose_rm.yaml
+++ b/docs/reference/docker_compose_rm.yaml
@@ -20,16 +20,6 @@ usage: docker compose rm [SERVICE...]
 pname: docker compose
 plink: docker_compose.yaml
 options:
-  - option: all
-    shorthand: a
-    value_type: bool
-    default_value: "false"
-    description: Deprecated - no effect
-    deprecated: false
-    experimental: false
-    experimentalcli: false
-    kubernetes: false
-    swarm: false
   - option: force
     shorthand: f
     value_type: bool
diff --git a/ecs/local/compose.go b/ecs/local/compose.go
index c0214b49..21484313 100644
--- a/ecs/local/compose.go
+++ b/ecs/local/compose.go
@@ -188,10 +188,6 @@ func (e ecsLocalSimulation) Exec(ctx context.Context, project *types.Project, op
 	return 0, errdefs.ErrNotImplemented
 }
 
-func (e ecsLocalSimulation) Copy(ctx context.Context, project *types.Project, opts compose.CopyOptions) error {
-	return e.compose.Copy(ctx, project, opts)
-}
-
 func (e ecsLocalSimulation) Pause(ctx context.Context, project string, options compose.PauseOptions) error {
 	return e.compose.Pause(ctx, project, options)
 }
diff --git a/ecs/up.go b/ecs/up.go
index 691a52c2..0749719d 100644
--- a/ecs/up.go
+++ b/ecs/up.go
@@ -75,10 +75,6 @@ func (b *ecsAPIService) Port(ctx context.Context, project string, service string
 	return "", 0, errdefs.ErrNotImplemented
 }
 
-func (b *ecsAPIService) Copy(ctx context.Context, project *types.Project, options compose.CopyOptions) error {
-	return errdefs.ErrNotImplemented
-}
-
 func (b *ecsAPIService) Up(ctx context.Context, project *types.Project, options compose.UpOptions) error {
 	logrus.Debugf("deploying on AWS with region=%q", b.Region)
 	err := b.aws.CheckRequirements(ctx, b.Region)
diff --git a/go.mod b/go.mod
index 79c96e5f..d73235c1 100644
--- a/go.mod
+++ b/go.mod
@@ -17,7 +17,7 @@ require (
 	github.com/awslabs/goformation/v4 v4.15.6
 	github.com/buger/goterm v1.0.0
 	github.com/cnabio/cnab-to-oci v0.3.1-beta1
-	github.com/compose-spec/compose-go v0.0.0-20210505145624-6dcd3d18b38b
+	github.com/compose-spec/compose-go v0.0.0-20210503135708-e8ee37c1478c
 	github.com/containerd/console v1.0.1
 	github.com/containerd/containerd v1.4.3
 	github.com/containerd/continuity v0.0.0-20200928162600-f2cc35102c2a // indirect
diff --git a/go.sum b/go.sum
index 491e1cb7..b23692ea 100644
--- a/go.sum
+++ b/go.sum
@@ -308,8 +308,8 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
 github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
 github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
-github.com/compose-spec/compose-go v0.0.0-20210505145624-6dcd3d18b38b h1:0MPA42m4n8VGsCld8hWmeRYeblPrgRDbiXPvRnjWoLY=
-github.com/compose-spec/compose-go v0.0.0-20210505145624-6dcd3d18b38b/go.mod h1:6eIT9U2OgdHmkRD6szmqatCrWWEEUSwl/j2iJYH4jLo=
+github.com/compose-spec/compose-go v0.0.0-20210503135708-e8ee37c1478c h1:XDrhClIbE/zCDU4KWCYSYmceYZj5EBn3DMhQ7hVvyUs=
+github.com/compose-spec/compose-go v0.0.0-20210503135708-e8ee37c1478c/go.mod h1:6eIT9U2OgdHmkRD6szmqatCrWWEEUSwl/j2iJYH4jLo=
 github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
 github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM=
 github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340 h1:9atoWyI9RtXFwf7UDbme/6M8Ud0rFrx+Q3ZWgSnsxtw=
diff --git a/kube/compose.go b/kube/compose.go
index ced73d8f..9fb4e973 100644
--- a/kube/compose.go
+++ b/kube/compose.go
@@ -198,11 +198,6 @@ func (s *composeService) Stop(ctx context.Context, project *types.Project, optio
 	return errdefs.ErrNotImplemented
 }
 
-// Copy copies a file/folder between a service container and the local filesystem
-func (s *composeService) Copy(ctx context.Context, project *types.Project, options compose.CopyOptions) error {
-	return errdefs.ErrNotImplemented
-}
-
 // Logs executes the equivalent to a `compose logs`
 func (s *composeService) Logs(ctx context.Context, projectName string, consumer compose.LogConsumer, options compose.LogOptions) error {
 	if len(options.Services) > 0 {
diff --git a/local/compose/convergence.go b/local/compose/convergence.go
index a46ff065..373181af 100644
--- a/local/compose/convergence.go
+++ b/local/compose/convergence.go
@@ -147,7 +147,6 @@ func getContainerProgressName(container moby.Container) string {
 func (s *composeService) waitDependencies(ctx context.Context, project *types.Project, service types.ServiceConfig) error {
 	eg, _ := errgroup.WithContext(ctx)
 	for dep, config := range service.DependsOn {
-		dep, config := dep, config
 		eg.Go(func() error {
 			ticker := time.NewTicker(500 * time.Millisecond)
 			defer ticker.Stop()
@@ -329,8 +328,7 @@ func (s *composeService) createMobyContainer(ctx context.Context, project *types
 				aliases = append(aliases, cfg.Aliases...)
 			}
 		}
-
-		err = s.connectContainerToNetwork(ctx, created.ID, netwrk.Name, cfg, aliases...)
+		err = s.connectContainerToNetwork(ctx, created.ID, netwrk.Name, aliases...)
 		if err != nil {
 			return err
 		}
@@ -338,19 +336,9 @@ func (s *composeService) createMobyContainer(ctx context.Context, project *types
 	return nil
 }
 
-func (s *composeService) connectContainerToNetwork(ctx context.Context, id string, netwrk string, cfg *types.ServiceNetworkConfig, aliases ...string) error {
-	var (
-		ipv4ddress  string
-		ipv6Address string
-	)
-	if cfg != nil {
-		ipv4ddress = cfg.Ipv4Address
-		ipv6Address = cfg.Ipv6Address
-	}
+func (s *composeService) connectContainerToNetwork(ctx context.Context, id string, netwrk string, aliases ...string) error {
 	err := s.apiClient.NetworkConnect(ctx, netwrk, id, &network.EndpointSettings{
-		Aliases:           aliases,
-		IPAddress:         ipv4ddress,
-		GlobalIPv6Address: ipv6Address,
+		Aliases: aliases,
 	})
 	if err != nil {
 		return err
diff --git a/local/compose/cp.go b/local/compose/cp.go
deleted file mode 100644
index ee5bd3f2..00000000
--- a/local/compose/cp.go
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
-   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"
-	"io"
-	"os"
-	"path/filepath"
-	"strings"
-
-	"golang.org/x/sync/errgroup"
-
-	"github.com/compose-spec/compose-go/types"
-	"github.com/docker/cli/cli/command"
-	"github.com/docker/compose-cli/api/compose"
-	apitypes "github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/pkg/archive"
-	"github.com/docker/docker/pkg/system"
-	"github.com/pkg/errors"
-)
-
-type copyDirection int
-
-const (
-	fromService copyDirection = 1 << iota
-	toService
-	acrossServices = fromService | toService
-)
-
-func (s *composeService) Copy(ctx context.Context, project *types.Project, opts compose.CopyOptions) error {
-	srcService, srcPath := splitCpArg(opts.Source)
-	destService, dstPath := splitCpArg(opts.Destination)
-
-	var direction copyDirection
-	var serviceName string
-	if srcService != "" {
-		direction |= fromService
-		serviceName = srcService
-
-		// copying from multiple containers of a services doesn't make sense.
-		if opts.All {
-			return errors.New("cannot use the --all flag when copying from a service")
-		}
-	}
-	if destService != "" {
-		direction |= toService
-		serviceName = destService
-	}
-
-	f := filters.NewArgs(
-		projectFilter(project.Name),
-		serviceFilter(serviceName),
-	)
-	if !opts.All {
-		f.Add("label", fmt.Sprintf("%s=%d", containerNumberLabel, opts.Index))
-	}
-	containers, err := s.apiClient.ContainerList(ctx, apitypes.ContainerListOptions{Filters: f})
-	if err != nil {
-		return err
-	}
-
-	if len(containers) < 1 {
-		return fmt.Errorf("service %s not running", serviceName)
-	}
-
-	g := errgroup.Group{}
-	for i := range containers {
-		containerID := containers[i].ID
-
-		g.Go(func() error {
-			switch direction {
-			case fromService:
-				return s.copyFromContainer(ctx, containerID, srcPath, dstPath, opts)
-			case toService:
-				return s.copyToContainer(ctx, containerID, srcPath, dstPath, opts)
-			case acrossServices:
-				return errors.New("copying between services is not supported")
-			default:
-				return errors.New("unknown copy direction")
-			}
-		})
-	}
-
-	return g.Wait()
-}
-
-func (s *composeService) copyToContainer(ctx context.Context, containerID string, srcPath string, dstPath string, opts compose.CopyOptions) error {
-	var err error
-	if srcPath != "-" {
-		// Get an absolute source path.
-		srcPath, err = resolveLocalPath(srcPath)
-		if err != nil {
-			return err
-		}
-	}
-
-	// Prepare destination copy info by stat-ing the container path.
-	dstInfo := archive.CopyInfo{Path: dstPath}
-	dstStat, err := s.apiClient.ContainerStatPath(ctx, containerID, dstPath)
-
-	// If the destination is a symbolic link, we should evaluate it.
-	if err == nil && dstStat.Mode&os.ModeSymlink != 0 {
-		linkTarget := dstStat.LinkTarget
-		if !system.IsAbs(linkTarget) {
-			// Join with the parent directory.
-			dstParent, _ := archive.SplitPathDirEntry(dstPath)
-			linkTarget = filepath.Join(dstParent, linkTarget)
-		}
-
-		dstInfo.Path = linkTarget
-		dstStat, err = s.apiClient.ContainerStatPath(ctx, containerID, linkTarget)
-	}
-
-	// Validate the destination path
-	if err := command.ValidateOutputPathFileMode(dstStat.Mode); err != nil {
-		return errors.Wrapf(err, `destination "%s:%s" must be a directory or a regular file`, containerID, dstPath)
-	}
-
-	// Ignore any error and assume that the parent directory of the destination
-	// path exists, in which case the copy may still succeed. If there is any
-	// type of conflict (e.g., non-directory overwriting an existing directory
-	// or vice versa) the extraction will fail. If the destination simply did
-	// not exist, but the parent directory does, the extraction will still
-	// succeed.
-	if err == nil {
-		dstInfo.Exists, dstInfo.IsDir = true, dstStat.Mode.IsDir()
-	}
-
-	var (
-		content         io.Reader
-		resolvedDstPath string
-	)
-
-	if srcPath == "-" {
-		content = os.Stdin
-		resolvedDstPath = dstInfo.Path
-		if !dstInfo.IsDir {
-			return errors.Errorf("destination \"%s:%s\" must be a directory", containerID, dstPath)
-		}
-	} else {
-		// Prepare source copy info.
-		srcInfo, err := archive.CopyInfoSourcePath(srcPath, opts.FollowLink)
-		if err != nil {
-			return err
-		}
-
-		srcArchive, err := archive.TarResource(srcInfo)
-		if err != nil {
-			return err
-		}
-		defer srcArchive.Close() //nolint:errcheck
-
-		// With the stat info about the local source as well as the
-		// destination, we have enough information to know whether we need to
-		// alter the archive that we upload so that when the server extracts
-		// it to the specified directory in the container we get the desired
-		// copy behavior.
-
-		// See comments in the implementation of `archive.PrepareArchiveCopy`
-		// for exactly what goes into deciding how and whether the source
-		// archive needs to be altered for the correct copy behavior when it is
-		// extracted. This function also infers from the source and destination
-		// info which directory to extract to, which may be the parent of the
-		// destination that the user specified.
-		dstDir, preparedArchive, err := archive.PrepareArchiveCopy(srcArchive, srcInfo, dstInfo)
-		if err != nil {
-			return err
-		}
-		defer preparedArchive.Close() //nolint:errcheck
-
-		resolvedDstPath = dstDir
-		content = preparedArchive
-	}
-
-	options := apitypes.CopyToContainerOptions{
-		AllowOverwriteDirWithFile: false,
-		CopyUIDGID:                opts.CopyUIDGID,
-	}
-	return s.apiClient.CopyToContainer(ctx, containerID, resolvedDstPath, content, options)
-}
-
-func (s *composeService) copyFromContainer(ctx context.Context, containerID, srcPath, dstPath string, opts compose.CopyOptions) error {
-	var err error
-	if dstPath != "-" {
-		// Get an absolute destination path.
-		dstPath, err = resolveLocalPath(dstPath)
-		if err != nil {
-			return err
-		}
-	}
-
-	if err := command.ValidateOutputPath(dstPath); err != nil {
-		return err
-	}
-
-	// if client requests to follow symbol link, then must decide target file to be copied
-	var rebaseName string
-	if opts.FollowLink {
-		srcStat, err := s.apiClient.ContainerStatPath(ctx, containerID, srcPath)
-
-		// If the destination is a symbolic link, we should follow it.
-		if err == nil && srcStat.Mode&os.ModeSymlink != 0 {
-			linkTarget := srcStat.LinkTarget
-			if !system.IsAbs(linkTarget) {
-				// Join with the parent directory.
-				srcParent, _ := archive.SplitPathDirEntry(srcPath)
-				linkTarget = filepath.Join(srcParent, linkTarget)
-			}
-
-			linkTarget, rebaseName = archive.GetRebaseName(srcPath, linkTarget)
-			srcPath = linkTarget
-		}
-	}
-
-	content, stat, err := s.apiClient.CopyFromContainer(ctx, containerID, srcPath)
-	if err != nil {
-		return err
-	}
-	defer content.Close() //nolint:errcheck
-
-	if dstPath == "-" {
-		_, err = io.Copy(os.Stdout, content)
-		return err
-	}
-
-	srcInfo := archive.CopyInfo{
-		Path:       srcPath,
-		Exists:     true,
-		IsDir:      stat.Mode.IsDir(),
-		RebaseName: rebaseName,
-	}
-
-	preArchive := content
-	if len(srcInfo.RebaseName) != 0 {
-		_, srcBase := archive.SplitPathDirEntry(srcInfo.Path)
-		preArchive = archive.RebaseArchiveEntries(content, srcBase, srcInfo.RebaseName)
-	}
-
-	return archive.CopyTo(preArchive, srcInfo, dstPath)
-}
-
-func splitCpArg(arg string) (container, path string) {
-	if system.IsAbs(arg) {
-		// Explicit local absolute path, e.g., `C:\foo` or `/foo`.
-		return "", arg
-	}
-
-	parts := strings.SplitN(arg, ":", 2)
-
-	if len(parts) == 1 || strings.HasPrefix(parts[0], ".") {
-		// Either there's no `:` in the arg
-		// OR it's an explicit local relative path like `./file:name.txt`.
-		return "", arg
-	}
-
-	return parts[0], parts[1]
-}
-
-func resolveLocalPath(localPath string) (absPath string, err error) {
-	if absPath, err = filepath.Abs(localPath); err != nil {
-		return
-	}
-	return archive.PreserveTrailingDotOrSeparator(absPath, localPath, filepath.Separator), nil
-}
diff --git a/local/compose/create.go b/local/compose/create.go
index 4df60777..560d7649 100644
--- a/local/compose/create.go
+++ b/local/compose/create.go
@@ -438,18 +438,10 @@ func getDeployResources(s types.ServiceConfig) container.Resources {
 	}
 
 	for name, u := range s.Ulimits {
-		soft := u.Single
-		if u.Soft != 0 {
-			soft = u.Soft
-		}
-		hard := u.Single
-		if u.Hard != 0 {
-			hard = u.Hard
-		}
 		resources.Ulimits = append(resources.Ulimits, &units.Ulimit{
 			Name: name,
-			Hard: int64(soft),
-			Soft: int64(hard),
+			Hard: int64(u.Hard),
+			Soft: int64(u.Soft),
 		})
 	}
 	return resources
diff --git a/local/compose/logs.go b/local/compose/logs.go
index c708280e..dea11abc 100644
--- a/local/compose/logs.go
+++ b/local/compose/logs.go
@@ -51,11 +51,11 @@ func (s *composeService) Logs(ctx context.Context, projectName string, consumer
 				Tail:       options.Tail,
 				Timestamps: options.Timestamps,
 			})
+			defer r.Close() // nolint errcheck
+
 			if err != nil {
 				return err
 			}
-			defer r.Close() // nolint errcheck
-
 			name := getContainerNameWithoutProject(c)
 			w := utils.GetWriter(name, service, func(event compose.ContainerEvent) {
 				consumer.Log(name, service, event.Line)
diff --git a/local/compose/ps.go b/local/compose/ps.go
index 99cd6c13..9dc03471 100644
--- a/local/compose/ps.go
+++ b/local/compose/ps.go
@@ -26,11 +26,7 @@ import (
 )
 
 func (s *composeService) Ps(ctx context.Context, projectName string, options compose.PsOptions) ([]compose.ContainerSummary, error) {
-	oneOff := oneOffExclude
-	if options.All {
-		oneOff = oneOffInclude
-	}
-	containers, err := s.getContainers(ctx, projectName, oneOff, true, options.Services...)
+	containers, err := s.getContainers(ctx, projectName, oneOffInclude, options.All)
 	if err != nil {
 		return nil, err
 	}
diff --git a/local/compose/run.go b/local/compose/run.go
index aad04d7b..bc02d9fd 100644
--- a/local/compose/run.go
+++ b/local/compose/run.go
@@ -42,7 +42,7 @@ func (s *composeService) RunOneOffContainer(ctx context.Context, project *types.
 		return 0, err
 	}
 
-	applyRunOptions(&service, opts)
+	applyRunOptions(project, &service, opts)
 
 	slug := moby.GenerateRandomID()
 	if service.ContainerName == "" {
@@ -107,7 +107,7 @@ func (s *composeService) RunOneOffContainer(ctx context.Context, project *types.
 
 }
 
-func applyRunOptions(service *types.ServiceConfig, opts compose.RunOptions) {
+func applyRunOptions(project *types.Project, service *types.ServiceConfig, opts compose.RunOptions) {
 	service.Tty = opts.Tty
 	service.ContainerName = opts.Name
 
@@ -124,7 +124,12 @@ func applyRunOptions(service *types.ServiceConfig, opts compose.RunOptions) {
 		service.Entrypoint = opts.Entrypoint
 	}
 	if len(opts.Environment) > 0 {
-		service.Environment.OverrideBy(opts.EnvironmentMap())
+		env := types.NewMappingWithEquals(opts.Environment)
+		projectEnv := env.Resolve(func(s string) (string, bool) {
+			v, ok := project.Environment[s]
+			return v, ok
+		}).RemoveEmpty()
+		service.Environment.OverrideBy(projectEnv)
 	}
 	for k, v := range opts.Labels {
 		service.Labels.Add(k, v)


Test patch:
diff --git a/aci/context_test.go b/aci/context_test.go
index 51a384e3..88d72656 100644
--- a/aci/context_test.go
+++ b/aci/context_test.go
@@ -107,28 +107,6 @@ func TestCreateNewResourceGroup(t *testing.T) {
 	assert.DeepEqual(t, data, aciContext("1234", "newResourceGroup", "eastus"))
 }
 
-func TestCreateNewResourceGroupWithSpecificLocation(t *testing.T) {
-	ctx := context.TODO()
-	opts := options("1234", "")
-	opts.Location = "eastus2"
-	m := testContextMocks()
-	m.resourceGroupHelper.On("GetSubscriptionIDs", ctx).Return([]subscription.Model{subModel("1234", "Subscription1")}, nil)
-	m.resourceGroupHelper.On("GetGroup", ctx, "1234", "myResourceGroup").Return(group("myResourceGroup", "eastus"), nil)
-
-	selectOptions := []string{"create a new resource group", "group1 (eastus)", "group2 (westeurope)"}
-	m.userPrompt.On("Select", "Select a resource group", selectOptions).Return(0, nil)
-	m.resourceGroupHelper.On("CreateOrUpdate", ctx, "1234", mock.AnythingOfType("string"), mock.AnythingOfType("resources.Group")).Return(group("newResourceGroup", "eastus"), nil)
-	m.resourceGroupHelper.On("ListGroups", ctx, "1234").Return([]resources.Group{
-		group("group1", "eastus"),
-		group("group2", "westeurope"),
-	}, nil)
-
-	data, description, err := m.contextCreateHelper.createContextData(ctx, opts)
-	assert.NilError(t, err)
-	assert.Equal(t, description, "newResourceGroup@eastus2")
-	assert.DeepEqual(t, data, aciContext("1234", "newResourceGroup", "eastus2"))
-}
-
 func TestSelectExistingResourceGroup(t *testing.T) {
 	ctx := context.TODO()
 	opts := options("1234", "")
@@ -216,6 +194,7 @@ func options(subscriptionID string, resourceGroupName string) ContextParams {
 	return ContextParams{
 		SubscriptionID: subscriptionID,
 		ResourceGroup:  resourceGroupName,
+		Location:       "eastus",
 	}
 }
 
diff --git a/api/compose/api_test.go b/api/compose/api_test.go
index ddbe25d6..fca9d0fc 100644
--- a/api/compose/api_test.go
+++ b/api/compose/api_test.go
@@ -19,6 +19,7 @@ package compose
 import (
 	"testing"
 
+	"github.com/compose-spec/compose-go/types"
 	"gotest.tools/v3/assert"
 )
 
@@ -30,7 +31,7 @@ func TestRunOptionsEnvironmentMap(t *testing.T) {
 			"QIX",
 		},
 	}
-	env := opts.EnvironmentMap()
+	env := types.NewMappingWithEquals(opts.Environment)
 	assert.Equal(t, *env["FOO"], "BAR")
 	assert.Equal(t, *env["ZOT"], "")
 	assert.Check(t, env["QIX"] == nil)
diff --git a/local/compose/ps_test.go b/local/compose/ps_test.go
index 3ea5faac..619bd33f 100644
--- a/local/compose/ps_test.go
+++ b/local/compose/ps_test.go
@@ -37,9 +37,7 @@ func TestPs(t *testing.T) {
 	tested.apiClient = api
 
 	ctx := context.Background()
-	args := filters.NewArgs(projectFilter(testProject))
-	args.Add("label", "com.docker.compose.oneoff=False")
-	listOpts := apitypes.ContainerListOptions{Filters: args, All: true}
+	listOpts := apitypes.ContainerListOptions{Filters: filters.NewArgs(projectFilter(testProject)), All: false}
 	c1, inspect1 := containerDetails("service1", "123", "Running", "healthy")
 	c2, inspect2 := containerDetails("service1", "456", "Running", "")
 	c2.Ports = []apitypes.Port{{PublicPort: 80, PrivatePort: 90, IP: "localhost"}}
diff --git a/local/e2e/compose/compose_build_test.go b/local/e2e/compose/compose_build_test.go
index c49f8168..75076962 100644
--- a/local/e2e/compose/compose_build_test.go
+++ b/local/e2e/compose/compose_build_test.go
@@ -17,10 +17,7 @@
 package e2e
 
 import (
-	"io/ioutil"
 	"net/http"
-	"os"
-	"path/filepath"
 	"strings"
 	"testing"
 	"time"
@@ -109,41 +106,3 @@ func TestLocalComposeBuild(t *testing.T) {
 		c.RunDockerCmd("rmi", "custom-nginx")
 	})
 }
-
-func TestLocalComposeBuildStaticDockerfilePath(t *testing.T) {
-	c := NewParallelE2eCLI(t, binDir)
-
-	t.Run("build ddev-style compose files", func(t *testing.T) {
-		dir, err := ioutil.TempDir("", "ddev")
-		assert.NilError(t, err)
-		defer os.RemoveAll(dir) //nolint:errcheck
-
-		assert.NilError(t, ioutil.WriteFile(filepath.Join(dir, "docker-compose.yml"), []byte(`services:
-  service1:
-    build:
-      context: `+dir+`/service1
-      dockerfile: Dockerfile
-  service2:
-    build:
-      context: `+dir+`/service2
-      dockerfile: `+dir+`/service2/Dockerfile
-  `), 0644))
-
-		assert.NilError(t, os.Mkdir(filepath.Join(dir, "service1"), 0700))
-		assert.NilError(t, ioutil.WriteFile(filepath.Join(dir, "service1", "Dockerfile"), []byte(`FROM alpine
-		RUN echo "hello"
-		`), 0644))
-
-		assert.NilError(t, os.Mkdir(filepath.Join(dir, "service2"), 0700))
-		assert.NilError(t, ioutil.WriteFile(filepath.Join(dir, "service2", "Dockerfile"), []byte(`FROM alpine
-		RUN echo "world"
-		`), 0644))
-
-		res := c.RunDockerCmd("compose", "-f", filepath.Join(dir, "docker-compose.yml"), "build")
-
-		res.Assert(t, icmd.Expected{Out: `RUN echo "hello"`})
-		res.Assert(t, icmd.Expected{Out: `RUN echo "world"`})
-
-		c.RunDockerCmd("compose", "-f", filepath.Join(dir, "docker-compose.yml"), "down", "--rmi", "all")
-	})
-}
diff --git a/local/e2e/compose/cp_test.go b/local/e2e/compose/cp_test.go
deleted file mode 100644
index 5b567830..00000000
--- a/local/e2e/compose/cp_test.go
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
-   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 (
-	"os"
-	"strings"
-	"testing"
-
-	"gotest.tools/v3/assert"
-	"gotest.tools/v3/icmd"
-
-	. "github.com/docker/compose-cli/utils/e2e"
-)
-
-func TestCopy(t *testing.T) {
-	c := NewParallelE2eCLI(t, binDir)
-
-	const projectName = "copy_e2e"
-
-	t.Cleanup(func() {
-		c.RunDockerCmd("compose", "-f", "./fixtures/cp-test/docker-compose.yml", "--project-name", projectName, "down")
-
-		os.Remove("./fixtures/cp-test/from-default.txt") //nolint:errcheck
-		os.Remove("./fixtures/cp-test/from-indexed.txt") //nolint:errcheck
-		os.RemoveAll("./fixtures/cp-test/cp-folder2")    //nolint:errcheck
-	})
-
-	t.Run("start service", func(t *testing.T) {
-		c.RunDockerCmd("compose", "-f", "./fixtures/cp-test/docker-compose.yml", "--project-name", projectName, "up", "--scale", "nginx=5", "-d")
-	})
-
-	t.Run("make sure service is running", func(t *testing.T) {
-		res := c.RunDockerCmd("compose", "-p", projectName, "ps")
-		res.Assert(t, icmd.Expected{Out: `nginx               running`})
-	})
-
-	t.Run("copy to container copies the file to the first container by default", func(t *testing.T) {
-		res := c.RunDockerCmd("compose", "-f", "./fixtures/cp-test/docker-compose.yml", "-p", projectName, "cp", "./fixtures/cp-test/cp-me.txt", "nginx:/tmp/default.txt")
-		res.Assert(t, icmd.Expected{ExitCode: 0})
-
-		output := c.RunDockerCmd("exec", projectName+"_nginx_1", "cat", "/tmp/default.txt").Stdout()
-		assert.Assert(t, strings.Contains(output, `hello world`), output)
-
-		res = c.RunDockerOrExitError("exec", projectName+"_nginx_2", "cat", "/tmp/default.txt")
-		res.Assert(t, icmd.Expected{ExitCode: 1})
-	})
-
-	t.Run("copy to container with a given index copies the file to the given container", func(t *testing.T) {
-		res := c.RunDockerCmd("compose", "-f", "./fixtures/cp-test/docker-compose.yml", "-p", projectName, "cp", "--index=3", "./fixtures/cp-test/cp-me.txt", "nginx:/tmp/indexed.txt")
-		res.Assert(t, icmd.Expected{ExitCode: 0})
-
-		output := c.RunDockerCmd("exec", projectName+"_nginx_3", "cat", "/tmp/indexed.txt").Stdout()
-		assert.Assert(t, strings.Contains(output, `hello world`), output)
-
-		res = c.RunDockerOrExitError("exec", projectName+"_nginx_2", "cat", "/tmp/indexed.txt")
-		res.Assert(t, icmd.Expected{ExitCode: 1})
-	})
-
-	t.Run("copy to container with the all flag copies the file to all containers", func(t *testing.T) {
-		res := c.RunDockerCmd("compose", "-f", "./fixtures/cp-test/docker-compose.yml", "-p", projectName, "cp", "--all", "./fixtures/cp-test/cp-me.txt", "nginx:/tmp/all.txt")
-		res.Assert(t, icmd.Expected{ExitCode: 0})
-
-		output := c.RunDockerCmd("exec", projectName+"_nginx_1", "cat", "/tmp/all.txt").Stdout()
-		assert.Assert(t, strings.Contains(output, `hello world`), output)
-
-		output = c.RunDockerCmd("exec", projectName+"_nginx_2", "cat", "/tmp/all.txt").Stdout()
-		assert.Assert(t, strings.Contains(output, `hello world`), output)
-
-		output = c.RunDockerCmd("exec", projectName+"_nginx_3", "cat", "/tmp/all.txt").Stdout()
-		assert.Assert(t, strings.Contains(output, `hello world`), output)
-	})
-
-	t.Run("copy from a container copies the file to the host from the first container by default", func(t *testing.T) {
-		res := c.RunDockerCmd("compose", "-f", "./fixtures/cp-test/docker-compose.yml", "-p", projectName, "cp", "nginx:/tmp/default.txt", "./fixtures/cp-test/from-default.txt")
-		res.Assert(t, icmd.Expected{ExitCode: 0})
-
-		data, err := os.ReadFile("./fixtures/cp-test/from-default.txt")
-		assert.NilError(t, err)
-		assert.Equal(t, `hello world`, string(data))
-	})
-
-	t.Run("copy from a container with a given index copies the file to host", func(t *testing.T) {
-		res := c.RunDockerCmd("compose", "-f", "./fixtures/cp-test/docker-compose.yml", "-p", projectName, "cp", "--index=3", "nginx:/tmp/indexed.txt", "./fixtures/cp-test/from-indexed.txt")
-		res.Assert(t, icmd.Expected{ExitCode: 0})
-
-		data, err := os.ReadFile("./fixtures/cp-test/from-indexed.txt")
-		assert.NilError(t, err)
-		assert.Equal(t, `hello world`, string(data))
-	})
-
-	t.Run("copy to and from a container also work with folder", func(t *testing.T) {
-		res := c.RunDockerCmd("compose", "-f", "./fixtures/cp-test/docker-compose.yml", "-p", projectName, "cp", "./fixtures/cp-test/cp-folder", "nginx:/tmp")
-		res.Assert(t, icmd.Expected{ExitCode: 0})
-
-		output := c.RunDockerCmd("exec", projectName+"_nginx_1", "cat", "/tmp/cp-folder/cp-me.txt").Stdout()
-		assert.Assert(t, strings.Contains(output, `hello world from folder`), output)
-
-		res = c.RunDockerCmd("compose", "-f", "./fixtures/cp-test/docker-compose.yml", "-p", projectName, "cp", "nginx:/tmp/cp-folder", "./fixtures/cp-test/cp-folder2")
-		res.Assert(t, icmd.Expected{ExitCode: 0})
-
-		data, err := os.ReadFile("./fixtures/cp-test/cp-folder2/cp-me.txt")
-		assert.NilError(t, err)
-		assert.Equal(t, `hello world from folder`, string(data))
-	})
-}
diff --git a/local/e2e/compose/fixtures/cp-test/cp-folder/cp-me.txt b/local/e2e/compose/fixtures/cp-test/cp-folder/cp-me.txt
deleted file mode 100644
index a97acd87..00000000
--- a/local/e2e/compose/fixtures/cp-test/cp-folder/cp-me.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-hello world from folder
\ No newline at end of file
diff --git a/local/e2e/compose/fixtures/cp-test/cp-me.txt b/local/e2e/compose/fixtures/cp-test/cp-me.txt
deleted file mode 100644
index 95d09f2b..00000000
--- a/local/e2e/compose/fixtures/cp-test/cp-me.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-hello world
\ No newline at end of file
diff --git a/local/e2e/compose/fixtures/cp-test/docker-compose.yml b/local/e2e/compose/fixtures/cp-test/docker-compose.yml
deleted file mode 100644
index f835ebee..00000000
--- a/local/e2e/compose/fixtures/cp-test/docker-compose.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-services:
-  nginx:
-    image:  nginx:alpine
\ No newline at end of file