#docker #salt-stack
#docker #соль-стек
Вопрос:
Я запускаю файл sls, который запускает контейнер docker, который должен оставаться активным в фоновом режиме. Это работает, контейнер запущен. Однако, пока я не уничтожу контейнеры на своих minions, я не могу запускать какие-либо другие команды state.apply, потому что я получаю:
The function "state.apply" is running as PID 44455 and was started at 2020, Aug 19 18:49:13.242099 with jid 20200819184913242099
Теперь я нашел следующую документацию:https://docs.saltstack.com/en/latest/ref/states/parallel.html что подразумевает, что это действительно возможно. Однако, когда я добавляю его в свой файл SLS, он не работает. Я по-прежнему не могу вызвать новое состояние.применяйте, пока я не уничтожу контейнеры.
Вот как выглядит мой файл:
docker.io:
pkg.installed: []
require:
- pkgrepo: docker_prerequisites
- pkg: docker_prerequisites
service.running:
- parallel: True
- name: docker
- enable: True
- restart: True
- image: ubuntu
- port_bindings: 800:80
docker:
cmd.run:
- name: docker run -t ubuntu
Я неправильно использую команду? Вот как я понял, это должно быть основано на документации. Или, возможно, есть другой способ запустить контейнер docker, который остается активным из файла sls?
Ответ №1:
Если вы проверите свои журналы salt или диспетчер процессов, вы, скорее всего, сможете выяснить, что здесь происходит. Состояние выполняется до тех пор, пока выполняется команда. Проблема кроется в вашем cmd.run. Salt выполняет cmd.run до тех пор, пока выполняется содержащаяся в нем команда. Salt выполнит следующий cmd.run только в том случае, если другой cmd.run в данный момент не запущен. В противном случае вы получите указанную вами ошибку.
- name: docker run -t ubuntu
Команда, которую вы использовали, подключила бы оболочку контейнеров. (-t) Поэтому salt ожидает завершения команды. В этом случае команда не завершится, пока вы не закроете оболочку containers.
Решение состоит в том, чтобы отсоединить оболочку контейнеров, чтобы она присутствовала в качестве фонового процесса, и присоединить ее впоследствии.
docker:
cmd.run:
- name: docker run -t -d ubuntu
Просто добавив параметр -d, вы отсоединяете оболочку контейнеров, и контейнер запускается в фоновом режиме. Добавив этот параметр, ваше saltstate должно завершиться.
Теперь, когда контейнер работает в фоновом режиме, вы можете подключиться к оболочке контейнеров с помощью следующей команды:
docker exec -it <container_id> /bin/bash
Однако вот как вы запускаете saltstates параллельно:
При применении saltstate к вашему целевому minion попробуйте добавить следующий параметр к вашей salt или команде salt-call в конце: concurrent=true
Пожалуйста, обратитесь к этой документации и найдите concurrent:https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.state.html
В этой статье описывается проблема. Однако вы должны быть осторожны с этим, поскольку может быть опасно запускать один и тот же модуль salt дважды одновременно. поэтому постарайтесь избежать этого.