如何使用docker compose运行Python Django和芹菜?
我有一个使用Django和芹菜的Python应用程序,我尝试使用docker和docker compose运行,因为我还使用了Redis和Dynamodb 问题如下: 我无法同时执行服务WSGI和芹菜,因为只有第一条指令工作正常如何使用docker compose运行Python Django和芹菜?,python,django,docker,docker-compose,celery,Python,Django,Docker,Docker Compose,Celery,我有一个使用Django和芹菜的Python应用程序,我尝试使用docker和docker compose运行,因为我还使用了Redis和Dynamodb 问题如下: 我无法同时执行服务WSGI和芹菜,因为只有第一条指令工作正常 version: '3.3' services: redis: image: redis:3.2-alpine volumes: - redis_data:/data ports: - "6379:6379" d
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:
有人遇到过同样的问题吗?这是docker compose,根据建议,通过单独的容器运行Django和芹菜应用程序。很好
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:
您可以参考项目的
docker compose
。我建议让芹菜
运行它的守护程序,只依赖redis
作为代理。请参阅文件的配置:
另请参见,从两个服务到redis
的连接由环境vatables
分别设置,如文件所示:
这更像是架构上的注意事项,但我认为您需要为
作业
和web
应用程序部件提供单独的服务。在jobs
中运行芹菜工人
等,在web
服务-uwsgi….
中运行,因为您没有遵循规则“1个进程-1个容器”。顺便说一句,你在docker compose logs-f jobs中看到了什么?@Satevg logs只显示芹菜加工信息,没有关于Django的信息。你可以尝试使用分号代替&&
。看,芹菜可能不会返回成功代码,但那是另一个problem@Satevg你的第一个评论给了我答案:就是你提到的例子,我需要分开服务。谢谢你的提示!芹菜和uwsgi进程之间没有直接的依赖关系,所以分号可以,您可以在同一个容器中进行尝试。但是最好确定这些服务是分开的。稍微重构一下你的配置(DRY;))参见jobs
service definition
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
CACHE_URL=redis://redis:6379/0
CELERY_BROKER_URL=redis://redis:6379/1