我正在开发在Docker中部署动态Zookeeper集群。我几乎完成了,但我陷入了一个领域:动态配置参数。我有一个入口点脚本,它读取传递给它的环境变量,关于它自己的ID和其他Zookeeper服务器的IP。
在Zookeeper启动之前,它将它的id写入/tmp/zookeeper/$MYID/myid
,这种情况是1.我还在server.1=$MY_IP:2888:3888
文件中写zoo.cfg
。
如果我尝试使用zkServer.sh start-foreground
启动带有该配置的Zookeeper,则会出错:
root@7f23a5d1e5a1:/# zkServer.sh start-foreground
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
2015-12-15 21:37:35,552 [myid:] - INFO [main:QuorumPeerConfig@109] - Reading configuration from: /opt/zookeeper/bin/../conf/zoo.cfg
2015-12-15 21:37:35,556 [myid:] - ERROR [main:QuorumPeerMain@86] - Invalid config, exiting abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: parameter: server.1 must be in a separate dynamic config file
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:244)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:126)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:110)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79)
Invalid config, exiting abnormally
但是,如果我从server.1=$MY_IP:2888:3888
文件中删除zoo.cfg
,则会出错:
2015-12-15 21:26:38,190 [myid:] - ERROR [main:QuorumPeerMain@98] - Unexpected exception, exiting abnormally
java.lang.RuntimeException: My id 0 not in the peer list
at org.apache.zookeeper.server.quorum.QuorumPeer.start(QuorumPeer.java:643)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:171)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:120)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79)
在reading the docs之后,我仍然不确定我的配置搞砸了。
这是我的zoo.cfg
文件:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
quorumListenOnAllIPs=true
standaloneEnabled=false
dynamicConfigFile=/opt/zookeeper/conf/zoo.cfg.dynamic
server.1=192.168.1.46:2888:3888
这是myid
档案:
root@7f23a5d1e5a1:/# cat /tmp/zookeeper/1/myid
1
如何修复此配置以及它应该是什么样的?我正在使用Zookeeper 3.5.0-alpha。
答案 0 :(得分:0)
由于Dockerfile执行命令的方式,这已得到解决。由于入口点脚本在构建时在容器内部运行,因此它不会读取任何环境变量,因为它们不是作为构建过程的一部分存在的。当入口点脚本作为运行脚本的子进程/步骤运行时 - 在这种情况下,只是一个基本的run.sh
- 在运行时,变量随后被评估为它们作为运行时的一部分存在。