You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向ENTRYPOINT传递参数导致Docker容器无限等待的问题求助

向ENTRYPOINT传递参数导致Docker容器无限等待的问题求助

大家好,我遇到了一个Docker容器启动时的奇怪问题,想请各位帮忙排查一下。

我用Docker Compose部署了两个Cassandra相关的容器:db_cassandra作为核心数据库服务,remote_cassandra负责远程连接它并执行数据库初始化脚本。

首先放一下我的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"

现在问题来了:当我通过Dockerfile的CMD或者ENTRYPOINT传递db_cassandra这个参数时,容器创建后就一直无限等待,卡在“waiting for db_cassandra to be up...”的循环里。

但如果我把脚本里的参数硬编码,去掉DB_CONTAINER="$1"这一行,直接把$DB_CONTAINER替换成db_cassandra,脚本就可以正常运行,能顺利连接到db_cassandra并执行初始化:

#!/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"

我还尝试过把Dockerfile改成下面这种写法,结果还是不行:

ENTRYPOINT ["/cassandra-setup.sh"]
CMD ["db_cassandra"]

有没有大佬能帮我分析一下,为什么传递参数的方式会导致脚本无法正确识别目标容器,一直处于等待状态呢?

备注:内容来源于stack exchange,提问作者Pricey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 12:43:02