node.js - 带有作为守护进程运行的 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:博士
Stackoverflow 中有一个非常相似的问题有助于解决我的问题:
问题在于 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 会自己做所有事情”,但这不是容器的工作方式。容器和虚拟机之间是有区别的。看看这个:Docker 与虚拟机有何不同?
当将 Docker 容器视为一个单一进程的包装时,很明显用我编写的代码Dockerfile
不会按照我预期的方式工作。
如果需要在 Docker 容器中运行多个进程,那么您应该使用类似supervisord
或concurrently
(如果您更喜欢Node
生态系统)。
推荐阅读
- ember.js - Ember.js 服务与 ember-redux
- c# - Word 互操作在文档中查找使用的样式
- javafx - javafx 标签无法填充可用空间
- python - Executemany 给出“TypeError:格式字符串的参数不足”
- symfony - Symfony 3 和 FOSUser 2.1:错误注册控制器
- excel - TRUE() 函数的优点
- vba - 在另一个工作表上搜索之前选择列并过滤内容
- python - 如何使用 Errbot 正确配置单元测试?
- java - 为什么 HashSet 对单个字母字符进行排序?
- cuda - 带有转换复制崩溃的 CUDA 推力设备指针