[英]run an additional command beginning of container startup with docker-compose up
如果我在docker-compose.yml
中有一個包含多個容器的應用程序,我將使用docker-compose up
。 這些容器繼承自標准基礎映像,並在其各自的Dockerfile
中進行了一些調整 - 例如,安裝了一些附加軟件包的 elasticsearch 映像。
如何調整Dockerfile
或docker-compose.yml
以便我可以插入要先運行的命令? 例如,諸如echo ${NEW_ENV_VAR}
或sleep 20
之類的東西。
我查看了 docker 文檔/堆棧帖子,並嘗試了CMD
和ENTRYPOINT
,但沒有成功。 通常這些嘗試會導致命令運行,但沒有發生預期的后續容器行為(例如, echo ${NEW_ENV_VAR}
運行,但 elasticsearch 沒有啟動)。
您使用的圖像將定義自己的CMD
- 當您執行docker run <image>
(或在您的撰寫文件中使用它)時,這就是將執行的內容。
(事實上,如果你喜歡使用命令,你可以在 compose 文件中修改command:
-語法參考這里)
當您創建FROM <image>
構建的新Dockerfile 時,您不會繼承CMD
。 因此,如果要運行原始命令,則需要找出它是什么。
可悲的是,這總是需要一些搜索。 例如, 這些文檔為您提供了有關 elasticsearch 圖像的一些信息:
入口點:["/bin/tini","--","/usr/local/bin/docker-entrypoint.sh"]
命令:[“eswrapper”]
對我來說,這似乎表明完整的啟動順序是/bin/tini -- /usr/local/bin/docker-entrypoint.sh eswrapper
。
也許最好的解決方案是創建一個小的 shell 腳本來執行您的自定義命令,然后執行此啟動命令,並通過新的CMD
調用該腳本?
(這比嘗試將單獨的命令塞進CMD
)
另一個建議是,在您給出的示例中,這兩個命令似乎彼此分離 - 即實際上沒有理由在同一個容器中運行它們,只是一個必須在另一個之前運行。
如果情況確實如此(也許在實踐中不是這樣),您可能希望通過 compose 運行現成的映像,但指定它依賴於另一個將簡單地運行命令的容器。
如果命令是sleep
(依賴於容器啟動,而不是運行到完成),這可能不合適,但如果它是echo
則可能沒問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.