containers / containers/podman-compose
podman-compose fails to gracefully handle reusing a shared service dependency
- Dominant language
- Python
- Stars
- 6.2k
- Forks
- 622
- PR merge metrics
- No merged PRs in 30d
Description
**Describe the bug**
The issue arises with podman-compose when attempting to reuse a dependency service without raising an error.
The scenario involves a docker-compose.yml file specifying services where app1service and app2service both rely on databaseservice,
which acts like a singleton SQL database.
**To Reproduce**
We have a compose file like this:
```
version: '3'
services:
databaseservice:
image: localhost/database
container_name: databasecontainer
app1service:
image: localhost/app1
container_name: app1container
depends_on:
- databaseservice
app2service:
image: localhost/app2
container_name: app2container
depends_on:
- databaseservice
```
The desired sequence involves starting app1service first and optionally app2service later. However, initiating the second service triggers an error despite the functionality technically working.
Create the compose file, Dockerfile and build the images.
```
FROM alpine:latest
CMD sleep infinity
```
```
podman build . --tag localhost/database
podman build . --tag localhost/app1
podman build . --tag localhost/app2
```
First start only "app1". This successfully starts app1service along with the corresponding databaseservice.
```
podman-compose run -d --name app1container --rm app1service
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 4.6.2
** excluding: {'app2service', 'app1service'}
['podman', 'ps', '--filter', 'label=io.podman.compose.project=compose_test_dependency', '-a', '--format', '{{ index .Labels "io.podman.compose.config-hash"}}']['podman', 'network', 'exists', 'compose_test_dependency_default']
['podman', 'network', 'create', '--label', 'io.podman.compose.project=compose_test_dependency', '--label', 'com.docker.compose.project=compose_test_dependency', 'compose_test_dependency_default']
['podman', 'network', 'exists', 'compose_test_dependency_default']
podman run --name=databasecontainer -d --label io.podman.compose.config-hash=79de89e53ace2c82075765b0ac5e4f9b964fa40392c6bb6acee591c1d438fa63 --label io.podman.compose.project=compose_test_dependency --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@compose_test_dependency.service --label com.docker.compose.project=compose_test_dependency --label com.docker.compose.project.working_dir=/mnt/c/Users/edwin/Desktop/compose_test_dependency --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=databaseservice --net compose_test_dependency_default --network-alias databaseservice localhost/database
bfe8f22b138ac083f0879f74c4fdc18628ba31aecad03157d59dc4178eb693b0
exit code: 0
** skipping: app1container
** skipping: app2container
['podman', 'network', 'exists', 'compose_test_dependency_default']
podman run --name=app1container -d --requires=databasecontainer --label io.podman.compose.config-hash=79de89e53ace2c82075765b0ac5e4f9b964fa40392c6bb6acee591c1d438fa63 --label io.podman.compose.project=compose_test_dependency --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@compose_test_dependency.service --label com.docker.compose.project=compose_test_dependency --label com.docker.compose.project.working_dir=/mnt/c/Users/edwin/Desktop/compose_test_dependency --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=app1service --net compose_test_dependency_default --network-alias app1service --tty localhost/app1
9f2596bd1406835283a76010f1189ebb9f6885bc6ec67886d8409a80f1bff6c0
exit code: 0
```
Now we start app2. It also want to create a new instance of the database service.
```
podman-compose run -d --name app2container --rm app2service
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 4.6.2
** excluding: {'app2service', 'app1service'}
['podman', 'ps', '--filter', 'label=io.podman.compose.project=compose_test_dependency', '-a', '--format', '{{ index .Labels "io.podman.compose.config-hash"}}']
['podman', 'network', 'exists', 'compose_test_dependency_default']
podman run --name=databasecontainer -d --label io.podman.compose.config-hash=79de89e53ace2c82075765b0ac5e4f9b964fa40392c6bb6acee591c1d438fa63 --label io.podman.compose.project=compose_test_dependency --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@compose_test_dependency.service --label com.docker.compose.project=compose_test_dependency --label com.docker.compose.project.working_dir=/mnt/c/Users/edwin/Desktop/compose_test_dependency --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=databaseservice --net compose_test_dependency_default --network-alias databaseservice localhost/database
Error: creating container storage: the container name "databasecontainer" is already in use by bfe8f22b138ac083f0879f74c4fdc18628ba31aecad03157d59dc4178eb693b0. You have to remove that container to be able to reuse that name: that name is already in use
exit code: 125
podman start databasecontainer
exit code: 0
** skipping: app1container
** skipping: app2container
['podman', 'network', 'exists', 'compose_test_dependency_default']
podman run --name=app2container -d --requires=databasecontainer --label io.podman.compose.config-hash=79de89e53ace2c82075765b0ac5e4f9b964fa40392c6bb6acee591c1d438fa63 --label io.podman.compose.project=compose_test_dependency --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@compose_test_dependency.service --label com.docker.compose.project=compose_test_dependency --label com.docker.compose.project.working_dir=/mnt/c/Users/edwin/Desktop/compose_test_dependency --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=app2service --net compose_test_dependency_default --network-alias app2service --tty localhost/app2
e8673045267a4d25d7777405bae21ed25da83266a6da721b882dd9b0f6338215
exit code: 0
```
Attempting to start "app2" leads to an error as it tries to create a new instance of databaseservice that already exists.
Comparatively, Docker Compose handles the dependencies without errors. For instance:
```
docker build . --tag localhost/database
docker build . --tag localhost/app1
docker build . --tag localhost/app2
```
First start only "app1"
```
docker compose run -d --name app1container --rm app1service
[+] Creating 2/2
✔ Network compose_test_dependency_default Created 0.1s
✔ Container databasecontainer Created 0.1s
[+] Running 1/1
✔ Container databasecontainer Started 0.7s
82e10524d5659cf6d7d3ca4404ae8897ee5dee96caccf323e50dc1c3430b4676
```
This also starts the expected "databaseservice" dependency.
Now we also want to start app2. It does not try to start another database service.
```
docker compose run -d --name app2container --rm app2service
[+] Creating 1/0
✔ Container databasecontainer Running 0.0s
475624fe82fbfc1ee321d639b991df0f4293083b6d9c9aa0a06445d5eb450ee8
```
**Environment:**
- OS: WSL
- podman version: 4.6.2
- podman compose version: 1.0.6
Contributor guide
Assessment
This issue has not been assessed yet.