У меня есть приложение Python, использующее Джанго и Celery, и я пытаюсь запустить его, используя докер и докер-сочинять, потому что я также использую Redis и Dynamodb
Проблема в следующем:
Я не могу выполнить обе службы WSGI и Сельдерей, потому что только первая инструкция работает нормально ..
version: '3.3'
services:
redis:
image: redis:3.2-alpine
volumes:
- redis_data:/data
ports:
- "6379:6379"
dynamodb:
image: dwmkerr/dynamodb
ports:
- "3000:8000"
volumes:
- dynamodb_data:/data
jobs:
build:
context: nubo-async-cfe-seces
dockerfile: Dockerfile
environment:
- REDIS_HOST=redisrvi
- PYTHONUNBUFFERED=0
- CC_DYNAMODB_NAMESPACE=None
- CC_DYNAMODB_ACCESS_KEY_ID=anything
- CC_DYNAMODB_SECRET_ACCESS_KEY=anything
- CC_DYNAMODB_HOST=dynamodb
- CC_DYNAMODB_PORT=8000
- CC_DYNAMODB_IS_SECURE=False
command: >
bash -c "celery worker -A tasks.async_service -Q dynamo-queue -E --loglevel=ERROR &&
uwsgi --socket 0.0.0.0:8080 --protocol=http --wsgi-file nubo_async/wsgi.py"
depends_on:
- redis
- dynamodb
volumes:
- .:/jobs
ports:
- "9090:8080"
volumes:
redis_data:
dynamodb_data:
У кого-нибудь была такая же проблема?
Журналы @Satevg показывают только информацию о процессе Celery и ничего о Django.
Вы можете попробовать использовать точку с запятой вместо &&
. См. unix.stackexchange.com/a/187148 Может быть, сельдерей не возвращает код успеха, но это другая проблема
@Satevg, ваш первый комментарий дал мне ответ здесь: ruddra.com/docker-do-stuff-using-celery-using-redis-as-broke r - это пример того, что вы упомянули, мне нужно разделить службы. Спасибо за совет!
Нет прямой зависимости между сельдереем и процессом uwsgi, поэтому точка с запятой в порядке, вы можете попробовать внутри того же контейнера. Но лучше обязательно сделать эти сервисы отдельными.
Это первый раз, когда мне нужно запустить одно и то же изображение в двух разных контейнерах внутри одного кластера, сначала это показалось странным, но это действительно лучшее решение.
Вот docker-compose, предложенный @Satevg, запускает приложение Django и Celery в отдельных контейнерах. Работает отлично!
version: '3.3'
services:
redis:
image: redis:3.2-alpine
volumes:
- redis_data:/data
ports:
- "6379:6379"
dynamodb:
image: dwmkerr/dynamodb
ports:
- "3000:8000"
volumes:
- dynamodb_data:/data
jobs:
build:
context: nubo-async-cfe-services
dockerfile: Dockerfile
environment:
- REDIS_HOST=redis
- PYTHONUNBUFFERED=0
- CC_DYNAMODB_NAMESPACE=None
- CC_DYNAMODB_ACCESS_KEY_ID=anything
- CC_DYNAMODB_SECRET_ACCESS_KEY=anything
- CC_DYNAMODB_HOST=dynamodb
- CC_DYNAMODB_PORT=8000
- CC_DYNAMODB_IS_SECURE=False
command: bash -c "uwsgi --socket 0.0.0.0:8080 --protocol=http --wsgi-file nubo_async/wsgi.py"
depends_on:
- redis
- dynamodb
volumes:
- .:/jobs
ports:
- "9090:8080"
celery:
build:
context: nubo-async-cfe-services
dockerfile: Dockerfile
environment:
- REDIS_HOST=redis
- PYTHONUNBUFFERED=0
- CC_DYNAMODB_NAMESPACE=None
- CC_DYNAMODB_ACCESS_KEY_ID=anything
- CC_DYNAMODB_SECRET_ACCESS_KEY=anything
- CC_DYNAMODB_HOST=dynamodb
- CC_DYNAMODB_PORT=8000
- CC_DYNAMODB_IS_SECURE=False
command: celery worker -A tasks.async_service -Q dynamo-queue -E --loglevel=ERROR
depends_on:
- redis
- dynamodb
volumes:
- .:/jobs
volumes:
redis_data:
dynamodb_data:
Немного отредактировал вашу конфигурацию (DRY;)) pastebin.com/Mbz72QyD См. Определение службы jobs
Вы можете обратиться к docker-compose
проекта Салер. Я бы посоветовал позволить celery
запускать свой демон только в зависимости от redis
как брокера. Смотрите конфигурацию файла docker-compose.yml:
services:
web:
build:
context: .
dockerfile: ./Dockerfile
args:
STATIC_URL: '/static/'
restart: unless-stopped
networks:
- saleor-backend-tier
env_file: common.env
depends_on:
- db
- redis
celery:
build:
context: .
dockerfile: ./Dockerfile
args:
STATIC_URL: '/static/'
command: celery -A saleor worker --app=saleor.celeryconf:app --loglevel=info
restart: unless-stopped
networks:
- saleor-backend-tier
env_file: common.env
depends_on:
- redis
Также обратите внимание на то, что соединение обеих служб с redis
устанавливается отдельно environtment vatables
, как показано в файле common.env:
CACHE_URL=redis://redis:6379/0
CELERY_BROKER_URL=redis://redis:6379/1
Это скорее архитектурное замечание, но я считаю, что вам нужно создавать отдельные службы для частей приложений
jobs
иweb
. Вjobs
вы запускаетеcelery worker
и т.д., в сервисеweb
-uwsgi ....
, поскольку вы не следуете правилу «1 процесс - 1 контейнер». Кстати, что вы видите вdocker-compose logs -f jobs
?