Не удалось запустить приложение django с использованием контейнеров docker

#python #django #docker #docker-compose #containers

#python #django #docker #docker-compose #контейнеры

Вопрос:

Я пытаюсь запустить приложение Django на localhost:8000 .

У меня есть docker-compose.yml файл, который создает 3 контейнера:

  • badgr-server_api
  • badgr-server_memcached
  • badgr-server_db_

Когда я запускаю docker-compose up, в нем говорится о запуске 2 контейнеров и создании 3-го ( badgr-server_api ), и я вижу только, что memchaced и db запущены, см. Скриншот. Я попытался удалить badgr-server_api и запустить его снова, я попытался удалить изображение.

Я также снова запустил docker-compose build , но я просто не могу запустить его. Я надеюсь, что кто-нибудь может помочь, пожалуйста.

docker-создайте скриншот

После запуска docker я также выполнил эту команду:

 docker-compose exec api python /badgr_server/manage.py migrate
  

и получите этот результат:

 Traceback (most recent call last):
  File "/badgr_server/manage.py", line 13, in <module>
   
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 212, in get_connection_params
    isolation_level = options.pop('isolation_level', 'read committed')
TypeError: pop() takes no arguments (2 given)
  

Это мой docker-compose.yml:

 # A dockerized badgr-server stack for development
version: '3.3'
services:

  # this container mirrors in the app code and runs the django dev server
  api:
    build:
      context: .
      dockerfile: .docker/Dockerfile.dev.api
    depends_on:
      - "db"
      - "memcached"
    command: /badgr_server/manage.py runserver 0.0.0.0:8000
    volumes:
      - ./apps:/badgr_server/apps
      - ./manage.py:/badgr_server/manage.py
      - ./.docker/etc/settings_local.dev.py:/badgr_server/apps/mainsite/settings_local.py
    networks:
      - badgr
    ports:
      - "8000:8000"

  # this container runs memcached
  memcached:
    image: 'bitnami/memcached:latest'
    expose:
      - "11211"
    networks:
      - badgr

  # this container runs mysql (database)
  db:
    image: mysql:5.6.39
    volumes:
      - badgr_server_dev_db:/var/lib/mysql:rw
      - ./.docker/etc/init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      - "MYSQL_PASSWORD=password"
      - "MYSQL_HOST=db"
      - "MYSQL_ROOT_PASSWORD=password"
    expose:
      - "3306"
    networks:
      - badgr

networks:
  badgr:
    driver: bridge

volumes:
  badgr_server_dev_db:
  
 > import random import string from .settings import * from mainsite
