在这里使用Dockerfile中的ENTRYPOINT / CMD文件

我想做的事

我的目标是最终得到一个Docker镜像,只要一个容器从它启动,就从标准input读取input,直到遇到EOF。 然后,它只是写回已经读取到标准输出。

基本上,我的想法是这应该是可能的通过使用这里的文档语法cat << EOF

我到目前为止做了什么

到目前为止,我使用CMD Dockerfile指令尝试了不同的变体,但直到现在才成功。 从我创build的所有图像中,我启动了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 

我期望的

我正在寻找一种像上面描述的那样的解决scheme。 以下docker run命令完美工作,但是我想将其定义为Docker镜像的默认入口点:

  $ docker run -it alpine cat << EOF > Hello Docker > EOF Hello Docker 

这是行不通的,因为shellparsing命令行,包括heredoc 执行之前

基本上你可以这样做:

 # Dockerfile FROM xyz # cat reads from stdin by default if no filename gets passed to it CMD 'cat' 

构build并运行容器:

 docker build -t foo . docker run -ti foo HelloDocker HelloDocker 

你停止inputCtrl + D (这是字面上的EOF)


PS:如果你想使用here-doc,像这样运行上面的容器:

 docker run -i foo <<EOF Hello Docker EOF Hello Docker