首页 > 解决方案 > Bash - 连接到 Docker 容器并在 redis-cli 中执行命令

问题描述

我正在尝试创建一个简单的脚本,它将:

  1. 连接到 docker 容器的 BASH shell
  2. 进入redis-cli
  3. flushall在 redis-cli 中执行命令

到目前为止,我有这个docker_script.sh(这基本上复制了手动程序):

docker exec -it redis /bin/bash
redis-cli
flushall

但是,当我运行它时,它只连接到容器的 BASH shell,不执行任何其他操作。然后,如果我输入exit容器的 BASH shell,它会输出:

root@5ce358657ee4:/data# exit
exit
./docker_script.sh: line 2: redis-cli: command not found
./docker_script.sh: line 3: keys: command not found

当我手动执行相同的过程时,为什么command not foundif 命令redis-cliflushall存在并且正在容器中工作?如何通过创建这么小的 BASH 脚本来“自动化”它?

谢谢

标签: bashdockerredis

解决方案


似乎您正在尝试/bin/bash在 redis 容器中运行,而redis-cliandflushall命令在您当前的 shell 实例中安排在之后。尝试将您的redis-cli命令传递给 bash,如下所示:

docker exec -it redis /bin/bash -c "redis-cli FLUSHALL"

-c用于告诉 bash 从字符串中读取命令。

页面摘录man

-c string If the -c option is present, then commands are read from
                 string.   If  there are arguments after the string, they
                 are assigned to the positional parameters, starting with
                 $0.

要在评论中回答您的进一步问题,您需要运行一个脚本redis_flushall.sh来运行该命令。该文件的内容是:

docker exec -it redis /bin/bash -c redis-cli auth MyRedisPass; flushall

打破它,您将调用redis-cli auth MyRedisPass作为 bash 命令和flushall另一个 bash 命令。问题是,flushall不是一个有效的命令,你想调用redis-cli flushall instead. 命令链是必须在 CLI 应用程序中特意实现的东西,而不是从裂缝中掉出来的东西。

如果您将脚本的内容替换为以下内容,它应该可以工作,即在指定命令之前;添加redis-cli调用之后。flushall

docker exec -it redis /bin/bash -c redis-cli auth MYSTRONGPASSWORD; redis-cli FLUSHALL

推荐阅读