Proponuję dodać skrypt wejścia do kontenera; w tym skrypcie punktu wejścia możesz sprawdzić, czy baza danych została zainicjowana, a jeśli nie, wykonaj wymagane kroki.
Jak zauważyłeś w swoim pytaniu, kolejność uruchamiania usług/kontenerów nie powinna być traktowana jako oczywista, więc możliwe, że kontener aplikacji zostanie uruchomiony przed kontener bazy danych, więc skrypt powinien wziąć to pod uwagę.
Jako przykład spójrz na oficjalny obraz WordPress, który wykonuje jednorazową inicjalizację bazy danych w swoim skrypcie punktu wejścia. Skrypt próbuje połączyć się z bazą danych (i ponawia próbę, jeśli nie można (jeszcze) skontaktować się z bazą danych) i sprawdza, czy inicjalizacja jest potrzebna; https://github.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171
UWAGA
Zauważyłem, że utworzyłeś „kontener tylko na dane”, do którego chcesz dołączyć swój wolumin. Od wersji docker 1.9 docker obsługuje zarządzanie woluminami, w tym nazewnictwo woluminów. Z tego powodu nie musisz już używać kontenerów „tylko dane”.
Możesz usunąć kontener zawierający tylko dane z pliku tworzenia i zmienić usługę mongo, aby wyglądała mniej więcej tak;
mongo:
image: mongo:latest
volumes:
- mongodata:/data/db
ports:
- "28001:27017"
command: --smallfiles --rest --auth
Powinno to utworzyć nowy wolumin o nazwie mongodata
jeśli nie istnieje, lub ponownie użyj istniejącego woluminu o tej nazwie. Możesz wyświetlić listę wszystkich woluminów za pomocą docker volume ls
i usuń wolumin za pomocą docker volume rm <some-volume>
jeśli już go nie potrzebujesz