将参数传递给 ENTRYPOINT 会导致容器无限期地启动和运行

问题描述 投票:0回答:1

这是

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"]

而且它也不起作用。

docker-compose cassandra command-line-arguments
1个回答
0
投票

在我看来,你把事情变得比需要的更复杂了。例如,您不需要运行 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
。干杯!

© www.soinside.com 2019 - 2024. All rights reserved.