Docker 容器自动终止
Docker container terminating automatically
我正在做一个测试 docker-compose 文件到 运行 一个包含三个 mongod 服务器的容器,它们形成一个副本集(一个是主要的,一个是次要的,一个是仲裁者) .
我的 Dockerfile 看起来像:-
FROM mongo:3.6.2
MAINTAINER Shanty
RUN apt-get update && apt-get install -y netcat
COPY ./.docker/mongo_scripts /mongo_scripts
RUN chmod +rx /mongo_scripts/*.sh
EXPOSE 27091 27092 27093
ENTRYPOINT ["/mongo_scripts/rs.sh"]
我的脚本看起来像:-
#!/bin/bash
# shell script to create a simple mongodb replica set (tested on osx)
mkdir -p /mongosvr/rs-0
mkdir -p /mongosvr/rs-1
mkdir -p /mongosvr/rs-2
mongod --dbpath /mongosvr/rs-0 --bind_ip_all --replSet "demo" --port 27091 --pidfilepath /mongosvr/rs-0.pid 2>&1 &
mongod --dbpath /mongosvr/rs-1 --bind_ip_all --replSet "demo" --port 27092 --pidfilepath /mongosvr/rs-1.pid 2>&1 &
mongod --dbpath /mongosvr/rs-2 --bind_ip_all --replSet "demo" --port 27093 --pidfilepath /mongosvr/rs-2.pid 2>&1 &
# wait a bit for the first server to come up
sleep 5
# call rs.initiate({...})
cfg="{
_id: 'demo',
members: [
{_id: 0, host: 'localhost:27091', 'priority':10},
{_id: 1, host: 'localhost:27092'},
{_id: 2, host: 'localhost:27093', arbiterOnly: true}
]
}"
mongo localhost:27091 <<EOF
var cfg={
_id: 'demo',
members: [
{_id: 0, host: 'localhost:27091', 'priority':10},
{_id: 1, host: 'localhost:27092'},
{_id: 2, host: 'localhost:27093', arbiterOnly: true}
]
}
rs.initiate(cfg, { force: true });
EOF
它是一个简单的脚本 运行 连接三个 mongod 服务器,并初始化副本集配置。
但是最后一条命令执行成功后,出现如下
已记录:-
bye
I NETWORK [conn1] end connection 127.0.0.1:55178 (2 connections now open)
我的容器停止了:-
mongodb_rs exited with code 0
我猜它是设置副本集配置的一些问题,之后发送了一些终止命令....
您不应覆盖 Dockerfile 中的 ENTRYPOINT
,因为它可能会为 mongo 团队设置容器做更多工作。尝试用 CMD
替换 ENTRYPOINT
CMD ["/mongo_scripts/rs.sh"]
添加
sh -c /bin/bash
在 bash 脚本的末尾。它将使用新的 pid 启动一个新进程 bash。所以你的容器不会死。
当你的脚本启动一个mongod进程时,它只存在于脚本范围内;所以当脚本结束时,它会关闭每个 mongod 进程。
要使它们持久化,您需要添加 --fork option :
Enables a daemon mode that runs the mongod process in the background. By default mongod does not run as a daemon: typically you will run mongod as a daemon, either by using --fork or by using a controlling process that handles the daemonization process (e.g. as with upstart and systemd).
目前唯一有效的是我在脚本末尾放置了以下命令:-
sleep infinity
我仍然不知道这是否是最好的方法....仍在寻找更好的解决方案,或者解释当前的解决方案是否是最好的....
我正在做一个测试 docker-compose 文件到 运行 一个包含三个 mongod 服务器的容器,它们形成一个副本集(一个是主要的,一个是次要的,一个是仲裁者) .
我的 Dockerfile 看起来像:-
FROM mongo:3.6.2
MAINTAINER Shanty
RUN apt-get update && apt-get install -y netcat
COPY ./.docker/mongo_scripts /mongo_scripts
RUN chmod +rx /mongo_scripts/*.sh
EXPOSE 27091 27092 27093
ENTRYPOINT ["/mongo_scripts/rs.sh"]
我的脚本看起来像:-
#!/bin/bash
# shell script to create a simple mongodb replica set (tested on osx)
mkdir -p /mongosvr/rs-0
mkdir -p /mongosvr/rs-1
mkdir -p /mongosvr/rs-2
mongod --dbpath /mongosvr/rs-0 --bind_ip_all --replSet "demo" --port 27091 --pidfilepath /mongosvr/rs-0.pid 2>&1 &
mongod --dbpath /mongosvr/rs-1 --bind_ip_all --replSet "demo" --port 27092 --pidfilepath /mongosvr/rs-1.pid 2>&1 &
mongod --dbpath /mongosvr/rs-2 --bind_ip_all --replSet "demo" --port 27093 --pidfilepath /mongosvr/rs-2.pid 2>&1 &
# wait a bit for the first server to come up
sleep 5
# call rs.initiate({...})
cfg="{
_id: 'demo',
members: [
{_id: 0, host: 'localhost:27091', 'priority':10},
{_id: 1, host: 'localhost:27092'},
{_id: 2, host: 'localhost:27093', arbiterOnly: true}
]
}"
mongo localhost:27091 <<EOF
var cfg={
_id: 'demo',
members: [
{_id: 0, host: 'localhost:27091', 'priority':10},
{_id: 1, host: 'localhost:27092'},
{_id: 2, host: 'localhost:27093', arbiterOnly: true}
]
}
rs.initiate(cfg, { force: true });
EOF
它是一个简单的脚本 运行 连接三个 mongod 服务器,并初始化副本集配置。 但是最后一条命令执行成功后,出现如下 已记录:-
bye
I NETWORK [conn1] end connection 127.0.0.1:55178 (2 connections now open)
我的容器停止了:-
mongodb_rs exited with code 0
我猜它是设置副本集配置的一些问题,之后发送了一些终止命令....
您不应覆盖 Dockerfile 中的 ENTRYPOINT
,因为它可能会为 mongo 团队设置容器做更多工作。尝试用 CMD
CMD ["/mongo_scripts/rs.sh"]
添加
sh -c /bin/bash
在 bash 脚本的末尾。它将使用新的 pid 启动一个新进程 bash。所以你的容器不会死。
当你的脚本启动一个mongod进程时,它只存在于脚本范围内;所以当脚本结束时,它会关闭每个 mongod 进程。
要使它们持久化,您需要添加 --fork option :
Enables a daemon mode that runs the mongod process in the background. By default mongod does not run as a daemon: typically you will run mongod as a daemon, either by using --fork or by using a controlling process that handles the daemonization process (e.g. as with upstart and systemd).
目前唯一有效的是我在脚本末尾放置了以下命令:-
sleep infinity
我仍然不知道这是否是最好的方法....仍在寻找更好的解决方案,或者解释当前的解决方案是否是最好的....