簡體   English   中英

使用 docker-compose up 在容器啟動開始時運行附加命令

[英]run an additional command beginning of container startup with docker-compose up

如果我在docker-compose.yml中有一個包含多個容器的應用程序,我將使用docker-compose up 這些容器繼承自標准基礎映像,並在其各自的Dockerfile中進行了一些調整 - 例如,安裝了一些附加軟件包的 elasticsearch 映像。

如何調整Dockerfiledocker-compose.yml以便我可以插入要先運行的命令? 例如,諸如echo ${NEW_ENV_VAR}sleep 20之類的東西。

我查看了 docker 文檔/堆棧帖子,並嘗試了CMDENTRYPOINT ,但沒有成功。 通常這些嘗試會導致命令運行,但沒有發生預期的后續容器行為(例如, 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.

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