community.docker
community.docker copied to clipboard
docker-compose 2.0.0 is no longer written in Python, thus breaking the docker_compose module
SUMMARY
I guess we have to mention in the requirements of the module that it needs docker-compose < 2.0.0. Potentially we either have to adjust the module to also work with docker-compose 2.0.0 and newer, or we have to deprecate it.
ISSUE TYPE
- Bug Report
COMPONENT NAME
docker_compose
CC @aminvakil thanks for reporting this! (BTW the PR you mentioned is unrelated to this.)
Adding a warning and the < 2.0.0 requirement in #217.
Should I expect that this module will be updated to support version 2.0.0 and greater of Compose? I'm trying to figure out if I should rewrite my docker-compose sections of my playbook or just wait for an update.
@dmp1ce that depends on whether someone wants to rewrite the docker_compose module in such a way that it will simply work with the CLI. Right now the module depends on importing the Python code of docker-compose itself, which only works for docker-compose < 2.0.0 since for 2.0.0 docker-compose was rewritten in Go.
This has become a problem on distros that already updated to compose v2, such as Arch Linux. Has anyone started working on a port of the module?
In the meantime I installed v1 from pip in a virtualenv and pointed the PYTHONPATH environment variable to it.
I'm not aware of anyone working on this.
@libricoleur I created my own tasks which copy the docker-compose.yml
to the machine and then run docker-compose
. It looks something like this:
- name: Loop through starting Docker services (manually)
block:
- name: Copy docker-compose templates for each service
ansible.builtin.template:
src: files/docker_services/{{ item.project_name }}.yml.j2
dest: /home/maintenance/docker_services/{{ item.project_name }}/docker-compose.yml
backup: yes
loop: "{{ docker_services }}"
- name: "Update docker service image"
command:
chdir: /home/maintenance/docker_services/{{ item.project_name }}
cmd: docker-compose pull
loop: "{{ docker_services }}"
- name: "Start docker service"
command:
chdir: /home/maintenance/docker_services/{{ item.project_name }}
cmd: docker-compose up -d
loop: "{{ docker_services }}"
when: docker_services is defined
I have a feeling it might be awhile before this issue gets resolved, so I hope this work around helps some people.
related to Future of community.docker in community.docker https://github.com/ansible-collections/community.docker/issues/364
Any updates on this subject ?
Unfortunately nobody wanted to work on this so far, so no, there are no news.
Hi, I am working on create a new compose v2 module by using python on whales (thanks to @gotmax23 for pointing out python-on-whales in #364) - is there any interest in implementing that in community.docker
? Thanks
Since folks have been repeatedly asking for this: yes, there is an interest in that.
(I personally don't think that using python-on-whales is a good idea, since you can also simply run the docker-compose
binary directly without using a third-party library for that and forcing all users of the module to install that library. But since I'm neither writing nor maintaining that module, I don't care that much :) )
For everone interested, there's now a PR: #540
@felixfontein thanks for this PR, I hope to see it merge soon.
Just had a limitation due to docker-compose
. c.f: https://github.com/docker/compose/issues/9505
Funnily enough podman-compose
is what I have now been using with --podman-path docker
and --podman-args compose
such that in invokes docker compose
instead of podman
:D
Apologies for being a bit off-topic, please redirect as appropriate.
I tried using compose, failed, found that v < 2.0, found this.
I just need rudimentary inter-container startup/restart behavior, that will be honored by portainer stacks and and watchtower updates.
Other than using compose, is there another way to specify inter-instance dependencies using the normal container module options?
This is driving me crazy. Has anyone managed to get this to run?
I have installed docker-compose to a virtual env using pip
, but Ansible keeps telling me that there is No module named 'compose'
. I've tried adding the virtual env to my PATH
using the environment
property in my playbook configuration, but it does not help.
@cdauth you have to point ansible to the Python interpreter of that venv - then it should work. (At least for the docker_compose tasks - ansible_python_interpreter
should help here.)
Thanks! This is how I installed the pip module on the server:
- pip:
name: docker-compose
virtualenv: /usr/local/pip
And this is how I configured my task that uses the docker_compose module:
vars:
ansible_python_interpreter: /usr/local/pip/bin/python
You can also add that latter configuration to the playbook itself, but that would mean that the interpreter has to be commented out the first time the machine is bootstrapped (because the interpreter does not exist yet the first time the playbook is run).
@cdauth just to clarify - do you mean that it now works (with what you pasted)? Or do you still have trouble using the module even though you provide ansible_python_interpreter
?
@felixfontein It works, thanks!
@cdauth great! :) Also thanks for documenting it here, this will surely help some others!
The default version of Docker compose on the latest stable Debian (12, bookworm) is also >=2. Thus, the docker_compos
module is also broken on Debian since June.
You can always install docker-compose < 2 by using pip
. And if someone produces a mergable version of a module which supports version 2 (i.e. it supports basic functionality and has tests that pass), I will happily merge that.
You can always install docker-compose < 2 by using
pip
.
Sure, but docker-compose
v1 is EOL as of July this year:
From July 2023 Compose V1 stopped receiving updates. It’s also no longer available in new releases of Docker Desktop.
Reference: https://docs.docker.com/compose/install/linux/
It has already been effectively EOL since May 2021; the last release was 1.29.2 on May 10th, 2019: https://pypi.org/project/docker-compose/
Hello everyone, what if we use the --format json
feature? For example:
$ docker-compose ps --help
Usage: docker compose ps [OPTIONS] [SERVICE...]
List containers
Options:
--format string Format the output. Values: [table | json] (default "table")
It would be nice to add these flags to the docker-compose
project in the other commands to retrieve the state, for example, for the up
command, like this
docker-compose up --format json
And docker-compose
should return JSON with the state of all running containers.
This is what I use:
`
-
name: Stop current apps command: cmd: sudo docker compose down
-
name: Start new apps command: cmd: sudo docker compose up -d `
Just use the following and save your time:
- name: Start services shell: docker-compose up -d
You can always install docker-compose < 2 by using
pip
. And if someone produces a mergable version of a module which supports version 2 (i.e. it supports basic functionality and has tests that pass), I will happily merge that.
I current have a qnap device which only come with docker compose v2. Installing docker-compose failed due to an issue with PyYAML6 and Cython 3 incombination with python 3.10 which seems to work in python 3.12. However the qnap has not yet released python3.12.
In other words docker-compose v1 is no longer supported on this device.
I don't want to complain but it means it's no longer always guaranteed you can install docker compose v1 since it's EOL.