在这里使用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