python - 无法连接到“db”上的 MySQL 服务器([Errno -2] 名称无法解析)
问题描述
我正在尝试使用 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
码头工人撰写文件:
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)
设置.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',
}
要求.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)")
不知道如何解决这个问题。请指教。
解决方案
最后我得到了这个工作,我对您的代码进行了一些重要的更改。
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 版本,因为它是我广泛使用的稳定版本之一,数据库服务器没有很多问题。
推荐阅读
- blazor-server-side - 如何在 Blazor 中将存储在 DB 中的图像显示为字节 []
- xml - 如何在 Spring Boot 2 中使用内容协商建立自定义 xml 序列化
- airflow - 虚拟运算符的用例
- c++ - 如何使用排序和比较这两个函数在 C++ 中对 char 数组进行排序?
- html - 表格固定标题和可滚动正文,标题后面的内容有问题
- c++ - QtConcurrent 错误:数组初始化需要大括号括起来的初始化器列表
- javascript - 让 JS 函数执行简单的 AJAX 真/假请求并返回该结果的最佳方法是什么
- java - 当我们在 @Bean 中创建新类并在另一个 @Bean 中使用 @Bean 时会发生什么
- c++ - 虚拟类继承对象大小问题
- scala - 如何在 Scala 中使用 val 声明一个不需要输入的函数