docker - Docker Redis 容器 - 命令选项
问题描述
我正在尝试在 Docker 中创建一个 Redis 容器并运行一个命令来初始化数据结构。但我什至无法得到一个简单的命令喜欢redis-cli SET counter "4"
工作。
但即使使用类似的命令redis-cli --help
,它也不起作用。似乎在任何命令之后,它都存在于以下行中:
sockets_server_redis_1 exited with code 1
当我使用以下任一行时:
command: "redis-cli SET counter \"4\" && redis-cli GET counter"
command: sh -c "redis-cli SET counter \"4\" && redis-cli GET counter"
我得到的完整输出是:
Attaching to sockets_server_redis_1
redis_1 | Could not connect to Redis at 127.0.0.1:6379: Connection refused
sockets_server_redis_1 exited with code 1
这是我的 docker-compose.yml 文件:
version: "3.8"
services:
redis:
image: redis
command: "redis-cli SET counter \"4\" && redis-cli GET counter"
ports:
- 6379:6379
但是,如果我通过 Docker 在 CLI 中运行此命令,它就可以工作。
所以,我有两个问题:
为什么 set 和 get 命令不起作用但
redis-cli --help
有效?为什么进程在初始命令后退出,我怎样才能初始化数据结构而不让它退出?
解决方案
command
Docker Compose 文件中的指令映射到 Dockerfile 中的CMD指令,这是容器在启动时将执行的唯一命令(启动容器时该命令总是可以被覆盖,这就是 docker-compose设置该选项时在后台执行)。
对于以启动 Redis 服务器为目的的 Redis 容器,命令应该始终是实际启动服务器的命令。当您覆盖它以运行 redis-cli 命令时,服务器不会启动,因此客户端无法连接,您会看到遇到的错误。redis-cli的--help
选项不会打开连接,这就是它不会出错的原因(回答你的问题 #1)。
对于问题 #2,请参阅上文,了解进程在运行后退出的原因command
。要真正解决您的问题,有多种选择,但我建议使用第二个容器,它只运行一个脚本,a) 等待 Redis 可以访问,b) 一旦完成就初始化数据结构。像wait-for-it这样的实用程序可以使步骤 A 变得更容易,尽管您可能只使用 Compose 的默认depends_on
功能(它不会等待实际服务准备好,只是等待容器准备好,但 Redis 非常适合迅速地):
version: "3.8"
services:
redis:
image: redis
ports:
- 6379:6379
redis_init:
image: redis # we need an image with redis-cli available, so might as well re-use it
command: "redis-cli -h redis SET counter \"4\""
depends_on:
- redis
从本地测试来看,这是可行的,但我不能说它在每个系统上的可靠性如何。
推荐阅读
- regex - Notepad ++删除某些单词之间的空格
- javascript - 获取 XML 响应时,JS 比较不起作用
- android - 在小部件中录制音频出现错误 Android Studio
- postgresql - pgbouncer - 关闭因为:来自登录查询的意外响应
- c++ - 为什么 libtorch 张量赋值需要这么多时间?
- c# - 在 C# 中合并两个对象的有效方法
- entity-framework-core - 在实体框架代码第一种方法中创建外键的问题
- mysql - 获取MySQL中多个表的UNION select的汇总行
- javascript - 如何为每个用户生成一个唯一的 URL 目录?
- css - 动态反应去除空间