我遇到了一個(gè)問題,即服務(wù)器和數(shù)據(jù)庫(kù)容器同時(shí)啟動(dòng),導(dǎo)致出現(xiàn)問題。在數(shù)據(jù)庫(kù)服務(wù)器準(zhǔn)備好接受連接之前,第一次(也是最后一次)嘗試連接數(shù)據(jù)庫(kù)服務(wù)器就已經(jīng)發(fā)生了。
為了解決這個(gè)問題,我決定在docker-compose.yml文件中添加一個(gè)健康檢查:
version: "3.8" services: db_mysql: image: mysql:8 restart: always ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: "root" volumes: - "./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql" - "./mysql/db_mysql_data:/var/lib/mysql" - "./mysql/mysql_logs:/var/log/mysql" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"] timeout: 1s interval: 40s retries: 5 server_1: build: context: . dockerfile: Dockerfile restart: always ports: - "8081:8000" depends_on: db_mysql: condition: service_healthy server_2: build: context: . dockerfile: Dockerfile restart: always ports: - "8082:8000" depends_on: db_mysql: condition: service_healthy volumes: db_mysql_data: #external: true
使用這個(gè)配置,服務(wù)器的容器在健康檢查確認(rèn)數(shù)據(jù)庫(kù)服務(wù)器準(zhǔn)備好之前不會(huì)啟動(dòng)。
然而,有一種可能更好的處理這種情況的方法,涉及使用wait-for-it.sh腳本。我個(gè)人認(rèn)識(shí)一些有經(jīng)驗(yàn)的后端開發(fā)人員,他們也使用Docker容器將他們的應(yīng)用程序拆分成微服務(wù)。他們對(duì)使用這個(gè)腳本表示了積極的評(píng)價(jià)。雖然我個(gè)人沒有嘗試過,但我建議考慮它作為一個(gè)替代解決方案。