当我在下面使用docker创建MongoDB容器时,这个图像是我基于centos的MongoDB映像。使用码头是否能安全停止单神进程?我了解到,停靠器停止命令将发送一个SIGTERM信号给PID 1的进程,但我不确定在当前情况下,单神进程是否能够接收到它,因为从下面的情况来看,单神的PID是9。
mongodb:
image: mongo:centos
command: sh /home/mongo/scripts/compose/noauth.sh 27017
hostname: mongodb
ports:
- 27017:27017
volumes:
- /home/mongo/mongo_data:/home/mongo/mongo_data
- /home/mongo/mongo_log:/home/mongo/mongo_log这是noauth.sh的脚本
#!/bin/bash
if [ ! -d /home/mongo/mongo_data/data_$2/ ];then
mkdir -p /home/mongo/mongo_data/
fi
/home/mongo/mongo_server/bin/mongod --shardsvr --fork --dbpath /home/mongo/mongo_data/ --bind_ip 0.0.0.0 --port $1这是容器中的过程。
UID PID PPID C STIME TTY TIME CMD
mongo 1 0 0 Jun16 ? 00:00:58 sh /home/mongo/scripts/compose/noauth.sh 27017
mongo 9 1 0 Jun16 ? 01:03:58 /home/mongo/mongo_server/bin/mongod --shardsvr --fork --dbpath /home/mongo/mongo_data/ --bind_ip 0.0.0.0发布于 2022-06-23 13:15:29
您希望避免在docker exec ps输出中使用pid 1的shell脚本包装。最简单的方法是使用shell exec内置,它用正在运行的程序替换脚本。
#!/bin/sh
# ^^ prefer plain `sh` when an option
# v make sure to quote strings v
if [ ! -d "/home/mongo/mongo_data/data_$2" ]; then
mkdir -p /home/mongo/mongo_data
fi
#vvv this `exec` removes the shell wrapper
exec /home/mongo/mongo_server/bin/mongod \
--shardsvr \
--fork \
--dbpath /home/mongo/mongo_data \
--bind_ip 0.0.0.0 \
--port "$1"您不需要在撰写sh中显式地命名command:解释器。(这些路径似乎并不是Docker Hub mongo image使用的路径;如果这是一个自定义映像,则将其作为图像的CMD而不是组合覆盖。)
完成此操作后,您应该在docker-compose exec mongodb ps -ef时将数据库视为pid 1,然后它将正常地接收docker stop信号。
https://stackoverflow.com/questions/72729546
复制相似问题