【问题标题】:Execute another containers command in another container docker在另一个容器 docker 中执行另一个容器命令
【发布时间】:2018-10-08 13:16:08
【问题描述】:

我有 2 个容器:一个 Redis 容器和一个用于 Golang 应用程序的容器。我的 Golang 应用程序正在尝试通过使用命令 cat ${FILE}| redis-cli --pipe -h ${HOST} 执行 bash 脚本来执行 Redis 批量插入 (https://redis.io/topics/mass-insert)。

但是,redis-cli 在 PATH 系统变量中找不到,它不是 Golang 应用程序服务中的内置 shell 命令。

因此,我得到一个exit status 127,这意味着找不到给定的命令。我想知道如何在 Golang 应用程序服务中不使用 redis-cli 命令执行 bash 脚本。

【问题讨论】:

  • 需要更多信息。该命令是否需要从容器内运行?还是从 docker 主机服务器运行命令?这两个容器是否在同一个主机服务器上?
  • 是的,redis-cli 命令需要在同一个容器中运行
  • 是的,这两个容器在同一个主机服务器上(我的本地主机)
  • 可以从主机服务器而不是从 golang 应用容器中运行命令吗?
  • 这绝对可以,但我想知道后者是否可行。

标签: docker go redis docker-compose


【解决方案1】:

只有在重建 go 应用程序映像并安装 redis cli 工具后,才能从应用程序容器中运行命令。 使用基于 ubuntu 的图像的示例(将其添加到 Dockerfile): RUN apt update; apt -y install redis-tools 如果您使用的是 docker compose,则可以使用 docker compose 文件中指定的名称与您的 redis 服务器通信。

cat ${FILE}| redis-cli --pipe -h redis-server

假设您如本示例所示命名您的 redis 容器

version: '3'
services:
  redis-server:
    image: xxx
[...]

或者,如果你想从主机服务器运行命令,你必须确保你从 redis 容器转发 redis 端口,然后你可以使用:

docker exec {containerId} 'cat {FILE}' | redis-cli --pipe -h localhost:{REDIS_CONTAINER_PORT}`

【讨论】:

  • 谢谢。你能告诉我如何在高山映像上安装 redis。我正在使用golang:1.10.1-alpine3.7。我试过RUN apk add --no-cache redis,但我仍然找不到 redis-cli 命令
【解决方案2】:

当您构建应用程序 docker 映像时,请确保您已安装 redis 客户端和 bash, 根据基本映像,您可以使用 apk add bash 或 apt-get install -y bash。例如,如果您使用 alpine 基础映像,您的 Docker 文件可能如下所示:

Dockerfile

FROM golang:1.10.1-alpine3.7

RUN apk add --no-cache ca-certificates bash redis
RUN apk add --update tzdata curl && rm -rf /var/cache/apk/*
ADD myapp /
CMD ["myapp"]

【讨论】:

  • 嘿!我认为RUN apk add -y redis-toolsapk: unrecognized option: y
  • 抱歉,ERROR: unsatisfiable constraints: redis-tools (missing): required by: world[redis-tools] 也失败了
  • 我正在使用图片golang:1.10.1-alpine3.7
  • pkgs.alpinelinux.org/…好像alpine已经打包了叫redis,
猜你喜欢
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
相关资源
最近更新 更多