这是
docker-compose.yml
文件:
version: "3"
services:
db_cassandra:
container_name: db_cassandra
image: cassandra:latest
volumes:
- "./common/cassandra:/lua/cassandra_setup:rw"
environment:
WORKSPACE: "/tmp"
SERVICES_ROOT_DIR: "/services_root"
healthcheck:
test: ["CMD", "cqlsh", "-u", "cassandra", "-p", "cassandra" ]
interval: 5s
timeout: 5s
retries: 60
ports:
- "9042:9042"
remote_cassandra:
container_name: remote_cassandra
build:
context: ../.
dockerfile: ./it/remote_cassandra/Dockerfile
args:
BASE_IMAGE: cassandra:latest
depends_on:
dd_cassandra:
condition: service_healthy
volumes:
- "./common/cassandra:/lua/cassandra_setup:rw"
environment:
WORKSPACE: "/tmp"
SERVICES_ROOT_DIR: "/services_root"
这是
remote_cassandra/Dockerfile
:
ARG BASE_IMAGE
FROM ${BASE_IMAGE}
COPY ./it/common/cassandra/cassandra-setup.sh /
RUN chmod +x /cassandra-setup.sh
CMD ["/cassandra-setup.sh", "db_cassandra"]
remote_cassandra
远程连接到 db_cassandra
服务并执行某些查询。
以下是
cassandra-setup.sh
脚本的样子:
#!/bin/bash
#code that creates schema.cql
.
.
.
DB_CONTAINER="$1"
while ! cqlsh $DB_CONTAINER 9042 -e 'describe cluster' ; do
echo "waiting for db_cassandra to be up..."
sleep .5
done
cqlsh $DB_CONTAINER 9042 -f "${WORKSPACE}/schema.cql"
当我将“dd_cassandra”作为参数传递给 ENTRYPOINT 时,docker 容器被创建,之后什么也没有发生,它们会无限期地等待。
但是,如果我不传递参数并简单地将其硬编码在
cassandra-setup.sh
脚本中,如下所示,那么事情就会顺利进行:
#!/bin/bash
#code that creates schema.cql
.
.
.
while ! cqlsh db_cassandra 9042 -e 'describe cluster' ; do
echo "waiting for db_cassandra to be up..."
sleep .5
done
cqlsh db_cassandra 9042 -f "${WORKSPACE}/schema.cql"
我也尝试过:
ENTRYPOINT ["/cassandra-setup.sh"]
CMD ["db_cassandra"]
而且它也不起作用。
在我看来,你把事情变得比需要的更复杂了。例如,您不需要运行 cqlsh 来检查 Cassandra 是否可运行。
我建议简单地检查 Cassandra 是否正在侦听 CQL 端口上的客户端连接,使用像
netstat
: 这样简单的方法
healthcheck:
test: ["CMD-SHELL", "netstat -ltn | grep -q 9042"]
cqlsh 是一个成熟的应用程序,因此运行成本很高。另一方面,
netstat
是本机 Linux 命令,因此它使用更少的资源且速度更快。
也无需仅仅为了运行 cqlsh 就启动另一个带有 Cassandra 映像的容器。相反,请考虑使用
nuvo/docker-cqlsh
。使用起来要简单得多,您需要做的就是创建一个 /scripts
目录,将 CQL 文件放入其中,docker-cqlsh
将自动运行它。
就您而言,您的
Dockerfile
看起来像:
services:
cassandra:
container_name: cassandra
image: cassandra:latest
...
healthcheck:
test: ["CMD-SHELL", "netstat -ltn | grep -q 9042"]
...
cqlsh:
container_name: cqlsh
image: nuvo/docker-cqlsh:latest
depends_on:
cassandra:
condition: service_healthy
...
volumes:
- "/path/to/setup:/scripts"
请注意,您需要配置环境变量
CQLVERSION
、CQLSH_HOST
和 CQLSH_PORT
。干杯!