首页 文章

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

提问于
浏览
1

我想做什么

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

  • 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
    

相关问题