我想做什么
我的目标是最终得到一个Docker镜像 - 一旦从它启动容器 - 从stdin读取输入直到它满足EOF . 然后,它只是将已读取的内容写回到stdout .
基本上,我的想法是使用here文档语法 cat << EOF
应该可以实现 .
到目前为止我做了什么
到目前为止,我尝试使用CMD Dockerfile指令的不同变体但直到现在都没有成功 . 从我创建的所有图像中,我使用 docker run -it myimage
启动容器以保持容器的stdin连接 .
变体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
1 回答
这是行不通的,因为shell会在执行它之前解析命令行,包括heredoc .
基本上你可以这样做:
构建并运行容器:
你用Ctrl d停止输入(这就是字面上的EOF)
PS:如果你想使用here-doc,运行上面这样的容器: