Skip to content

[BUG] --no-interpolate flag on docker compose config has unexpected side effects #13614

@Paraphraser

Description

@Paraphraser

Description

Given the example compose file under "Steps To Reproduce", the result of running:

$ docker compose config --no-normalize --no-path-resolution example1

is:

name: demo
services:
  example1:
    container_name: example1
    environment:
      TZ: Australia/Sydney
    image: example/example
    ports:
      - mode: ingress
        target: 3000
        published: "3001"
        protocol: tcp
    restart: unless-stopped
    volumes:
      - type: bind
        source: ./volumes/example1/data
        target: /var/lib/data
        bind: {}

I have chosen:

  • --no-normalize because it removes references to networks; and
  • --no-path-resolution because it maintains project-relative external paths in volumes: clauses.

The output shows TZ with the value Australia/Sydney (from the .env file). My goal is that that should be displayed in its original form as TZ: ${TZ:-Etc/UTC}.

The --no-interpolate flag is defined as "Don't interpolate environment variables" and seems like a reasonable candidate for achieving this goal. The result of adding that flag is shown in the screen shot in the next section.

The --no-interpolate flag has achieved the expected result with respect to TZ but it has also produced a bunch of unexpected side effects, ranging from relatively unimportant through problematic, none of which would seem to have anything to do with environment variables.

For what I am trying to achieve, the most problematic difference is that the service definition for example2 has appeared in the output. This behaviour suggests that the presence of --no-interpolate causes config to ignore the [SERVICE...] argument.

I assume the name: demo (first line on the left hand side of the screen shot) is the project name. That line disappearing is actually beneficial for what I am trying to achieve but it isn't immediately clear what this has to do with environment variables.

The reverse-ordering of the last three lines of the ports: clause doesn't matter for my purposes. The same applies to the volumes: clause where the ordering and structural differences are just … strange.

Steps To Reproduce

  1. Example compose file:

    ---
    
    services:
    
      example1:
        container_name: example1
        image: example/example
        restart: unless-stopped
        ports:
          - "3001:3000"
        environment:
          TZ: ${TZ:-Etc/UTC}
        volumes:
          - ./volumes/example1/data:/var/lib/data
    
      example2:
        container_name: example2
        image: example/example
        restart: unless-stopped
        ports:
          - "3002:3000"
        environment:
          TZ: ${TZ:-Etc/UTC}
        volumes:
          - ./volumes/example2/data:/var/lib/data
    
    ...
  2. Run:

    $ diff -y \
      <(docker compose config --no-normalize --no-path-resolution                  example1) \
      <(docker compose config --no-normalize --no-path-resolution --no-interpolate example1)
  3. The result is:

    Image

Compose Version

$ docker compose version
Docker Compose version v5.1.0

$ docker-compose version
Docker Compose version v5.1.0

Docker Environment

$ docker info
Client: Docker Engine - Community
 Version:    29.2.1
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.31.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v5.1.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 6
  Running: 6
  Paused: 0
  Stopped: 0
 Images: 6
 Server Version: 29.2.1
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: local
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 CDI spec directories:
  /etc/cdi
  /var/run/cdi
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: dea7da592f5d1d2b7755e3a161be07f43fad8f75
 runc version: v1.3.4-0-gd6d73eb8
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 6.1.21-v8+
 Operating System: Debian GNU/Linux 12 (bookworm)
 OSType: linux
 Architecture: aarch64
 CPUs: 4
 Total Memory: 3.704GiB
 Name: sec-dev
 ID: f6406dbb-2fc1-4834-9606-5e826871aec6
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  ::1/128
  127.0.0.0/8
 Live Restore Enabled: false
 Firewall Backend: iptables

Anything else?

Older cases raising issues with --no-interpolate (eg #13327, #12292, #12079, #11547) all seem to use examples where the compose file only contains a single service definition. While that scenario does show the unexpected re-ordering of clauses that would not seem to be related to environment variables, it won't reveal the issue with the [SERVICE...] argument being ignored.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions