首頁  >  文章  >  後端開發  >  如果 CMD 和 ENTRYPOINT 腳本位於不同的映像中,如何同時執行它們?

如果 CMD 和 ENTRYPOINT 腳本位於不同的映像中,如何同時執行它們?

王林
王林轉載
2024-02-09 08:57:321175瀏覽

如果 CMD 和 ENTRYPOINT 脚本位于不同的映像中,如何同时运行它们?

在進行容器編排時,我們經常會遇到需要同時執行多個腳本的情況。特別是當 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 語言以及對應的函式庫。

是否可以以某種方式並行運行 cmdentrypoint ?謝謝。

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除