首页 > 解决方案 > 带有作为守护进程运行的 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作为守护进程运行?

标签: node.jsdockerredis

解决方案


作者的回答

TL:博士

Stackoverflow 中有一个非常相似的问题有助于解决我的问题:

问题在于 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 中做什么ENTRYPOINT或做什么。CMD我认为我应该只是“在 Docker 中运行一些服务器并公开一些端口,然后 Docker 会自己做所有事情”,但这不是容器的工作方式。容器和虚拟机之间是有区别的。看看这个:Docker 与虚拟机有何不同?

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

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


推荐阅读