在另一个容器docker中执行另一个container命令

时间:2018-04-27 16:28:27

标签: docker go redis docker-compose

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

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

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

2 个答案:

答案 0 :(得分:1)

构建应用程序泊坞窗映像时,请确保已安装redis客户端和bash, 根据基本图像,您可以使用apk add bash或apt-get install -y bash。例如,如果您使用的是高山基础图像,则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"]

答案 1 :(得分: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}`