【发布时间】:2017-12-10 18:37:15
【问题描述】:
我想做什么
我的目标是最终得到一个 Docker 映像——一旦从它启动容器——从标准输入读取输入,直到它遇到 EOF。然后,它只是将已读取的内容写回标准输出。
基本上,我的想法是,这应该可以通过使用此处的文档语法cat << EOF 来实现。
到目前为止我做了什么
到目前为止,我使用 CMD Dockerfile 指令尝试了不同的变体,但直到现在都没有成功。从我创建的所有图像中,我使用docker run -it myimage 启动了容器以保持容器的标准输入。
变体 1
FROM alpine 3.7
CMD ["cat", "<<", "EOF"]
这会导致以下错误:
cat: can't open '<<': No such file or directory
cat: can't open 'EOF': No such file or directory
变体 2
FROM alpine 3.7
CMD ["cat << EOF"]
结果:
container_linux.go:265: starting container process caused "exec: \"cat << EOF\": executable file not found in $PATH"
变体 3
FROM alpine:3.7
CMD ["sh", "-c", "cat << EOF"]
结果:
这什么也不做,只是立即返回。
变体 4
FROM alpine: 3.7
CMD "cat << EOF"
结果:
/bin/sh: cat << EOF: not found
我的期望
我正在寻找与上述行为类似的解决方案。以下docker run 命令完美运行,但我想将其定义为我的 Docker 映像的默认入口点:
$ docker run -it alpine cat << EOF
> Hello Docker
> EOF
Hello Docker
【问题讨论】:
-
在 Dockerfiles 中支持 heredocs 是一项长期存在的功能请求,但仍不受支持。 github.com/moby/moby/issues/1554 太可怕了,因为人们坚持要增加更多
+1cmets,而不是仅仅在现有评论上使用“竖起大拇指”来表达他们对这一改进的支持。 -
谢谢,我已经遇到过这个讨论,但仍然认为必须有一种方法可以将 here-docs 用于 ENTRYPOINT 或 CMD。我真的很惊讶它没有。
标签: bash shell docker dockerfile