When working with a Docker compose file, it may become necessary to run a specific command only once, often during the initial setup of an application. This requirement arises when the application depends on a database that needs to be initialized, and the initialization should occur only upon the first run.
In this case, the user intends to execute the command ./my-project -setup to add necessary information to the database. To achieve this, it's recommended to incorporate an entrypoint script into the container.
An entrypoint script provides a mechanism to execute custom commands before starting the main application. Within the entrypoint script, it's possible to check if the database has already been initialized. If initialization is required, the script can perform the setup steps.
This approach ensures that the initialization command is executed only once, even if the container is restarted or the service is scaled up.
To implement this solution, modify the docker-compose.yml file to include the following script in the my_project service definition:
services: my_project: build: . volumes: - data:/app ports: - "6060:8080" depends_on: - mongo entrypoint: ["/app/entrypoint.sh"]
In this case, data is the volume containing the application code, and entrypoint.sh is the entrypoint script.
Create an entrypoint.sh script with the following contents:
#!/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
In this script, mongo is the hostname of the Mongo container, and my_project is the database name.
This script checks if a particular document exists in the user collection of the database. If the document doesn't exist, it indicates that the database has not been initialized, and the setup command is executed. Otherwise, the application starts normally.
Note that the user initially used a "data-only container" to mount the database volume. However, this approach is no longer necessary with Docker 1.9 and later, which supports named volumes. Therefore, the mongodata container can be removed from the docker-compose.yml file, and the mongo service can be modified to use the named volume directly.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3