docker - 是否可以并行运行 sls 文件?
问题描述
我正在运行一个 sls 文件,该文件启动一个应该在后台保持活动状态的 docker 容器。它确实有效,容器已启动并正在运行。但是,在我杀死我的仆从上的容器之前,我无法运行任何其他 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 文件时,它不起作用。在我杀死容器之前,我仍然无法调用新的 state.apply。这是我的文件的样子:
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
我是否使用错误的命令?这就是我认为它应该基于文档的方式。或者是否有可能有不同的方法来启动一个从 sls 文件保持活动状态的 docker 容器?
解决方案
如果你检查你的盐日志或你的进程管理器,你很可能会发现这里发生了什么。只要命令运行,状态就会运行。问题出在您的 cmd.run 中。只要其中的命令正在执行,Salt 就会执行 cmd.run。如果当前没有其他 cmd.run 正在运行,Salt 只会执行下一个 cmd.run。否则你会得到你提到的错误。
- name: docker run -t ubuntu
您使用的命令将附加容器外壳。(-t) 因此 salt 正在等待命令结束。在这种情况下,在您关闭容器外壳之前,该命令不会结束。解决方案是,分离容器外壳,使其作为后台进程存在,然后附加它。
docker:
cmd.run:
- name: docker run -t -d ubuntu
只需添加 -d 参数即可分离容器外壳,容器在后台运行。通过添加此参数,您的盐态应该完成。
现在,当容器在后台运行时,您可以使用以下命令将自己附加到容器外壳:
docker exec -it <container_id> /bin/bash
但是,这是您并行运行 saltstates 的方式:
将 saltstate 应用到目标 minion 时,请尝试将以下参数添加到您的 salt 或 salt-call 命令的末尾:concurrent=true
请参考本文档并搜索并发:https ://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.state.html
这篇文章描述了这个问题。但是,您应该小心,因为同时运行相同的盐模块两次可能很危险。所以尽量避免这种情况。
推荐阅读
- c# - Unity 引擎绑定重定向
- postgresql - 为什么我的带有 jsonb 的 UPDATE 查询会弹出错误?
- python - Spacy:如何确定过度拟合的参数?
- django - Django 路由 - 空路径与这些中的任何一个都不匹配
- mongodb - 当文档嵌套不同时检查键名/仅在“父”存在时检查嵌套属性
- python - 用芹菜提交任务的快速方法?
- asp.net - 如何强制未编码的 url 在用户浏览器中显示?
- sql - 查询一年\月\周\日完成的平均请求数
- graphql - 如何在全球范围内捕获和修改阿波罗响应?
- javascript - 如何使计时器在特定时间后达到特定值?