如何在成功等待脚本

时间:2016-10-04 20:12:31

标签: mysql node.js bash docker

在我启动其他应用之前,我正在使用wait-for-it脚本检查数据库是否已启动。

#!/bin/bash

set -e

host="$1"
shift
cmd="$@"

until psql -h "$host" -U "postgres" -c '\l'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"
exec $cmd

我找到了这个脚本here。 现在我的app-container停止了MySQL is up - executing command。 所以脚本成功了(db正在运行),但我不清楚如何执行我的应用程序的dockerfile中的真实CMD(脚本之后)。

这是我的dockerfile的结尾:

COPY docker-entrypoint.sh /entrypoint.sh
COPY ./wait-for-it.sh wait-for-it.sh
ENTRYPOINT ["/entrypoint.sh"]

EXPOSE 2368
CMD ["npm", "start"]

1 个答案:

答案 0 :(得分:3)

让我们首先澄清一些事情。在Dockerfile中同时使用ENTRYPOINTCMD时,CMD值将作为参数传递给ENTRYPOINT。所以你目前在文件中的内容转换为

/entrypoint.sh npm start

启动容器时执行此操作。在不知道entrypoint.sh中发生了什么的情况下,很难说它有什么影响。

泊坞

您可以进行以下更改,请尝试一下:

  • ENTRYPOINT
  • 中删除Dockerfile
  • CMD更改为以下内容:

    CMD /wait-for-it.sh localhost && /entrypoint.sh npm start
    

执行此操作时,请调整以下内容:

  • wait-for-it.sh的路径 - 请调整到您在Dockerfile中复制脚本文件的位置。我建议您将其复制到与entrypoint.sh相同的文件夹中。
  • localhost脚本文件的wait-for-it.sh参数,请替换为您的数据库主机。

以上操作是运行wait-for-it.sh脚本,然后,一旦数据库启动,它将运行您在ENTRYPOINTCMD中的上一个命令。它应该与你现在拥有的相当。

作为替代方案,您还可以从wait-for-it.sh脚本调用entrypoint.sh脚本,并且只有在等待脚本成功后才运行其他步骤(npm start)。由你决定...

多克尔-撰写

如果您使用Docker-Compose启动容器,则可以使用command文件中的docker-compose.yaml属性覆盖容器启动时执行的命令,例如

command: >
  bash -c "

  /wait-for-it.sh localhost 
  && /entrypoint.sh npm start
  "

请注意

的使用
  • bash -c使用您选择的shell启动多个命令(在本例中为Bash)
  • 引号,你需要它们才能有多行。

使用此方法,您基本上可以将多个命令链接在一起,并使用&&运算符组合它们。

等待它的脚本

BTW:我使用此wait-for-it script用于类似目的,并以与上述相同的方式获得良好结果。它比您的等待脚本版本更强大,并且几乎支持任何主机/端口组合。我用它来等待MySQL - 你的问题不清楚它是关于MySQL还是PostgreSQL。