加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

mysql-如何在成功等待脚本后启动docker容器

发布时间:2020-12-16 03:24:50 所属栏目:安全 来源:网络整理
导读:在启动其他应用程序之前,我正在使用等待脚本检查数据库是否已启动. #!/bin/bashset -ehost="$1"shiftcmd="$@"until psql -h "$host" -U "postgres" -c 'l'; do 2 echo "Postgres is unavailable - sleeping" sleep 1done2 echo "Postgres is up - executing

在启动其他应用程序之前,我正在使用等待脚本检查数据库是否已启动.

#!/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.
现在我的应用程序容器停止与MySQL一起运行-正在执行命令.
因此脚本成功执行了(db正在运行),但是我不清楚如何执行真实的CMD(在脚本之后),该命令位于应用程序的dockerfile中.

这是我的dockerfile的结尾:

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

EXPOSE 2368
CMD ["npm","start"]
最佳答案
让我们先清理几件事.当您在Dockerfile中同时使用ENTRYPOINT和CMD时,CMD值将作为参数传递给ENTRYPOINT.因此,您当前在文件中所拥有的将转换为

/entrypoint.sh npm start

启动容器时执行.在不知道entrypoint.sh中发生什么情况的情况下,很难说出这有什么影响.

Docker

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

>从Dockerfile中删除ENTRYPOINT.
>将CMD更改为以下内容:

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

这样做时,请调整以下内容:

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

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

或者,您也可以从entrypoint.sh脚本中调用wait-for-it.sh脚本,并且仅运行其他步骤(一旦等待脚本成功,npm start).由你决定…

Docker组合

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

command: >
  bash -c "

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

请注意使用

> bash -c用于使用您选择的外壳启动多个命令(在本例中为Bash)
>引号,则需要多行.

使用此方法,您基本上可以将多个命令彼此链接起来,并使用&&运算符.

等待脚本

顺便说一句:我将wait-for-it script用于类似目的并以与上述相同的方式获得了良好的效果.它比您的等待脚本版本更健壮,并且几乎支持任何主机/端口组合.我用它来等待MySQL-您的问题不清楚是关于MySQL还是PostgreSQL.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读