docker - 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"]
解决方案
出于几个原因,您需要在“构建”阶段运行此步骤。这会将文件留在“运行时”阶段可以处理的已知位置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
源代码所在的目录相同的目录,但您几乎可以使用任何您想要的目录。
推荐阅读
- scala - 隐式类不适用于通用类型
- docker - 通过 Docker-Compose 为 ElasticSearch 使用持久主机卷
- ruby-on-rails - Rails 服务器在 GemFile 中找不到 uglifier
- azure - 如何将现有机器学习模型与 Azure 机器学习结合使用?
- html - 如何在html中使用c++
- reactjs - Material-UI theme.mixins.toolbar 不适用于 Typescript
- python - 使用 Numpy 和 Matplotlib 绘制具有多个数据值的图形
- python - Django Nested Serializer 未序列化外键对象
- c# - 无法为 winmd 文件构建 Excel VSTO 加载项:“尝试加载格式不正确的程序”
- html - 为什么在构建时注释掉了 favicon 元素的链接?