Docker soạn luôn bắt đầu và dừng các vùng chứa theo thứ tự phụ thuộc hoặc thứ tự tuần tự trong tệp nếu không được cung cấp. Nhưng docker-compile không đảm bảo rằng nó sẽ đợi cho đến khi vùng chứa phụ thuộc đang chạy. Bạn có thể tham khảo
tại đây để biết thêm chi tiết. Vì vậy, vấn đề ở đây là cơ sở dữ liệu của bạn chưa sẵn sàng khi spring-mysql
của bạn vùng chứa cố gắng truy cập cơ sở dữ liệu. Vì vậy, giải pháp được đề xuất là bạn có thể sử dụng wait-for-it.sh
hoặc tập lệnh tương tự để bọc spring-mysql
của bạn khởi động ứng dụng ENTRYPOINT
.
Ví dụ:nếu bạn sử dụng wait-for-it.sh
ENTRYPOINT
của bạn trong Dockerfile của bạn sẽ thay đổi thành sau sau khi sao chép tập lệnh trên vào thư mục gốc dự án của bạn:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
Và hai điều quan trọng khác cần xem xét ở đây là:
- Không sử dụng các liên kết không được dùng nữa thay vào đó bạn nên sử dụng mạng do người dùng xác định. Tất cả các dịch vụ trong tệp docker-comp sẽ nằm trong một mạng duy nhất do người dùng xác định nếu bạn không xác định rõ ràng bất kỳ mạng nào. Vì vậy, bạn chỉ cần xóa các liên kết khỏi tệp soạn thảo.
- Bạn không cần xuất bản cổng cho vùng chứa docker nếu bạn chỉ sử dụng nó trong mạng do người dùng xác định.