【发布时间】:2020-03-16 07:58:05
【问题描述】:
我创建了一个systemd 服务,它使用 Docker-Compose 启动一组 Docker 容器,如this answer 中所述:
# /etc/systemd/system/docker-compose-app.service
[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
这允许我使用 Docker-Compose 服务启动
sudo systemctl start docker-compose-app
在后台使用docker-compose up -d,并使用
sudo systemctl stop docker-compose-app
使用docker-compose down。请注意,down 命令在没有-v 标志的情况下运行,这意味着卷将保持原位,在重新启动/重新创建时保留我的容器的数据。在大多数情况下,这几乎是我想要的。
在某些情况下,我想擦除服务中的所有数据,基本上是运行down -v 命令而不是仅仅运行down。
有没有办法扩展上述systemd 服务定义以允许额外的命令(或使用现有的systemctl 命令之一),如果需要,我可以偶尔运行down -v。如果需要,我想临时执行此操作,而不是计划或类似的操作。
我该如何运行
docker-compose down -v
偶尔如果需要通过相同的systemd 设置,同时保持跨重启维护容器数据的标准功能?
【问题讨论】:
-
出于好奇,为什么不直接使用 compose 来处理生命周期,例如是否能够自动启动撰写“服务”?
-
不确定我理解你的意思。你能详细说明一下吗?我有另一个 systemd 服务,它依赖于 docker-compose 启动的容器,因此需要确保 docker-compose 在服务器启动时启动。我认为使用 systemd 来启动容器很方便。总的来说效果很好,但后来出现了关于
down -v的问题...... -
您解释了为什么需要这样做:)。一旦我使用了容器,我会尝试将它一直保持在容器中。翻译:如果可以的话,我不会让操作系统服务依赖于容器中的某些东西。
-
是的 - 这是一个开发服务器,不会对生产做同样的事情......另一个驱动因素是我想通过 Ansible 自动化这个,
systemd服务被 Ansible 很好地理解.如果需要,我可能只需要通过 Ansible 的shell模块运行普通的docker-compose down -v,其他所有内容都保留在systemd中以处理服务器重启......
标签: docker docker-compose systemd