在Dockerfile中使用带有ENTRYPOINT / CMD的文档

时间:2017-12-10 18:37:15

标签: bash shell docker dockerfile

我想做什么

我的目标是最终得到一个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 个答案:

答案 0 :(得分:4)

这是行不通的,因为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