Ansible не выполняет "command:" в docker

host: ubuntu 18.04

ansible: 2.9.20

docker-ce: 5:20.10.6~3-0~ubuntu-bionic

    - name: test container
      when:
        - ansible_system == 'Linux'
        - ansible_architecture == 'x86_64'
      become: yes
      docker_container:
        name: test-01
        hostname: ansible-ubuntu-20-04
        image: diodonfrost/ansible-ubuntu:20.04
        volumes:
          - /tmp/roles:/root/.ansible/roles
        output_logs: yes
        state: started
        command: touch /tmp/1
        interactive: yes
        tty: yes

Виртуалка с убунтой, в ней докер, в контейнерах планируется тестить код (абсолютная песочница). Всё создаётся и даже запускается, но результата как-то не вижу. Т.е. touch /tmp/1 висит, но не выполняется:

root@docker-test-01:~# docker container ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS         PORTS     NAMES
fc82da6238a4   diodonfrost/ansible-ubuntu:20.04   "/sbin/init touch /tmp/1…"   6 seconds ago   Up 4 seconds             test-01
root@docker-test-01:~# docker container exec test-01 ls /tmp/
hsperfdata_root
root@docker-test-01:~# 

Запуск из хоста - всё прекрасно отрабатывает:

root@docker-test-01:~# docker container exec -i -t test-01 touch /tmp/1
root@docker-test-01:~# docker container exec test-01 ls /tmp/
1
hsperfdata_root
root@docker-test-01:~# 

Куда копать?

UPD. В ответ на комент:

root@docker-test-01:~# docker container ps -a --format "{{ .Command }}"
"/sbin/init w"

Не, после - тишина.


Ответы (1 шт):

Автор решения: don Rumata

Спасибо @aleksandr barakin за пинок в нужную сторону.

Т.к. стоит задача не просто запускать какой-то код, а запускать именно с целью посмотреть работает он или нет, то было бы неплохо, чтобы нам возвращался именно тот exit, который есть на самом деле. Вот комбинация параметров, которая делает то, что надо:

Тут идёт перезапись ENTRYPOINT ["/sbin/init"] из оригинального файла нашей командой curl. В command, который является обёрткой над CMD передаём параметры к curl и обязательно не забываем про detach: no. Без него ничего работать не будет:

- name: Create test container
  when:
    - ansible_system == 'Linux'
    - ansible_architecture == 'x86_64'
  become: yes
  docker_container:
    name: test-01
    hostname: ansible-ubuntu-20-04
    image: diodonfrost/ansible-ubuntu:20.04
    volumes:
      - /tmp/roles:/root/.ansible/roles
    state: started
    entrypoint: curl
    command: --fail --head "http://example.com/123"
    detach: no

Т.к. файла\каталога 123 нет - сервер нам вернёт 404, --fail скажет curl'у НЕ возвращать exit 0, а вернуть exit 22, а detach: no не будет превращать любой exit от команды в exit 0 самого ансибла. Получаем:

    "msg": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\ncurl: (22) The requested URL returned error: 404 Not Found\n", 
    "status": 22
}

PLAY RECAP *******************************************************************************************************
docker-test-01.local       : ok=4    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

А вот если поменять command: --fail --head "http://example.com/123 на command: --fail --head "http://example.com/, то index.html на сервере будет, нам везде вернут exit 0 и выхлоп ансибла будет соответствующий:

            "volumes_from": null, 
            "working_dir": null
        }
    }
}
META: ran handlers
META: ran handlers

PLAY RECAP *******************************************************************************************************
docker-test-01.local       : ok=5    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

→ Ссылка