我有一个简单的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 作为守护程序运行?
作者的回答
TL:DR
Stackoverflow中有一个非常相似的问题,有助于解决我的问题:
- 在 nodejs Docker 镜像上运行 redis
问题在于DockerENTRYPOINT
或CMD
应该"生成单个进程"。我将 Redis 启动和节点init.js
执行作为不同的程序放入supervisord
中。提供supervisord.conf
例如:
[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
我为什么要这样做?
我对这个问题的主要麻烦是误解了实际上什么是Docker容器。在 Docker 中ENTRYPOINT
或CMD
什么。我认为我应该"在Docker中运行一些服务器并公开一些端口,Docker将自己做所有事情",但这不是容器的工作方式。容器和 VM 之间存在差异。看看这个:Docker与虚拟机有什么不同?
当将 Docker 容器视为单个进程的包装时,很明显,用我的Dockerfile
编写的代码不会以我预期的方式工作。
如果需要在 Docker 容器中运行多个进程,那么您应该使用supervisord
或concurrently
之类的东西(如果您更喜欢Node
生态系统(。