bash - 在 Dockerfile 中使用此处文档和 ENTRYPOINT/CMD

标签 bash shell docker dockerfile

我想做什么

我的目标是最终得到一个 Docker 镜像,一旦容器启动,它就会从 stdin 读取输入,直到遇到 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

最佳答案

这是行不通的,因为 shell 会在执行命令行之前解析命令行,包括这里文档。

基本上你可以这样做:

# 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:如果您想使用此处文档,请像这样运行上面的容器:

docker run -i foo <<EOF
Hello Docker
EOF

Hello Docker

关于bash - 在 Dockerfile 中使用此处文档和 ENTRYPOINT/CMD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742146/

相关文章:

shell - 针对特定php恶意软件模式的Grep

php - 为 mysql 5.6 安装提供 shell 脚本在 Vagrant 中不起作用

angular - 可以将env变量从docker-compose.yml传递给dockerfile吗?

linux - 扫描多个文件扩展名并在找到时复制到新目录

bash - 我在这里对这些变量做错了什么?

regex - sed 在两个字符串之间替换通配符

mysql - 如何在 mySQL 命令行查询中使用 $RANDOM (linux)?

python - 在 GitLab 中导入 ZAP Docker 镜像

docker - Superset 1.0 报告未运行 (docker)

bash - 重命名子目录中的所有文件,同时保持相同的位置