簡體   English   中英

將此處文檔與Dockerfile中的ENTRYPOINT / CMD一起使用

[英]Use here document with ENTRYPOINT/CMD in Dockerfile

我想做的事

我的目標是最終得到一個Docker映像,該映像在容器啟動后立即從stdin讀取輸入,直到遇到EOF。 然后,它僅將已讀取的內容寫回stdout。

基本上,我的想法是應該可以通過使用此處文檔的語法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 run ,但我想將此定義為Docker映像的默認入口點:

 $ docker run -it alpine cat << EOF
 > Hello Docker
 > EOF
 Hello Docker

這是行不通的,因為外殼程序會在執行命令行之前解析命令行,包括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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM