国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

解決問題2003(HY000):無法連接到MySQL服務(wù)器' db_mysql:3306'(111)的方法
P粉178132828
P粉178132828 2023-09-05 11:18:47
0
1
1216
<p>我最近嘗試將我的FastAPI Python服務(wù)器容器化(也是為了復(fù)制/雙倍化)。之前,我只有一個(gè)MySQL服務(wù)器在一個(gè)Docker容器中,并且一切都很好,但是當(dāng)我將我的Web服務(wù)器也作為一個(gè)服務(wù)時(shí),它無法連接到MySQL服務(wù)器,所以現(xiàn)在應(yīng)用程序無法工作。</p> <p>下面是應(yīng)用程序中服務(wù)器數(shù)據(jù)庫(kù)初始化連接器的代碼片段</p> <pre class="lang-py prettyprint-override"><code>from fastapi import FastAPI import mysql.connector app = FastAPI() dbconfig = { "host": "localhost", "database": "server_db", "user": "db_user", "password": "user-password" } # 檢查數(shù)據(jù)庫(kù)連接 try: init_cnx = mysql.connector.connect( host='localhost', user='db_user', password='user-password' ) cursor = init_cnx.cursor() cursor.execute("SHOW DATABASES LIKE 'server_db'") if cursor.fetchone() == None: # 如果數(shù)據(jù)庫(kù)不存在,則創(chuàng)建數(shù)據(jù)庫(kù) cursor.execute("CREATE DATABASE server_db") cursor.execute("USE server_db") cursor.execute("CREATE TABLE Messages (" "message_id INT NOT NULL AUTO_INCREMENT," "sender_name VARCHAR(32)," "message_text VARCHAR(64)," "created_at DATE," "user_messages_count INT," "PRIMARY KEY (message_id));") print('數(shù)據(jù)庫(kù)已創(chuàng)建!') cursor.close() init_cnx.close() except mysql.connector.Error as err: print("在init_cnx中發(fā)生錯(cuò)誤:", err) # 數(shù)據(jù)庫(kù)I/O函數(shù) async def execute_db_query(query, cursor_buffered=False): cnx = mysql.connector.connect(**dbconfig) try: cursor = cnx.cursor(buffered=cursor_buffered) cursor.execute("USE server_db") cursor.execute(query) result = cursor.fetchall() cnx.commit() print("查詢成功執(zhí)行!") return result except Exception as e: print("執(zhí)行查詢時(shí)出錯(cuò):", e) finally: if cnx: cnx.close() # 獲取根目錄函數(shù),只是用來檢查應(yīng)用程序是否連接到數(shù)據(jù)庫(kù) @app.get("/") async def get_root(): try: entries_count = await execute_db_query("SELECT COUNT(*) FROM Messages", cursor_buffered=True) return {"Messages entries": entries_count[0][0]} except Exception as e: return {"錯(cuò)誤": e} </code></pre> <p>服務(wù)器的Dockerfile</p> <pre class="brush:php;toolbar:false;">FROM python:3.11.4-slim-bookworm WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY server.py . EXPOSE 8000 CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8000"]</pre> <p>init.sql腳本</p> <pre class="lang-sql prettyprint-override"><code>CREATE USER 'db_user'@'%' IDENTIFIED BY 'user-password'; GRANT ALL PRIVILEGES ON *.* TO 'db_user'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; </code></pre> <p>以及docker-compose.yml</p> <pre class="lang-yaml prettyprint-override"><code>version: "3.8" services: db_mysql: image: mysql:8 restart: always 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" networks: - dummy_network server_1: image: dummy_msg_server ports: - "8081:8000" networks: - dummy_network #command: sh -c "sleep 60s" depends_on: - db_mysql server_2: image: dummy_msg_server ports: - "8082:8000" networks: - dummy_network #command: sh -c "sleep 60s" depends_on: - db_mysql volumes: db_mysql_data: #external: true networks: dummy_network: driver: bridge </code></pre> <p>盡管在MySQL容器完全初始化之前嘗試使用API可能會(huì)導(dǎo)致錯(cuò)誤,但這不是問題,因?yàn)槲业鹊組ySQL服務(wù)器表示已準(zhǔn)備好處理請(qǐng)求。除此之外,我不嘗試連接到MySQL服務(wù)器。</p> <p>我嘗試使用主機(jī)名/ IP地址進(jìn)行連接。 嘗試將dockerfile中的python:3.11.4映像更改為早期的debian版本并且不使用slim映像。嘗試顯式地為容器使用一個(gè)公共網(wǎng)絡(luò)。 Docker一直顯示容器在一個(gè)網(wǎng)絡(luò)中,而來自服務(wù)器容器的curl請(qǐng)求返回了一些內(nèi)容。 此外,docker-compose.yml以前為db_mysql服務(wù)提供了3306:3306的端口。猜測(cè)這也不是問題。</p> <p><strong>更新 1。</strong>在調(diào)查過程中,發(fā)現(xiàn)如果數(shù)據(jù)庫(kù)已經(jīng)創(chuàng)建,則應(yīng)用程序在向其發(fā)送請(qǐng)求并獲得正確響應(yīng)方面沒有問題。它唯一的問題是無法使用代碼中的創(chuàng)建腳本創(chuàng)建數(shù)據(jù)庫(kù)。</p><p> (猜測(cè),我應(yīng)該更新代碼塊,因?yàn)轫?xiàng)目現(xiàn)在處于另一個(gè)階段。)</p>
P粉178132828
P粉178132828

全部回復(fù)(1)
P粉141455512

我遇到了一個(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è)替代解決方案。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板