问题1:
celery任务队列一般要使用redis,但是容器内的django要访问本机的redis是十分麻烦的
解决2:
在容器内安装redis,或者单独启动一个redis的容器,我是单独启动一个redis容器
- 安装redis镜像
docker pull redis
- 启动redis容器
docker run -d --name redis_container redis
- 查看redis的IP `docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" redis_container
- 我的redis容器IP是172.17.0.2,在django中配置redis
python
setting.py
# Redis 缓存配置
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://172.17.0.2:6379/0', # Redis 服务器连接信息
# 'LOCATION': 'redis://:1234qwer@127.0.0.1:6379/0', # Redis 服务器连接信息
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
# 使用 Redis 缓存作为默认缓存后端
CACHE_BACKEND = 'django_redis.cache.RedisCache'
celery.py
# 设置 Redis 作为任务队列和结果后端
app.conf.broker_url = 'redis://172.17.0.2:6379/5'
app.conf.result_backend = 'redis://172.17.0.2:6379/4'
目前redis可以正常访问,我的redis缓存使用正常
问题2:
如何启动容器内的celery任务队列
解决2:
试过很多方法,包括在Dockerfile中启动一个.sh文件(同时有启动django和任务队列的命令,Dockerfile只能写一个cmd命令)但是效果都不好,最终的方法是在根目录创建.sh文件,使用docker命令行访问这个文件
- 在django根目录下创建start_celery.sh
- 在.sh文件写入命令行
python
#!/bin/bash
celery -A RemoteCut worker -l info -P eventlet
- Dockerfile中设置
- 在这里插入代码片
python
# 设置工作目录
WORKDIR /remote_cut
# 复制项目文件到容器中
COPY . /remote_cut
COPY ./RemoteCut/settings.py /remote_cut/RemoteCut/
COPY ./start_celery.sh /remote_cut/
- 命令行启动任务队列
python
docker exec -it 容器名称或者容器id /remote_cut/start_celery.sh