Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Django tidak dapat menghubungkan mysql di docker-compose

Akhirnya, saya menemukan jawabannya! Intinya adalah, seperti yang dikatakan @SangminKim, saya perlu menggunakan 3306 bukan 3302 di settings.py , dan gunakan db sebagai HOST bukan 127.0.0.1 .

Jadi ini docker-compose.yml saya ajukan sekarang:

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

Jadi sekarang kita dapat menghubungkan docker-mysql ini oleh mysql -h 127.0.0.1 -P 3302 -u root -p di shell secara langsung, tetapi kita harus menggunakan db dan 3306 di django settings.py berkas:

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',
        }
    }
}

Dan kita masih dapat memeriksa apakah port ini terbuka, dengan menjalankan perintah tambahan di docker-compose.yml berkas:

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

Ini check_db.py berkas:

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

Omong-omong, ini Dockerfile saya untuk membangun 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

Lihat detail selengkapnya dari sini: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. Bagaimana cara menghapus MySQL sepenuhnya dengan file konfigurasi dan perpustakaan?

  2. Membuat MySQL bekerja di OSX 10.7 Lion

  3. Query berparameter SQL dengan LIKE '% ? %' PHP

  4. SQL Perbarui dan ganti substring

  5. Menghubungkan ke Mysql di AWS Elastic Beanstalk