Tôi đề nghị thêm một entrypoint-script vào vùng chứa của bạn; trong entrypoint-script này, bạn có thể kiểm tra xem cơ sở dữ liệu đã được khởi tạo chưa và nếu chưa, hãy thực hiện các bước bắt buộc.
Như bạn đã nhận thấy trong câu hỏi của mình, thứ tự mà các dịch vụ / vùng chứa được bắt đầu không nên được coi là đương nhiên, vì vậy có thể vùng chứa ứng dụng của bạn đã được khởi động trước vùng chứa cơ sở dữ liệu, vì vậy tập lệnh phải tính đến điều đó.
Ví dụ, hãy xem hình ảnh WordPress chính thức, hình ảnh này thực hiện khởi tạo một lần cơ sở dữ liệu trong entrypoint-script của nó. Tập lệnh cố gắng kết nối với cơ sở dữ liệu (và thử lại nếu không thể liên hệ với cơ sở dữ liệu (chưa)) và kiểm tra xem có cần khởi tạo không; https://github.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171
LƯU Ý
Tôi nhận thấy rằng bạn đã tạo một "vùng chứa chỉ dữ liệu" để đính kèm ổ đĩa của bạn. Kể từ docker 1.9, docker có quản lý khối lượng, bao gồm cả việc đặt tên khối lượng. Do đó, bạn không cần sử dụng vùng chứa "chỉ dữ liệu" nữa.
Bạn có thể xóa vùng chứa chỉ dữ liệu khỏi tệp soạn của mình và thay đổi dịch vụ mongo của bạn để trông giống như thế này;
mongo:
image: mongo:latest
volumes:
- mongodata:/data/db
ports:
- "28001:27017"
command: --smallfiles --rest --auth
Thao tác này sẽ tạo một ổ đĩa mới, có tên là mongodata
nếu nó không tồn tại hoặc sử dụng lại tập hiện có với tên đó. Bạn có thể liệt kê tất cả các tập bằng cách sử dụng docker volume ls
và xóa một ổ có docker volume rm <some-volume>
nếu bạn không cần nó nữa