首页 > 解决方案 > 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. 为什么进程在初始命令后退出,我怎样才能初始化数据结构而不让它退出?

标签: dockerredisdocker-compose

解决方案


commandDocker 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

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


推荐阅读