Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

django không thể kết nối mysql trong docker-compile

Cuối cùng, tôi đã tìm ra! Điểm mấu chốt là, giống như @SangminKim đã nói, tôi cần sử dụng 3306 không phải 3302 trong settings.py và sử dụng db dưới dạng HOST không phải 127.0.0.1 .

Vì vậy, đây là docker -omp.yml của tôi nộp ngay bây giờ:

version: '3'

services:
  db:
    image: mariadb:5.5
    restart: always
    environment:
      - MYSQL_HOST=localhost
      - MYSQL_PORT=3306  # cannot change this port to other number
      - MYSQL_ROOT_HOST=%
      - MYSQL_DATABASE=test
      - MYSQL_USER=belter
      - MYSQL_PASSWORD=belter_2017
      - MYSQL_ROOT_PASSWORD=123456_abc
    volumes:
      - /home/belter/mdbdata/mdb55:/var/lib/mysql
    ports:
      - "3302:3306"
  web:
    image: onlybelter/django_py35
    command: python3 manage.py runserver 0.0.0.0:6001
    volumes:
      - .:/djcode
    ports:
      - "6001:6001"
    depends_on:
      - db

Vì vậy, bây giờ chúng tôi có thể kết nối docker-mysql này bởi mysql -h 127.0.0.1 -P 3302 -u root -p trong shell trực tiếp, nhưng chúng ta phải sử dụng db3306 trong django settings.py tệp:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'belter',
        # 'HOST': 'mariadb55',
        'HOST': 'db',  #<---
        'PORT': '3306',   #<---
        'PASSWORD': 'belter_2017',
        'default-character-set': 'utf8',
        'OPTIONS': {
            'sql_mode': 'traditional',
        }
    }
}

Và chúng tôi vẫn có thể kiểm tra xem cổng này có đang mở hay không bằng cách chạy lệnh bổ sung trong docker-compose.yml tệp:

...
  web:
    image: onlybelter/django_py35
    command: /bin/sh -c "python check_db.py --service-name mysql --ip db --port 3306"
    volumes:
      - .:/djcode
...

Đây là check_db.py tệp:

# 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)

Nhân tiện, đây là Dockerfile của tôi cho bản dựng django-py35 :

FROM python:3.5-alpine
MAINTAINER Xin Xiong "[email protected]"
ENV PYTHONUNBUFFERED 1
RUN set -e; \
        apk add --no-cache --virtual .build-deps \
                gcc \
                libc-dev \
                linux-headers \
                mariadb-dev \
                python3-dev \
                postgresql-dev \
                freetype-dev \
                libpng-dev \
                g++ \
        ;
RUN mkdir /djcode
WORKDIR /djcode
ENV REFRESHED_AT 2017-12-25
ADD requirements.txt /djcode/
RUN pip install --no-cache-dir -r /djcode/requirements.txt
RUN pip install uwsgi
ADD . /djcode/  # copy . to /djcode/
EXPOSE 6001

Xem thêm chi tiết từ đây: https://github.com/OnlyBelter/django-compose



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Gem cho Ruby On Rails

  2. Truy cập mysql chạy trên localhost từ minikube

  3. chỉ lấy hàng đầu tiên trong một truy vấn mysql

  4. Kết nối với MySQL qua SSH bằng Java

  5. Không thể chèn GeomFromText ('POINT (..)') trong MySQL