我有简单的Dockerfile
FROM base
RUN <code which installs redis>
RUN npm install redis-adapter
EXPOSE 6379
ENTRYPOINT redis-server --daemonize yes && /app/tasks/redis/entrypoint.sh
在我的入口点中,我设置了一些配置键,并通过节点将一些数据设置为redis:
#!/bin/sh
redis-cli hset app:cfg env dev
redis-cli hset app:cfg maxconnections 1024
node /app/tasks/redis/init.js
图像构建成功,但是当我运行它时 - 没有任何反应。问题是什么?我应该怎么做才能在容器中运行redis并在之后进行一些配置?可能是麻烦在于我将redis作为守护进程运行?
答案 0 :(得分:0)
作者的答案
TL:DR
Stackoverflow中有一个非常相似的问题,可帮助解决我的问题:
问题在于Docker bar_i
或ENTRYPOINT
应该“产生单个进程”。我将Redis启动和节点CMD
的执行作为不同的程序放入init.js
中。提供supervisord
例如:
supervisord.conf
我为什么要这么做?
这个问题的主要麻烦在于误解了什么实际上是Docker容器。以及[supervisord]
nodaemon=true
loglevel=debug
[program:redis]
priority=1
command=redis-server
[program:configurations]
priority=2
command=/bin/sh -c /app/tasks/redis/entrypoint.sh
或ENTRYPOINT
在Docker中是什么。我以为我应该“将某些服务器运行到Docker中并暴露一些端口,而Docker将自己完成所有工作”。,但这不是容器的工作方式。容器和虚拟机之间是有区别的。看一下:How is Docker different from a virtual machine?
将Docker容器视为单个过程的包装时,似乎很清楚,用我的CMD
编写的代码无法按预期的方式工作。
如果需要在Docker容器中运行多个进程,则应使用Dockerfile
或supervisord
之类的东西(如果您更喜欢concurrently
生态系统)。