在守护程序不运行时运行 redis 的 docker 容器



我有一个简单的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

问题在于DockerENTRYPOINTCMD应该"生成单个进程"。我将 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 中ENTRYPOINTCMD什么。我认为我应该"在Docker中运行一些服务器并公开一些端口,Docker将自己做所有事情",但这不是容器的工作方式。容器和 VM 之间存在差异。看看这个:Docker与虚拟机有什么不同?

当将 Docker 容器视为单个进程的包装时,很明显,用我的Dockerfile编写的代码不会以我预期的方式工作。

如果需要在 Docker 容器中运行多个进程,那么您应该使用supervisordconcurrently之类的东西(如果您更喜欢Node生态系统(。

最新更新