使用 Docker compose 文件时,可能只需要运行一次特定命令,通常是在初始设置期间一个应用程序的。当应用程序依赖于需要初始化的数据库时,就会出现此要求,并且初始化只能在第一次运行时发生。
在这种情况下,用户打算执行命令 ./my-project -设置将必要的信息添加到数据库中。为此,建议将入口点脚本合并到容器中。
入口点脚本提供了一种在启动主应用程序之前执行自定义命令的机制。在入口点脚本中,可以检查数据库是否已初始化。如果需要初始化,脚本可以执行设置步骤。
这种方法确保初始化命令只执行一次,即使容器重新启动或服务扩展。
要实现此解决方案,请修改 docker-compose.yml 文件以在 my_project 服务定义中包含以下脚本:
services: my_project: build: . volumes: - data:/app ports: - "6060:8080" depends_on: - mongo entrypoint: ["/app/entrypoint.sh"]
在本例中,data 是包含应用程序代码的卷,entrypoint.sh 是入口点脚本。
创建一个entrypoint.sh脚本,内容如下:
#!/bin/bash # Check if database is initialized. mongo mongo://admin:admin@mongo:27017/my_project --eval "db.user.findOne()" > /dev/null 2>&1 # If the database is not initialized, perform setup. if [ $? -ne 0 ]; then /app/my_project -setup fi # Start the application. /app/my_project
在此脚本中,mongo 是 Mongo 容器的主机名,my_project 是数据库名称。
此脚本检查特定文档是否存在于 Mongo 容器的用户集合中数据库。如果该文档不存在,则表明数据库尚未初始化,需要执行setup命令。否则,应用程序将正常启动。
请注意,用户最初使用“仅数据容器”来安装数据库卷。但是,对于支持命名卷的 Docker 1.9 及更高版本,不再需要这种方法。因此,可以从docker-compose.yml文件中删除mongodata容器,并修改mongo服务以直接使用命名卷。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3