我正试图在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
起作用?为什么进程在初始命令之后退出,以及我如何初始化数据结构而不让它退出?
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
从本地测试来看,这是可行的,尽管我不能说它在每个系统上的可靠性。