파이썬을 사용하여 mysql을 docker와 연결하려고합니다. 그러나이 오류가 발생합니다. python3을 사용하고 있습니다. 나는 도커를 처음 사용하므로 해결책을 찾을 수 없습니다.
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, "Ca n't connect to MySQL server on 'db'([Errno -2] Name does not resolve)")
이 문제를 해결하는 방법을 모릅니다. 조언 부탁드립니다.
마지막으로이 작업을 수행하고 코드에 필요한 몇 가지 중요한 변경 사항을 적용했습니다.
WORKDIR app
WORKDIR
디렉토리를 생성하고 디렉토리 app
로 이동 app
하여 명령문을 제거 할 수 있습니다. RUN mkdir /app
해당 디렉토리로 이동하므로 COPY
명령문을 다음과 같이 변경하십시오 .
COPY . .
첫 번째 .
는 dockerfile이있는 위치이고 두 번째 .
는 컨테이너의 앱 폴더입니다. 따라서 항상 앱 폴더에 dockerfile이있는 것이 좋습니다.
volumes:
- ./app:/app
docker-compose의 위 코드는 콘텐츠를 직접 복사하므로 다시 마운트 할 필요가 없으므로 필요하지 않습니다.
- MYSQL_ROOT_PASSWORD=supersecretpassword
또한 docker-compose의 db 서비스에 위의 환경 변수를 추가하십시오.
- MYSQL_HOST=localhost
이 환경 변수는 여기에 필요하지 않으므로 제거하십시오.
image: mysql:5.7
나는 데이터베이스 서버에서 많은 문제없이 광범위하게 사용하는 안정적인 버전 중 하나이므로 버전 5.7을 사용하는 것이 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다