如何在 docker run 上将数据通过管道传输到 dockerified 应用程序?

Posted

技术标签:

【中文标题】如何在 docker run 上将数据通过管道传输到 dockerified 应用程序?【英文标题】:How to pipe in data to dockerified app on docker run? 【发布时间】:2017-12-12 17:07:36 【问题描述】:

我已经通过这个Dockerfile dockerified httpie:

FROM alpine:3.6
MAINTAINER Philipp Kretzschmar <philipp.kretzschmar@gmail.com>
ENV LAST_UPDATED=2017-06-01
ARG XDG_CACHE_HOME=/tmp/cache/
RUN apk update && \
    apk add py-pip && pip install httpie && \
    rm -rf /var/cache/apk/*
CMD ["--help"]
ENTRYPOINT ["/usr/bin/http"]

也可以直接拉取图片:

docker pull k0pernikus/httpie-docker-alpine:1.0.0

使用 httpie 作为独立程序,我知道建议通过 echo(简化示例)在嵌套的 json 有效负载中管道:

$ echo '"property":"value"' | http PUT https://jsonplaceholder.typicode.com -vvv

并且通过详细的输出标志-vvv httpie 表明payload确实是在请求中发送的:

PUT /posts HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 21
Content-Type: application/json
Host: jsonplaceholder.typicode.com
User-Agent: HTTPie/0.9.9


    "property": "value"

(jsonplaceholder URL 会返回 404,这很好。这个问题的范围只是关于发送正确的请求。)

现在想来就相当于通过docker via执行命令了:

$ echo '"property":"value"' | docker run k0pernikus/httpie-docker-alpine:1.0.0 PUT https://jsonplaceholder.typicode.com -vvv

但是详细标志报告请求是在没有负载的情况下发送的:

PUT / HTTP/1.1
Content-Length: 0
Accept-Encoding: gzip, deflate
Host: jsonplaceholder.typicode.com
Accept: */*
User-Agent: HTTPie/0.9.9
Connection: keep-alive

如何将数据通过管道传输到docker run 命令?

【问题讨论】:

【参考方案1】:

您需要使用-i 标志到docker run 以保持stdin 处于打开状态。比较:

$ echo hello | docker run --rm alpine cat
$

收件人:

$ echo hello | docker run -i --rm alpine cat
hello
$

【讨论】:

我正要写我试过这个。然后我意识到,我正在将标志添加到 httpie 命令 m)

以上是关于如何在 docker run 上将数据通过管道传输到 dockerified 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Openshift平台上通过Jenkins管道运行docker-in-docker?

如何将 Kafka 消息通过管道传输到 docker 容器中?

如何在构建时链接 docker 容器?

如何在谷歌云构建中将参数传递给 docker run

如何通过管道将子进程调用传递给文本文件?

如何通过管道传输到文件(NodeJS)