> import TOP_DIR
> 
> DEBUG = False DEBUG_ERRORS = DEBUG DEBUG_STATIC = DEBUG DEBUG_MEDIA =
> DEBUG
> 
> TIME_ZONE = 'America/Los_Angeles' LANGUAGE_CODE = 'en-us'
> 
> 
> ##
> #
> # Database Configuration
> #
> ## DATABASES = {
>     'default': {
>         'ENGINE': 'django.db.backends.mysql',
>         'NAME': 'badgr',
>         'USER': 'root',
>         'PASSWORD': 'password',
>         'HOST': 'db',
>         'PORT': '',
>         'OPTIONS': {
>             "SET character_set_connection=utf8mb3, collation_connection=utf8_unicode_ci"
>             #            ,  # Uncomment when using MySQL to ensure consistency across servers
>         },
>     } }
> 
> 
> ###
> #
> # CACHE
> #
> ### CACHES = {
>      'default': {
>          'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
>          'LOCATION': 'memcached:11211',
>          'KEY_FUNCTION': 'mainsite.utils.filter_cache_key'
>      }  }
> 
> 
> 
> ###
> #
> # Email Configuration
> #
> ### DEFAULT_FROM_EMAIL = 'noreply@example.com'  # e.g. "noreply@example.com" EMAIL_BACKEND =
> 'django.core.mail.backends.console.EmailBackend'
> 
> 
> ###
> #
> # Celery Asynchronous Task Processing (Optional)
> #
> ### CELERY_RESULT_BACKEND = None
> # Run celery tasks in same thread as webserver (True means that asynchronous processing is OFF) CELERY_ALWAYS_EAGER = True
> 
> 
> ###
> #
> # Application Options Configuration
> #
> ### HTTP_ORIGIN = 'http://localhost:8000' ALLOWED_HOSTS = ['*'] STATIC_URL = HTTP_ORIGIN   '/static/'
> 
> CORS_ORIGIN_ALLOW_ALL = False CORS_ORIGIN_WHITELIST = (
>     'http://localhost:4200', )
> 
> # Optionally restrict issuer creation to accounts that have the 'issuer.add_issuer' permission BADGR_APPROVED_ISSUERS_ONLY = False
> 
> # Automatically send an email the first time that recipient identifier (email type) has been used on the system.
> GDPR_COMPLIANCE_NOTIFY_ON_FIRST_AWARD = True
> 
> SECRET_KEY = ''.join(random.choice(string.ascii_uppercase  
> string.digits) for _ in range(40)) UNSUBSCRIBE_KEY =
> ''.join(random.choice(string.ascii_uppercase   string.digits) for _ in
> range(40)) UNSUBSCRIBE_SECRET_KEY = str(SECRET_KEY)
> 
> 
> ###
> #
> # Logging
> #
> ### LOGS_DIR = os.path.join(TOP_DIR, 'logs') if not os.path.exists(LOGS_DIR):
>     os.makedirs(LOGS_DIR) LOGGING = {
>     'version': 1,
>     'disable_existing_loggers': False,
>     'handlers': {
>         'mail_admins': {
>             'level': 'ERROR',
>             'filters': [],
>             'class': 'django.utils.log.AdminEmailHandler'
>         },
> 
>         # badgr events log to disk by default
>         'badgr_events': {
>             'level': 'INFO',
>             'formatter': 'json',
>             'class': 'logging.FileHandler',
>             'filename': os.path.join(LOGS_DIR, 'badgr_events.log')
>         }
>     },
>     'loggers': {
>         'django.request': {
>             'handlers': ['mail_admins'],
>             'level': 'ERROR',
>             'propagate': True,
>         },
> 
>         # Badgr.Events emits all badge related activity
>         'Badgr.Events': {
>             'handlers': ['badgr_events'],
>             'level': 'INFO',
>             'propagate': False,
> 
>         }
> 
>     },
>     'formatters': {
>         'default': {
>             'format': '%(asctime)s %(levelname)s %(module)s %(message)s'
>         },
>         'json': {
>             '()': 'mainsite.formatters.JsonFormatter',
>             'format': '%(asctime)s',
>             'datefmt': '%Y-%m-%dT%H:%M:%S%z',
>         }
>     }, }
  

Комментарии:

1. Можете ли вы использовать свой файл настроек, особенно часть базы данных?

2. Это может произойти из-за того, что настройки вашей базы данных представляют собой список, когда он должен быть dict.

3. Единственное, что видно на скриншоте, это то, что сервер API не выдает выходные данные. Возможно, оно запущено.

4. Спасибо @Taek, я добавил файл настроек и посмотрю настройки базы данных, я думал, что это dict. Как вы можете сказать, я новичок в этом, но спасибо за вашу помощь, и если вы видите что-нибудь в файле настроек, пожалуйста, дайте мне знать.

5. @NickODell в 4-й строке отображается ‘done’, что, я полагаю, означает, что контейнер запущен без каких-либо проблем, но он не показывает никакой дополнительной информации, как это происходит с другими 2 контейнерами. Спасибо, что нашли время оставить свой отзыв.

Ответ №1:

Ваш DATABASES.default.OPTIONS должен быть словарем, а не набором, немного сложно увидеть разницу между ними, если вы к этому не привыкли:

 In [5]: type({'key': 'value'})
Out[5]: dict

In [6]: type({'key and no value'})
Out[6]: set
  

Вот почему вы получили pop() takes no arguments (2 given) сообщение об ошибке, поскольку именно так set.pop работает: https://docs.python.org/3.7/library/stdtypes.html#frozenset.pop

Вы должны быть в состоянии заставить его работать, не комментируя параметры, используя правильно отформатированный dict, такой как :

 DATABASES = {
    "default": {
        ...
        "OPTIONS": {
            "character_set_connection": "utf8mb3",
            "collation_connection": "utf8_unicode_ci",
        },
    }
}
  

Я не уверен в точном синтаксисе, особенно в значениях, "utf8mb3" и "utf8_unicode_ci" , которые, я думаю, должны быть перечислениями. У меня нет базы данных mysql, чтобы попробовать это, поэтому вам придется найти это самостоятельно.

Комментарии:

1. Большое вам спасибо, вы правы, это должен быть dict 🙂