使用 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 是数据库名称。
此脚本检查数据库的用户集合中是否存在特定文档。如果该文档不存在,则表明数据库尚未初始化,需要执行setup命令。否则,应用程序将正常启动。
请注意,用户最初使用“仅数据容器”来挂载数据库卷。但是,对于支持命名卷的 Docker 1.9 及更高版本,不再需要这种方法。因此,可以从 docker-compose.yml 文件中删除 mongodata 容器,并修改 mongo 服务以直接使用命名卷。
以上是如何在 Docker Compose 中仅运行一次命令?的详细内容。更多信息请关注PHP中文网其他相关文章!