如何使我的Docker组合“等待它”脚本调用原始容器ENTRYPOINT或CMD?

根据Controlling startup order in Compose,可以使用“wait-for-it”脚本来控制Docker Compose启动集装箱的顺序.脚本wait-for-it.sh希望host:port参数以及脚本在端口可用时执行的命令.文档建议Docker Compose使用entrypoint:选项来调用此脚本.但是,如果使用此选项,容器将不再运行其默认的ENTRYPOINT或CMD,因为entrypoint:覆盖默认值.

如何将这个默认命令提供给wait-for-it.sh,以便脚本可以在满足等待条件时调用默认的ENTRYPOINT或CMD?

在我的情况下,我已经实现了一个等待文件存在的临时文件wait-for-file.sh:

#!/bin/bash

set -e

waitFile="$1"
shift
cmd="$@"

until test -e $waitFile
do
  >&2 echo "Waiting for file [$waitFile]."
  sleep 1
done

>&2 echo "Found file [$waitFile]."
exec $cmd

Docker Compose调用wait-for-file.sh作为从tomcat:8-jre8派生的轻微定制容器的入口点:

  platinum-oms:
    image: opes/platinum-oms
    ports:
      - "8080:8080"
    volumes_from:
      - liquibase
    links:
      - postgres:postgres
      - activemq:activemq
    depends_on:
      - liquibase
      - activemq
    entrypoint: /wait-for-file.sh /var/run/liquibase/done

在成功退出之前,另一个定制容器liquidibase会创建/ var / run / liquibase / done,因此铂金有效地等待容器液位完成.

一旦container liquibase创建文件/ var / run / liquibase / done,wait-for-file.sh打印Found文件[/ var / run / liquibase / done],但未能调用基本容器tomcat中的默认命令catalina.sh run:8- jre8.为什么?

测试场景

我创建了一个简化的测试场景docker-compose-wait-for-file来演示我的问题.容器ubuntu-wait-for-file等待容器ubuntu-create-file创建文件/等待/完成,然后我期望容器ubuntu-wait-for-file调用默认的ubuntu容器命令/ bin / bash,它退出.为什么不按照我的预期工作?

最佳答案

However, if one uses this option, the container will no longer run its default ENTRYPOINT or CMD command because entrypoint: overrides the default.

这是预期的,这就是为什么wait-for-it被作为一个包装脚本.
它允许执行“子命令”:

wait-for-it.sh host:port [-s] [-t timeout] [-- command args]
                                               ^^^^^^^^^^^^

The subcommand will be executed regardless if the service is up or not.
If you wish to execute the subcommand only if the service is up, add the --strict argument.

这意味着您的图像的CMD部分可以用于您的实际容器命令,因为其参数将通过参数传递到ENTRYPOINT命令:

entrypoint: wait-for-it.sh host:port --
cmd: mycmd myargs

这应该工作…除了docker-compose issue 3140(the comments the comments提到)

entrypoint defined in docker-compose.yml wipes out CMD defined in Dockerfile

转载注明原文:如何使我的Docker组合“等待它”脚本调用原始容器ENTRYPOINT或CMD? - 代码日志