При работе с файлом 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"]
В этом случае данные — это том, содержащий код приложения, а входная точка.sh — это сценарий точки входа.
Создайте скрипт enterpoint.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 — имя базы данных.
Этот скрипт проверяет, существует ли определенный документ в пользовательской коллекции база данных. Если документ не существует, это означает, что база данных не была инициализирована, и выполняется команда установки. В противном случае приложение запускается нормально.
Обратите внимание, что пользователь изначально использовал «контейнер только данных» для монтирования тома базы данных. Однако этот подход больше не нужен в Docker 1.9 и более поздних версиях, которые поддерживают именованные тома. Таким образом, контейнер mongodata можно удалить из файла docker-compose.yml, а службу mongo можно изменить для прямого использования именованного тома.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3