在我启动其他应用之前,我正在使用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"]
答案 0 :(得分:3)
让我们首先澄清一些事情。在Dockerfile中同时使用ENTRYPOINT
和CMD
时,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
脚本,然后,一旦数据库启动,它将运行您在ENTRYPOINT
和CMD
中的上一个命令。它应该与你现在拥有的相当。
作为替代方案,您还可以从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)使用此方法,您基本上可以将多个命令链接在一起,并使用&&
运算符组合它们。