簡體   English   中英

Dockerfile:如何在 CP 中運行子命令?

[英]Dockerfile: How to run a subcommand in CP?

如何將此 bash 命令轉換為 Dockerfile?

cp $(stack exec which wai-crowd) /app

COPY $(stack exec which wai-crowd) /app

我想將可執行文件復制到更方便的位置作為入口點。 我可能有一個不同的基礎鏡像來構建和執行:

FROM fpco/stack-build:lts-14.20 as builder

COPY . /app
WORKDIR /app
RUN stack build

FROM fpco/stack-build:lts-14.20

WORKDIR /app
COPY --from=builder $(stack exec which wai-crowd) /app
EXPOSE 3000
ENTRYPOINT ["./wai-crowd"]

我相信並非所有 shell 命令都可以轉換為 dockerfile。

Dockerfile 是一個構建 docker 鏡像的腳本。 COPY命令從主機(在其上構建映像)獲取一些文件並將其復制到 docker 映像中,以便此文件稍后可用於 docker 進程。

AFAIK,docker 沒有任何工具可以在 docker 構建期間在主機中運行命令(另請參閱此線程

因此,您可以在構建之前運行該命令,在 buildroot 中創建一個文件,然后立即運行docker build

出於幾個原因,您需要在“構建”階段運行此步驟。 這會將文件保留在“運行時”階段可以COPY --from=build的已知位置。

FROM fpco/stack-build:lts-14.20 as builder
...
RUN stack build
RUN cp $(stack exec which wai-crowd) /app

FROM alpine
COPY --from=builder /app/wai-crowd /usr/bin
EXPOSE 3000
CMD ["wai-crowd"]

當您開始第二階段時,它沒有第一階段的任何內容,因此即使忽略語法問題, stack exec which ...命令也無法看到構建樹。 通常使用編譯語言(如 Haskell),您會希望避免在最終映像中使用實際的構建工具,因為它們可能非常大; 在我的示例中,我使用輕量級alpine圖像作為最終圖像的基礎,因此您也不會有stack命令。

此處的解決方案是將您想要復制到固定路徑中的最終圖像的任何工件留下。 在我的示例中,我重用了源所在的相同/app目錄,但您幾乎可以使用任何您想要的目錄。

暫無
暫無

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

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