gpt4 book ai didi

docker - systemd 在开始下一个服务单元之前不等待我的服务单元完成

转载 作者:行者123 更新时间:2023-12-02 11:41:28 24 4
gpt4 key购买 nike

这是我的两个单位:

 - name: percona_db.service
command: start
enable: true
content: |
[Unit]
Description=Percona db
After=docker.service
Requires=docker.service

[Service]
ExecStartPre=/bin/bash -c '/usr/bin/docker start -a mysql_datastore || /usr/bin/docker run -d -v /var/lib/mysql --name mysql_datastore -p 23:23 busybox'
ExecStart=/bin/bash -c '/usr/bin/docker start -a mypercona || /usr/bin/docker run -i -t --volumes-from mysql_datastore --name="mypercona" -p 3306:3306 --rm percona'
ExecStop=/usr/bin/docker stop mypercona

[Install]
WantedBy=multi-user.target
- name: php_fpm.service
command: start
enable: true
content: |
[Unit]
Description=php fpm
After=percona_db.service
Requires=percona_db.service

[Service]
ExecStart=/bin/bash -c '/usr/bin/docker start -a myphpfpm_53 || /usr/bin/docker run --name myphpfpm_53 -dit -p 9000:9000 --link mypercona:db phpfpm_53'
ExecStop=/usr/bin/docker stop myphpfpm_53

[Install]
WantedBy=multi-user.target

我的问题如下:percona_db.service 启动的 docker 容器有时需要很长时间才能加载(如果是第一次加载,它将创建 db 并添加数据,可能需要一些时间)。当我将 php_fpm 服务链接在一起时,它需要 percona 服务来启动。而且,即使我指定:

 After=percona_db.service
Requires=percona_db.service

systemd 尝试在 percona_db 服务完成之前启动 phpfpm 服务,并抛出错误,指出 percona 容器不存在:/。

我做错了什么?或者我能做些什么来让它发挥作用? (也许人为地让phpfpm服务等待?用systemd可以吗?)

谢谢!

最佳答案

每个 .service 文件都有一个 Type=[1] 字段。 Type= 字段告诉 systemd 何时应该接受您的服务已准备就绪,以便可以启动后续服务。

您尚未在服务文件的 [Service] 部分下指定 Type=。因此,systemd 设置了默认类型 Type=simple。在简单的情况下,systemd 将启动由 ExecStart 指定的进程,并假设一切都会正常进行。此时,systemd 认为您的服务已准备就绪。

您需要在 percona_db.service 中设置 Type=oneshot。

[1] - http://www.freedesktop.org/software/systemd/man/systemd.service.html

关于docker - systemd 在开始下一个服务单元之前不等待我的服务单元完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26052095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com