我想使用Docker运行Apache Zookeeper,插入种子数据(用于测试配置)。我尝试使用启动脚本,如下所示:
Dockerfile
FROM zookeeper:latest
ADD startup.sh .
EXPOSE 2181
CMD ["./startup.sh"]
startup.sh
#!/bin/sh
./bin/zkCli.sh -server localhost:2181 create /foo ""
./bin/zkCli.sh -server localhost:2181 create /foo/bar ""
./bin/zkServer.sh start-foreground
但这不起作用,因为我试图在服务器启动并运行之前插入数据。
如何将启动时具有种子数据的ZooKeeper服务器停靠?
答案 0 :(得分:3)
您可以利用docker-compose
。
docker-compose.yml
version: '2'
services:
zookeeper:
image: zookeeper:latest
restart: always
ports:
- "2181:2181"
zookeeper_setup:
image: zookeeper:latest
depends_on:
- zookeeper
links:
- zookeeper
command: sh /setup/startup.sh
volumes:
- ./:/setup
确保从
./bin/zkServer.sh start-foreground
移除startup.sh
,并将localhost
替换为zookeeper
中的startup.sh
。
然后只需运行docker-compose up
,它将首先启动zookeeper
服务,然后它将使用修改后的命令运行zookeeper_setup
服务。 (确保在startup.sh
服务中)zookeerper_setup
正确挂载目录
如果zookeeper
需要更多时间启动,您可以在sleep 5
中添加startup.sh
(或更多)。
下次,当您不需要使用startup.sh
重新配置时,您可以运行docker-compose up zookeeper
来启动预先配置的zookeeper
服务。
答案 1 :(得分:0)
另一种(可能更简单)的方法是在后台启动Zookeeper,创建节点,停止Zookeeper,然后在前台模式下运行它。
您的startup.sh
可能类似于-
./bin/zkServer.sh start
./bin/zkCli.sh -server localhost:2181 create /foo ""
./bin/zkServer.sh stop
echo "Starting Zookeeper in foreground mode..."
./bin/zkServer.sh start-foreground