我创建了一个在Docker容器中运行的Django应用程序。我需要在Django应用程序中创建一个线程,所以我使用Celery和Redis作为Celery数据库。 如果我在docker镜像(Ubuntu 14.04)中安装redis:
RUN apt-get update && apt-get -y install redis-server
RUN pip install redis
Redis服务器未启动:Django应用程序抛出异常,因为端口6379上的连接被拒绝。如果我手动启动Redis,它就可以工作。
如果我使用以下命令启动Redis服务器,它会挂起:
RUN redis-server
如果我尝试调整上一行,它也不起作用:
RUN nohup redis-server &
所以我的问题是:有没有办法在后台启动Redis并在重启Docker容器时重启?
Docker"最后一个命令"已经用于:
CMD uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi
答案 0 :(得分:4)
use supervisord将控制这两个进程。 conf文件可能如下所示:
...
[program:redis]
command= /usr/bin/redis-server /srv/redis/redis.conf
stdout_logfile=/var/log/supervisor/redis-server.log
stderr_logfile=/var/log/supervisor/redis-server_err.log
autorestart=true
[program:nginx]
command=/usr/sbin/nginx
stdout_events_enabled=true
stderr_events_enabled=true
答案 1 :(得分:3)
Private Sub oLoadedDisplays_Changed()
If RtDisplayLoaded(sBotNavButton_1_1_Display) Then
Call ArrangeFooter(1, 1)
...
End Sub
命令仅添加新图像图层。它们不会在运行时执行。仅在图像的构建时间内。
请改用RUN
。您可以通过将多个命令外部化为由CMD
调用的shell脚本来组合多个命令:
CMD
在CMD start.sh
脚本中,您可以编写以下内容:
start.sh
答案 2 :(得分:3)
当您运行Docker容器时,总会有一个顶级进程。当您启动笔记本电脑时,该顶级流程是一个" init"脚本,systemd等。 docker镜像具有ENTRYPOINT指令。这是在您的docker容器中运行的顶级进程,您要运行的任何其他内容都是其中的子进程。为了在单个Docker容器中运行Django,Celery Worker和Redis,您必须运行一个进程,将所有这三个作为子进程启动。正如米兰所解释的那样,你可以设置一个Supervisor配置来执行它,并启动supervisor作为你的父进程。
另一种选择是实际启动init系统。这将使您非常接近您想要的东西,因为它基本上会运行,就像您拥有一个完整的虚拟机一样。但是,你通过这样做会失去许多集装箱化的好处:)
最简单的方法是使用Docker-compose运行多个容器。 Django的一个容器,一个用于Celery工作器的容器,另一个用于Redis的容器(以及一个用于数据存储的容器?)很容易设置。例如......
# docker-compose.yml
web:
image: myapp
command: uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi
links:
- redis
- mysql
celeryd:
image: myapp
command: celery worker -A myapp.celery
links:
- redis
- mysql
redis:
image: redis
mysql:
image: mysql
这将为您的四个顶级流程提供四个容器。 redis和mysql将以dns名称" redis"和" mysql"在你的app容器中,所以不要指向" localhost"你指向" redis"。
Docker-compose docs上有很多好消息