Dockerfile:如何在CP中运行子命令?
如何将此bash命令转换为DockerfileDockerfile:如何在CP中运行子命令?,docker,dockerfile,Docker,Dockerfile,如何将此bash命令转换为Dockerfile cp $(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 --
cp $(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进程
顺便说一句,docker没有任何工具在docker构建期间在主机上运行命令(另请参见)
因此,您可以在生成之前运行该命令,在buildroot中创建一个文件,然后立即运行
docker build
。我相信并非所有shell命令都可以转换为dockerfile
Dockerfile是构建docker映像的脚本COPY
命令从主机(在其上构建映像)获取一些文件,并将其复制到docker映像中,以便该文件稍后可用于docker进程
顺便说一句,docker没有任何工具在docker构建期间在主机上运行命令(另请参见)
因此,您可以在构建之前运行该命令,在buildroot中创建一个文件,然后立即运行
docker build
。出于几个原因,您需要在“构建”阶段运行此步骤。这将把文件留在一个已知的位置,“运行时”阶段可以复制--from=build
它
来自fpco/堆栈构建的:lts-14.20作为构建器
...
运行堆栈生成
运行cp$(堆栈执行器)/应用程序
来自阿尔卑斯山
复制--from=builder/app/wai crowd/usr/bin
暴露3000
CMD[“围观人群”]
启动第二阶段时,它没有第一阶段的任何内容,因此即使忽略语法问题,stack exec…
命令也无法看到构建树。通常使用编译语言(如Haskell),您希望避免在最终映像中使用实际的构建工具,因为它们可能非常大;在我的示例中,我使用了轻量级的alpine
图像作为最终图像的基础,因此这里也没有stack
命令
这里的解决方案是将您希望复制到最终图像中的任何工件保留在固定路径中。在我的示例中,我重复使用了源代码所在的相同的
/app
目录,但您可以使用几乎任何您想要的目录。出于几个原因,您需要在“构建”阶段运行此步骤。这将把文件留在一个已知的位置,“运行时”阶段可以复制--from=build
它
来自fpco/堆栈构建的:lts-14.20作为构建器
...
运行堆栈生成
运行cp$(堆栈执行器)/应用程序
来自阿尔卑斯山
复制--from=builder/app/wai crowd/usr/bin
暴露3000
CMD[“围观人群”]
启动第二阶段时,它没有第一阶段的任何内容,因此即使忽略语法问题,stack exec…
命令也无法看到构建树。通常使用编译语言(如Haskell),您希望避免在最终映像中使用实际的构建工具,因为它们可能非常大;在我的示例中,我使用了轻量级的alpine
图像作为最终图像的基础,因此这里也没有stack
命令
这里的解决方案是将您希望复制到最终图像中的任何工件保留在固定路径中。在我的示例中,我重复使用了源代码所在的
/app
目录,但您可以使用几乎任何您想要的目录。我想复制从RUN
部分生成的一些工件,因此在运行docker build
之前,我不知道工件的位置<代码>stack exec which wai crowd告诉我工件在哪里。什么是运行部分?”“在docker文件中运行”通常在docker图像的层上运行。因此,如果您需要运行,您不需要复制,因为工件应该在docker图像层中可用…哦,是的,对不起,只是想将文件复制到一个更方便的地方作为入口点。对于构建和入口点,我实际上可能有一个与不同的。我想复制一些从RUN
部分构建的工件,因此在运行docker build
之前,我不知道工件的位置<代码>stack exec which wai crowd
告诉我工件在哪里。什么是运行部分?”“在docker文件中运行”通常在docker图像的层上运行。因此,如果您需要运行,您不需要复制,因为工件应该在docker图像层中可用…哦,是的,对不起,只是想将文件复制到一个更方便的地方作为入口点。对于构建和入口点,我实际上可能有一个不同于的。很好,这比我发布的答案要多,我也在努力:)非常感谢!很好,这个答案比我贴的要多,我也在努力:)非常感谢!
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"]