Add Docker Compose v2 exec and run modules. (#969)

This commit is contained in:
Felix Fontein
2024-09-27 13:00:48 +03:00
committed by GitHub
parent d478174786
commit 423a9bbf61
14 changed files with 1078 additions and 2 deletions
@@ -0,0 +1,49 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
####################################################################
# WARNING: These are designed specifically for Ansible tests #
# and should not be used as examples of how to write Ansible roles #
####################################################################
# Create random name prefix (for services, ...)
- name: Create random container name prefix
set_fact:
name_prefix: "{{ 'ansible-docker-test-%0x' % ((2**32) | random) }}"
cnames: []
dnetworks: []
- debug:
msg: "Using name prefix {{ name_prefix }}"
# Run the tests
- block:
- name: Show docker compose --help output
command: docker compose --help
- include_tasks: run-test.yml
with_fileglob:
- "tests/*.yml"
loop_control:
loop_var: test_name
always:
- name: "Make sure all containers are removed"
docker_container:
name: "{{ item }}"
state: absent
force_kill: true
with_items: "{{ cnames }}"
diff: false
- name: "Make sure all networks are removed"
docker_network:
name: "{{ item }}"
state: absent
force: true
with_items: "{{ dnetworks }}"
diff: false
when: docker_has_compose and docker_compose_version is version('2.18.0', '>=')
@@ -0,0 +1,7 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
- name: "Loading tasks from {{ test_name }}"
include_tasks: "{{ test_name }}"
@@ -0,0 +1,104 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
- vars:
pname: "{{ name_prefix }}-start-stop"
cname: "{{ name_prefix }}-container"
project_src: "{{ remote_tmp_dir }}/{{ pname }}"
test_service: |
services:
{{ cname }}:
image: "{{ docker_test_image_alpine }}"
command: '/bin/sh -c "sleep 10m"'
stop_grace_period: 1s
block:
- name: Registering container name
set_fact:
cnames: "{{ cnames + [pname ~ '-' ~ cname ~ '-1'] }}"
dnetworks: "{{ dnetworks + [pname ~ '_default'] }}"
- name: Create project directory
file:
path: '{{ project_src }}'
state: directory
- name: Template default project file
copy:
dest: '{{ project_src }}/docker-compose.yml'
content: '{{ test_service }}'
- block:
- name: Start services
docker_compose_v2:
project_src: '{{ project_src }}'
state: present
- name: Run command with command
docker_compose_v2_run:
project_src: '{{ project_src }}'
service: '{{ cname }}'
command: /bin/sh -c "ls /"
cleanup: true
register: result_1
- name: Run command with argv
docker_compose_v2_run:
project_src: '{{ project_src }}'
service: '{{ cname }}'
argv:
- /bin/sh
- "-c"
- whoami
user: "1234"
cleanup: true
register: result_2
failed_when: result_2.rc != 1
- name: Run detached command
docker_compose_v2_run:
project_src: '{{ project_src }}'
service: '{{ cname }}'
command: /bin/sh -c "sleep 1"
detach: true
cleanup: true
register: result_3
- name: Run command with input
docker_compose_v2_run:
project_src: '{{ project_src }}'
service: '{{ cname }}'
command: /bin/sh -c "cat"
stdin: This is a test
register: result_4
- assert:
that:
- result_1.rc == 0
- result_1.stderr == ""
- >-
"usr" in result_1.stdout_lines
and
"etc" in result_1.stdout_lines
- result_1.container_id is not defined
- result_2.rc == 1
- >-
"whoami: unknown uid 1234" in result_2.stderr
- result_2.stdout == ""
- result_2.container_id is not defined
- result_3.rc is not defined
- result_3.stdout is not defined
- result_3.stderr is not defined
- result_3.container_id is string
- result_4.rc == 0
- result_4.stdout == "This is a test"
- result_4.stderr is string
- result_4.container_id is not defined
always:
- name: Cleanup
docker_compose_v2:
project_src: '{{ project_src }}'
state: absent