在進行容器編排時,我們經常會遇到需要同時執行多個腳本的情況。特別是當 CMD 和 ENTRYPOINT 腳本位於不同的映像中時,如何同時運行它們成為一個需要解決的問題。在這種情況下,我們可以透過使用多階段建置來實現同時執行這兩個腳本的目的。首先,我們需要在一個映像中編寫一個腳本,該腳本將同時執行 CMD 和 ENTRYPOINT 腳本。然後,我們可以使用 Dockerfile 的多階段建置功能,將這個腳本複製到最終的映像中,並在容器啟動時執行它。透過這種方式,我們可以實現同時執行 CMD 和 ENTRYPOINT 腳本的需求,提高容器的靈活性和可擴充性。
我正在使用 docker 多階段構建,並嘗試向我的 dockerized go 應用程式添加即時重新載入功能。我在第二張圖片中有一個 entrypoint.sh ,它有自己的配置。
現在,問題是第一個映像中的指令cmd ["air", "-c", ".air.toml"]
被entrypoint ["/entrypoint.sh" ]
腳本覆蓋第二張圖片,所以只有entrypoint
啟動了,cmd
沒有運行。
我無法像這樣將它們組合成唯一的命令
entrypoint ["/entrypoint.sh", "air", "-c", ".air.toml"]
#因為第二個映像沒有安裝 golang 語言以及對應的函式庫。
是否可以以某種方式並行運行 cmd
和 entrypoint
?謝謝。
dockerfile
from golang:1.17.2 copy . /go/src/sample workdir /go/src/sample run go install github.com/go-delve/delve/cmd/dlv@latest run go install github.com/cosmtrek/air@latest cmd ["air", "-c", ".air.toml"] from eclipse-temurin:17-focal copy entrypoint.sh /entrypoint.sh run chmod +x /entrypoint.sh entrypoint ["/entrypoint.sh"]
docker-compose.yml
version: '3' services: go: build: context: ./backend dockerfile: Dockerfile volumes: - ./backend:/go/src/backend working_dir: /go/src/backend ports: - 8080:8080
讀取傳遞給入口點(即 cmd)的參數。
例如,以下是您的入口點腳本。您可以存取參數並用它們做一些事情,即執行它們。
#!/bin/bash # dome something in your entrypoint # execute the original command # substituting the current process id # so that command is run with pid 1 exec "$@"
在您的 docker 映像中,確保您具有所需的命令,即
entrypoint ["/entryppoint.sh"] cmd ["echo", "command"]
除了這個技術方面之外,您似乎暗示您想要運行依賴 go 可用的 cmd,而無需 go 可用。這是不可能的。您需要確保您嘗試執行的內容及其相依性可用。
您也許可以從第一階段複製空氣二進位。像這樣的東西。
COPY --from=0 /go/bin/air /usr/local/bin/air
您可能想要使用 cgo_enabled=0
來編譯 air
。
但是,我假設您需要在映像中存在 go 編譯器才能使熱重載正常工作,因為您的應用程式需要在程式碼更改時重新編譯。因此,也許您甚至不應該在這裡使用多階段。
那個,說。在容器中進行熱重載似乎有點像反模式。容器通常是分發工件的一種方式。
以上是如果 CMD 和 ENTRYPOINT 腳本位於不同的映像中,如何同時執行它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!