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中运行此命令,它会起作用。

所以,我有两个问题:

  1. 为什么set和get命令不起作用,而redis-cli --help起作用?

  2. 为什么进程在初始命令之后退出,以及我如何初始化数据结构而不让它退出?

Docker Compose文件中的command指令映射到Dockerfile中的CMD指令,这是容器在启动时将执行的唯一命令(在启动容器时,该命令总是可以被覆盖,这就是设置该选项时Docker Compose在后台执行的操作(。

对于目的是启动Redis服务器的Redis容器,该命令应该始终是实际启动服务器的命令。当您重写它以运行redis-cli命令时,服务器不会出现,因此客户端无法连接,您会看到错误。redis-cli的--help选项不会打开连接,这就是它不会出错的原因(回答您的问题#1(。

对于问题#2,请参阅上文,了解为什么进程在command运行后退出。为了真正解决你的问题,有很多选择,但我建议使用第二个容器,它只运行一个脚本,a(等待Redis可访问,b(一旦可访问,就初始化数据结构,尽管您可以只使用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

从本地测试来看,这是可行的,尽管我不能说它在每个系统上的可靠性。

最新更新