Skip to content

podman-compose incorrectly solving service dependencies #462

@diodakus

Description

@diodakus

Describe the bug
At the beginning I would thank you for developing podman-compose.

podman-compose does not correctly resolve extended services dependency from extends tag.
I have in example docker-compose.yml file below dependencies (see Reproduce steps):
ci-dev-bash2 (depends from) <- ci-dev-bash <- bash
and in the same file:
other-bash (depends from) <- bash.
I've added to every compose service unique mount to /tmp and check what podman command generated by podman-compose. I checked what mounts were added to every service from file.

To Reproduce
Steps to reproduce the behavior:

  1. create docker-compose.yml file according below content:
version: '3.5'
services:
  bash:
    cap_add:
      - NET_ADMIN
      - SYSLOG
    command: [/bin/bash]
    domainname: ${HOSTNAME}
    environment:
      - USER_HOME=${HOME}
      - USER_NAME=${USER}
    hostname: myhostname
    image: ubuntu:latest
    network_mode: host
    security_opt:
      - seccomp:unconfined
    volumes:
      - /tmp/service_bash:/tmp/service_bash:rw

  ci-dev-bash:
    extends:
      service: bash
    volumes:
      - /tmp/service_ci-dev-bash:/tmp/service_ci-dev-bash:rw

  ci-dev-bash2:
    extends:
      service: ci-dev-bash
    volumes:
      - /tmp/service_ci-dev-bash2:/tmp/service_ci-dev-bash2:rw

  other-bash:
    extends:
      service: bash
    volumes:
      - /tmp/service_other-bash:/tmp/service_other-bash:rw
  1. run command: podman-compose run --rm --no-deps other-bash bash

Expected behavior

podman run --name=slawek_other-bash_tmp13814 \
  --rm -i --pod=pod_slawek --security-opt seccomp=unconfined \
  --label io.podman.compose.config-hash=23e6f025107a42496abbad6d2b740fd8fd42bc4e18eadafa64614c3b879411da --label io.podman.compose.project=slawek --label io.podman.compose.version=1.0.4 --label com.docker.compose.project=slawek --label com.docker.compose.project.working_dir=/home/slawek --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=other-bash \
  --cap-add NET_ADMIN --cap-add SYSLOG -e USER_HOME=/home/slawek -e USER_NAME=slawek \
  **-v /tmp/service_bash:/tmp/service_bash:rw -v /tmp/service_other-bash:/tmp/service_other-bash:rw** \
  --network host --hostname myhostname --tty ubuntu:latest bash

I expected for podman-compose service "other-bash" to have mounts only from "bash" and "other-bash" (result of correct solving services dependency):

  • _/tmp/service_bash:/tmp/service_bash_ (bash)
  • _/tmp/service_other-bash:/tmp/service_other-bash_ (other-bash)

Actual behavior

podman run \
  --name=slawek_other-bash_tmp13814 --rm -i --pod=pod_slawek --security-opt seccomp=unconfined \
  --label io.podman.compose.config-hash=23e6f025107a42496abbad6d2b740fd8fd42bc4e18eadafa64614c3b879411da --label io.podman.compose.project=slawek --label io.podman.compose.version=1.0.4 --label com.docker.compose.project=slawek --label com.docker.compose.project.working_dir=/home/slawek --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=other-bash \
  --cap-add NET_ADMIN --cap-add SYSLOG -e USER_HOME=/home/slawek -e USER_NAME=slawek \
  -v /tmp/service_bash:/tmp/service_bash:rw **-v /tmp/service_ci-dev-bash:/tmp/service_ci-dev-bash:rw** -v /tmp/service_other-bash:/tmp/service_other-bash:rw **-v /tmp/service_ci-dev-bash2:/tmp/service_ci-dev-bash2:rw** \
  --network host --hostname myhostname --tty ubuntu:latest bash

podman-compose added to service "other-bash" incorrectly mounts from services what are not in dependency chain:

  • _/tmp/service_ci-dev-bash:/tmp/service_ci-dev-bash_ (**incorrect** - from **ci-dev-bash**)
  • _/tmp/service_ci-dev-bash2:/tmp/service_ci-dev-bash2_ (**incorrect** - from **ci-dev-bash2**).

& correct content from dependency:

  • _/tmp/service_bash:/tmp/service_bash_ (**bash**)
  • _/tmp/service_other-bash:/tmp/service_other-bash_ (**other-bash**)

It looks that podman-compose read all services information from docker-compose.yml and during run service with dependency adding information from all services inside docker-compose.yml even that what is not in dependency chain.

Output

$ podman-compose version # Version from 25.03.2022
podman-compose version: 1.0.4
['podman', '--version', '']
using podman version: 3.4.2
podman-composer version 1.0.4
podman --version 
podman version 3.4.2
exit code: 0

$ podman-compose up
I do not use "up" parameter. Only "run".

Environment:

  • OS: Rocky Linux release 8.5 (Green Obsidian)
  • podman version: 3.4.2
  • podman compose version: (git hex) ebb3dfe

Additional context

Similar problem is visible for run below command:
podman-compose run --rm --no-deps bash bash

Podman does not depends from anything but mount from other services is added - but shouldn't:

podman run \
  --name=slawek_bash_tmp46399 --rm -i --pod=pod_slawek --security-opt seccomp=unconfined \
  --label io.podman.compose.config-hash=23e6f025107a42496abbad6d2b740fd8fd42bc4e18eadafa64614c3b879411da --label io.podman.compose.project=slawek --label io.podman.compose.version=1.0.4 --label com.docker.compose.project=slawek --label com.docker.compose.project.working_dir=/home/slawek --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=bash \
  --cap-add NET_ADMIN --cap-add SYSLOG -e USER_HOME=/home/slawek -e USER_NAME=slawek \
  -v /tmp/service_bash:/tmp/service_bash:rw **-v /tmp/service_ci-dev-bash:/tmp/service_ci-dev-bash:rw -v /tmp/service_other-bash:/tmp/service_other-bash:rw -v /tmp/service_ci-dev-bash2:/tmp/service_ci-dev-bash2:rw** \
  --network host --hostname myhostname --tty ubuntu:latest bash

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions