首页 > 解决方案 > Dockerfile:如何在 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"]

标签: dockerdockerfile

解决方案


出于几个原因,您需要在“构建”阶段运行此步骤。这会将文件留在“运行时”阶段可以处理的已知位置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源代码所在的目录相同的目录,但您几乎可以使用任何您想要的目录。


推荐阅读