在Docker容器内访问Redis CLI

47

我已经在一个docker容器中运行了Redis

docker run --rm -d --name "my_redis" redis

我想通过CLI访问它:

如果我运行命令docker exec -it my_redis redis-cli,控制台会变得无响应,直到我离开容器(Ctrl + P,Ctrl + Q)

C:\Users\Andrzej>docker exec -it my_redis redis-cli
// nothing here until I go Ctrl + P, Ctrl + Q
exec attach failed: error on attach stdin: read escape sequence
C:\Users\Andrzej>

如果我运行docker exec -it my_redis sh,然后从容器内部运行redis-cli,它可以正常工作。


C:\Users\Andrzej>docker exec -it my_redis sh
# redis-cli
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379>

我的操作系统是Windows 10。

有没有办法修复docker exec -it my_redis redis-cli的行为?

更新

当控制台失去响应并且我点击“向上箭头”键11次时,我可以进入Redis cli。 这是100%可重复的。这是什么魔法?


尝试使用其他终端,例如https://conemu.github.io/。 - Ortomala Lokni
@OrtomalaLokni 仍然是一样的(cmd,powershell,mingw) - Andrzej Gis
6个回答

88
在后台模式下运行一个Redis容器:
docker run -d redis

在它上运行redis-cli

docker exec -it e0c061a5700bfa400f8f24b redis-cli

其中 e0c061a5700bfa400f8f24b 是容器的id。

根据文档:

Detached (-d)

要以分离模式启动容器,您可以使用 -d=true 或只有 -d 选项。按设计,以分离模式启动的容器会在用于运行容器的根进程退出时退出,除非您同时指定 --rm 选项。如果您使用 -d 和 --rm,则容器将在其退出或守护进程退出时(以先到者为准)被删除。

.

--interactive , -i 即使未连接也保持STDIN打开

--tty , -t 分配一个伪终端


我应该提到我如何实例化我的容器。它确实是处于分离状态。请查看更新。 - Andrzej Gis
这个命令在 (Laravel) Sail 中同样适用。 - bito_

24
  1. 以6379端口、名称为redis、后台运行模式启动redis容器。

docker run --name redis -p 6379:6379 -d redis

  1. 在容器中运行redis-cli命令。

docker exec -it redis redis-cli


1
通常不推荐仅提供代码的答案,您还应该解释代码是如何解决问题的,特别是在已有其他答案的情况下。 - rmlockerd

10
首先,容器可以是一个多命令容器,创建后可选运行CLI(命令行界面)。 enter image description here 如果您想启动CLI,需要以某种方式进入容器并执行第二个命令。 您需要在容器内启动第二个程序。
要在容器中运行redis-cli,需要使用另一个docker命令:

enter image description here

"

exec是execute的缩写,我们用它在容器内执行额外的命令,因此请写下docker exec,然后加上破折号IT。

-it参数允许我们直接在容器中输入命令,然后我们提供容器ID和要在容器内执行的命令。

sudo docker exec -it container_id redis-cli

"

enter image description here

如果你不使用-it,你将直接被踢回,因为Redis CLI已经启动,但是你没有输入任何文本的能力。

2

除了其他答案之外,另一种替代方法:

docker exec -it <your_redis_container_id> sh

#redis-cli //输入 # 后跟随 redis-cli 命令来运行 redis-cli

127.0.0.1:6379>你的 redis-cli 命令 ...

#exit //需要退出 redis-cli 时,输入 exit 命令


1
如果你在Windows上通过Docker运行Redis,你可以像这样打开CLI命令行界面。

enter image description here

然后输入redis-cli来获取Redis客户端。

enter image description here


1
如果您想将"redis-server"容器与"redis-cli"容器分开,该怎么办?如果您希望redis-cli容器能够与redis-server容器进行通信,您将需要使用Docker网络技术。
docker network create redis-net
docker run -it --rm --network redis-net --name redis-server -d redis
docker run -it --rm --network redis-net redis redis-cli -h redis-server ping

注意:Docker标志值--name(容器名称)用作-h(Redis主机)redis-cli标志的输入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接