【问题标题】:Bash - Connect to Docker container and execute commands in redis-cliBash - 连接到 Docker 容器并在 redis-cli 中执行命令
【发布时间】:2021-12-06 05:08:04
【问题描述】:

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

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

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

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

但是,当我运行它时,它只连接到容器的 BASH shell,并没有做任何其他事情。然后,如果我在容器的 BASH shell 中输入 exit,它会输出:

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

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

谢谢

【问题讨论】:

  • 您需要docker exec 步骤还是中间shell;你能从主机运行redis-cli,连接到容器的发布端口吗?

标签: bash docker redis


【解决方案1】:

似乎您正尝试在 redis 容器内运行 /bin/bash,而 redis-cliflushall 命令在您当前的 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.

要回答您在 cmets 中的进一步问题,您需要运行单个脚本 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

【讨论】:

  • 谢谢!这有帮助。我想到的最后一个问题可能是:我如何传递一个由多个单词组成的命令?例如,如果我想通过发出 auth MyStrongPassword 之类的命令在 redis 中进行身份验证,我如何正确地将其传递给 -c 选项,而不是让它认为它是 2 个单独的命令(authMyStrongPassword )?
  • 据我所知,除非您用&&; 将它们分开,否则它不会认为这是两个单独的命令。由于 bash 接受多字命令,正如我们在 redis-cli FLUSHALL 中看到的那样,因此解析器不会将 auth MyStrongPassword 视为两个单独的命令。
  • 感谢您的回复,但似乎并非如此。如果我修改我的脚本看起来像这样:docker exec -it redis /bin/bash -c "redis-cli auth MyStrongPassword FLUSHALL",然后如果我执行它,它会返回:(error) WRONGPASS invalid username-password pair or user is disabled.。但是,如果我手动执行相同的命令,我可以在 redis-cli 中验证自己。
  • 你是如何执行的?打开一个到 redis 的 bash 交互式会话并运行该命令会给我同样的错误。将此命令用于 bash -c 似乎有效:docker exec -it redis /bin/bash -c redis-cli auth MYSTRONGPASSWORD; redis-cli FLUSHALL
  • 这些是我的redis_flushall.sh Bash 脚本的内容:docker exec -it redis /bin/bash -c redis-cli auth MyRedisPass; flushall。但是,当我运行 redis_flushall.sh 脚本时,它只是在 redis-cli 命令处结束,没有经过身份验证,也没有刷新 Redis DB。
猜你喜欢
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多