使用docker-compose启停服务时如何自动控制宿主机dnsmasq状态
解决方案
首先明确:Docker Compose本身未提供直接操作宿主机系统服务的原生配置,你可以通过以下两种方案实现需求,推荐优先使用第一种更安全的脚本方案。
方案一:使用包装脚本(新手推荐,无额外安全风险)
不需要修改现有的docker-compose.yml,只需在docker-compose.yml所在目录创建两个执行脚本即可:
- 创建启动脚本
start-pihole.sh,内容如下:
#!/bin/bash # 停止宿主机dnsmasq服务(systemd系统通用) sudo systemctl stop dnsmasq # 启动compose服务 docker-compose up -d
- 创建停止脚本
stop-pihole.sh,内容如下:
#!/bin/bash # 停止compose服务 docker-compose down # 重启宿主机dnsmasq服务 sudo systemctl start dnsmasq
- 给两个脚本添加执行权限:
chmod +x start-pihole.sh stop-pihole.sh
后续需要启动服务时执行./start-pihole.sh,停止服务时执行./stop-pihole.sh即可实现你要的自动启停dnsmasq的效果。
如果你的系统不是systemd管理(比如Alpine、Gentoo默认用OpenRC),只需要把脚本中启停dnsmasq的命令替换为对应init系统的命令即可。
方案二:通过容器生命周期钩子实现(无需额外脚本,存在安全风险)
如果不想使用单独的脚本,可以修改docker-compose.yml配置,通过容器的生命周期钩子调用宿主机的服务管理命令,该方案需要给容器开放宿主机systemd的操作权限,仅推荐私人环境使用:
修改后的完整docker-compose.yml如下:
version: "3" services: pihole: container_name: pihole image: pihole/pihole:latest ports: - "53:53/tcp" - "53:53/udp" - "67:67/udp" - "80:80/tcp" - "443:443/tcp" environment: TZ: 'Asia/Kolkata' # 时区配置 volumes: - './etc-pihole/:/etc/pihole/' - './etc-dnsmasq.d/:/etc/dnsmasq.d/' - '/run/systemd/system:/run/systemd/system' # 挂载宿主机systemd套接字 dns: - 127.0.0.1 - 1.1.1.1 cap_add: - NET_ADMIN restart: unless-stopped # 新增生命周期钩子 lifecycle: post_start: exec: command: ["systemctl", "stop", "dnsmasq"] pre_stop: exec: command: ["systemctl", "start", "dnsmasq"]
注意:该方案需要pihole镜像内包含systemctl命令,如果执行报错可以进入容器安装systemd包,或换回方案一使用外部脚本。
内容的提问来源于stack exchange,提问作者brayo
相关产品推荐
相关产品推荐

