向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
相关产品推荐
相关产品推荐

