sql >> データベース >  >> RDS >> Mysql

djangoはdocker-composeでmysqlに接続できません

    最後に、私はそれを理解しました!重要なポイントは、@ SangminKi​​mが言ったように、3306を使用する必要があるということです 3302ではありません settings.pyで 、dbを使用します HOSTとして 127.0.0.1ではありません 。

    これが私のdocker-compose.ymlです 今すぐファイル:

    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
    

    これで、この docker-mysqlを接続できます mysql -h 127.0.0.1 -P 3302 -u root -pによる シェルで直接実行しますが、dbを使用する必要があります および3306 django settings.pyで ファイル:

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

    また、docker-compose.ymlで追加のコマンドを実行することで、このポートが開いているかどうかを確認できます。 ファイル:

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

    こちらがcheck_db.pyです ファイル:

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

    ちなみに、これは私のDockerfileです ビルド用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
    

    詳細については、こちらをご覧ください: https://github.com/OnlyBelter/django-compose



    1. Android SQLiteエラー:変数番号は?1から?999の間でなければなりません

    2. すべての派生テーブルには、独自のエイリアスエラーが必要です

    3. .phpファイルを使用してMySQLダンプを生成する

    4. ひねりを加えたHekaton:インメモリTVP –パート2