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