【问题标题】:Use here document with ENTRYPOINT/CMD in Dockerfile在 Dockerfile 中使用带有 ENTRYPOINT/CMD 的此处文档
【发布时间】: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 太可怕了,因为人们坚持要增加更多 +1 cmets,而不是仅仅在现有评论上使用“竖起大拇指”来表达他们对这一改进的支持。
  • 谢谢,我已经遇到过这个讨论,但仍然认为必须有一种方法可以将 here-docs 用于 ENTRYPOINT 或 CMD。我真的很惊讶它没有。

标签: bash shell docker dockerfile


【解决方案1】:

这是行不通的,因为 shell 会解析命令行,包括执行它之前 的 heredoc。

基本上你可以这样做:

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

构建并运行容器:

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

您使用 Ctrl+d 停止输入(字面意思是 EOF)


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

docker run -i foo <<EOF
Hello Docker
EOF

Hello Docker

【讨论】:

  • 谢谢,第二个是个好主意。我可以在命令行上传递 here-doc 对我来说似乎有点奇怪,但同样的事情不适用于 CMD。实际上,我至少希望 shell 形式可以工作。
  • 好吧,同样在命令行你不能运行bash -c 'cat &lt;&lt;EOF'。这只是语法错误。
  • 对。我只是想知道为什么终端中的sh -c cat &lt;&lt; EOF 可以工作,而 Dockerfile 中的CMD "cat &lt;&lt; EOF" 却不行。不知道此 get 已评估为 sh -c 'cat &lt;&lt; EOF'
猜你喜欢
  • 2021-11-30
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 2017-08-31
  • 1970-01-01
  • 2019-02-09
  • 2022-12-09
相关资源
最近更新 更多