Docker Compose错误 - "wait-for-it.sh: 没有那个文件或目录"

6
我有以下的Docker Compose文件,我正在尝试使用wait-for-it.sh,以便在Kafka broker可用后启动控制中心。
  control-center:
    image: confluentinc/cp-enterprise-control-center
    hostname: control-center
    restart: always
    depends_on:
      - zookeeper
      - kafka
      - schema_registry
      - connect
    command: ["./wait-for-it.sh", "kafka:9092"]

执行docker-compose up时出现以下错误:
无法启动control-center服务:OCI运行时创建失败: container_linux.go:296:启动容器进程导致“exec:“./wait-for-it.sh”:stat ./wait-for-it.sh:没有这样的文件或目录”:未知
我在Windows 10上使用Docker for windows和PowerShell。

看起来默认的镜像里没有那个脚本。https://github.com/confluentinc/cp-docker-images/search?utf8=%E2%9C%93&q=wait-for-it&type= 你是从哪里得到这个脚本名字的? - Alex028502
这个链接中有一个脚本的链接 - https://docs.docker.com/compose/startup-order/ - zooes
我认为你必须使用该脚本构建容器。它不随docker-compose或该容器一起提供。 - Alex028502
你正在使用Docker Compose的YAML版本2还是3? - Alex028502
1个回答

10

./wait-for-it.sh 只能在包含该脚本的镜像中使用。 您可以创建自己的 Dockerfile,扩展 confluentinc/cp-enterprise-control-center 并将包装脚本放在启动命令上。

您可以通过 docker-compose yaml 版本 2,在 kafka 容器上进行健康检查并使用 depends_on 来实现类似的功能。

我认为在 compose 文件版本 3 中这种方法行不通。

控制中心部分的示例如下:

depends_on:
  kafka:
    condition: service_healthy

在kafka部分类似这样的内容:(不确定那个curl命令是否能够正确检查kafka。可能有更好的命令)
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:9092"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s

(来自 https://docs.docker.com/compose/compose-file/compose-file-v2 )

然后也许在顶部加入这个

version: '2.3'

我认为他们在某处说过,Compose文件版本3是专为Docker Swarm设计的,因此不支持此功能。如果您没有使用Docker Swarm,可以继续使用版本2。

...

上述内容都是“如果”等待其他容器启动是您想要做的事情。Docker-compose版本3中depends_on条件形式的替代方案是什么?解释了这可能不再是推荐的做法,因为它无法处理容器重新启动。
我猜这取决于您的Docker Compose设置是用于测试还是生产。

谢谢,这很有帮助。我坚持使用版本2,它起作用了。 - zooes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接