【问题标题】:Can't connect to MySQL server on 'db' ([Errno -2] Name does not resolve)无法连接到“db”上的 MySQL 服务器([Errno -2] 名称无法解析)
【发布时间】:2020-05-28 11:23:42
【问题描述】:

我正在尝试使用 python 将 mysql 与 docker 连接。但这个错误正在发生。我正在使用python3。我是 docker 新手,所以我找不到任何解决方案。

Dockerfile:

FROM python:3.8-alpine
MAINTAINER Fahim Ahmed Irfan

ENV PYTHONUNBUFFERED 1

COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache jpeg-dev
RUN apk --update add --no-cache --virtual .tmp-build-deps \
      gcc build-base libffi-dev freetype-dev libpng-dev openblas-dev linux-headers mysql-dev zlib zlib-dev
RUN pip install -r /requirements.txt

RUN mkdir /app
WORKDIR ./app
COPY ./app /app

RUN adduser -D user
User user
EXPOSE 8000

Docker 编写文件:

version: '3'

services:
  app:
    restart: always
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    command: >
      sh -c "python check_db.py --service-name mysql --ip db --port 3306 &&
             python manage.py makemigrations &&
             python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8000"
    environment:
      - DB_HOST=db
      - DB_NAME=app
      - DB_USER=root
      - DB_PASS=supersecretpassword
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      - MYSQL_HOST=localhost
      - MYSQL_PORT=3306
      - MYSQL_ROOT_HOST=%
      - MYSQL_DATABASE=app
      - MYSQL_USER=root
      - MYSQL_PASSWORD=supersecretpassword

    ports:
      - "3306:3306"

check_db.py:

import socket
import time
import argparse
""" Check if port is open, avoid docker-compose race condition """

parser = argparse.ArgumentParser(description='Check if port is open, avoid\
                                 docker-compose race condition')
parser.add_argument('--service-name', required=True)
parser.add_argument('--ip', required=True)
parser.add_argument('--port', required=True)

args = parser.parse_args()

# Get arguments
service_name = str(args.service_name)
port = int(args.port)
ip = str(args.ip)

# Infinite loop
while True:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    result = sock.connect_ex((ip, port))
    if result == 0:
        print("{0} port is open! Bye!".format(service_name))
        break
    else:
        print("{0} port is not open! I'll check it soon!".format(service_name))
        time.sleep(3)

settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': os.environ.get('DB_HOST'),
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASS'),
        'PORT': '3306',
    }

requirements.txt:

Django==2.1.3,<2.2.0
djangorestframework==3.9.0,<3.10.0
pymysql

错误是:django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'db' ([Errno -2] Name does not resolve)")

不知道如何解决这个问题。请指教。

【问题讨论】:

    标签: python django docker


    【解决方案1】:

    我终于完成了这项工作,我对您的代码进行了一些重要的更改。

    WORKDIR app
    

    WORKDIR 创建目录app 并移入目录app,因此您可以删除语句RUN mkdir /app 当您也移动到该目录时,请将 COPY 语句更改为

    COPY . .
    

    第一个.是dockerfile所在的地方,第二个.是容器中的app文件夹。所以在 app 文件夹中有 dockerfile 总是好的。

        volumes:
          - ./app:/app
    

    docker-compose 中的上述代码不是必需的,因为您是直接复制内容,因此再次挂载是没有用的。

          - MYSQL_ROOT_PASSWORD=supersecretpassword
    

    另外,将上述环境变量添加到docker-compose中的db服务

    - MYSQL_HOST=localhost
    

    请删除此环境变量,因为这里不需要它。

    image: mysql:5.7
    

    我会推荐使用 5.7 版本,因为它是我广泛使用的稳定版本之一,并且数据库服务器没有很多问题。

    【讨论】:

    • 不工作。现在显示此错误:django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'db' ([Errno 111] Connection denied)")
    • 问题解决了。我不得不从我的笔记本电脑上卸载 MySql。但我不知道为什么这与我的 docker 冲突。
    • 太棒了,应该是3306端口冲突,你本地的MySQL服务器已经占用了3306端口,与容器中的MySQL发生冲突。
    • 如果您愿意,可以将我的答案的编辑发送给我。
    • 您可以直接使用下一个端口3307,但请注意您在客户端也配置了此端口。
    猜你喜欢
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    相关资源
    最近更新 更多