【问题标题】:Should static files be included in a Docker Image?静态文件应该包含在 Docker 映像中吗?
【发布时间】:2022-01-26 13:36:29
【问题描述】:

我有一个 .NET 微服务作为 docker 容器运行,负责向客户发送电子邮件。这些电子邮件包含额外的横幅,它是一个 png 文件。

在构建过程中,该文件是否应该包含在我的 Docker 映像中?这是一个好习惯吗?

将文件上传到已构建的容器或链接存储在不同位置的文件是更好的方法吗?

Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base

WORKDIR /app

EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build

WORKDIR /src

COPY src/Email.Service/Email.Service.csproj .
COPY nuget.config .

RUN dotnet restore Email.Service.csproj --configfile nuget.config

COPY src/Email.Service .

RUN dotnet build Email.Service.csproj -c Release -o /app

FROM build AS publish

RUN dotnet publish Email.Service.csproj -c Release -o /app

FROM base AS final

WORKDIR /app

COPY --from=publish /app .

COPY src/Email.Service/Assets Assets

ENTRYPOINT [ "dotnet" ]
CMD [ "Email.Service.dll" ]

banner.png 位于项目的 Assets 目录中。

【问题讨论】:

    标签: c# .net docker image dockerfile


    【解决方案1】:

    在构建过程中该文件是否应该包含在我的 Docker 映像中?

    是的。这使得图像是独立的,您可以直接运行它,而不需要源代码树或任何外部工件。

    (...但也可以看到“文件存储在不同的地方”选项。)

    将文件上传到已构建的容器是否是更好的方法

    不,这不是最佳做法。删除和重新创建容器是非常例行公事(在 Kubernetes 等环境中,有时它会超出您的控制范围),并且需要额外的手动设置步骤来使容器正常运行,因为您忘记了步骤,所以可能会出现故障。

    或链接存储在不同位置的文件?

    对于面向生产的部署,这实际上是一个不错的策略。考虑使用 Webpack 或类似工具构建并编译为静态文件的 Javascript 应用程序。 “正常的 Docker 方式”是使用多阶段构建,首先构建应用程序,然后 COPY 将这些文件放入最小的 Nginx 映像中。 Webpack 有一些特性允许为旧版本的应用程序提供服务,因此即使最终用户没有重新加载他们的页面并带有指向新资产的链接,以前的构建仍然有效;这种“正常的 Docker 方式”实际上并不适用。

    所以实际上有一个非常有效的路径来获取像这样的静态资产并将它们上传到正常的 HTTP 文件服务服务。 (我已经习惯了 Amazon 的产品,我会为此使用 AWS S3,但我相信其他公共云也有类似的产品,实际上任何可以上传文件和 HTTP GET 的东西都可以。)你会使用完全正常的不必要的 Docker 前端构建管道。在您的应用程序代码中,您可以自己代理文件服务服务或直接向其发送 URL。

    正如我所说,这更面向生产,您正在考虑诸如“昨天构建的脚本 URL 在今天仍然有效”之类的问题;在开发环境中更难使用。如果您已经有一个 Web 应用程序发布管道并且正在尝试使后端适应 Docker,那么这可能是一个好方法。是否“更好”取决于 URL 稳定性对您的重要性、涉及的内容量、更改频率以及开发人员设置更加独立的重要性。

    【讨论】:

      【解决方案2】:

      一般来说,微服务的主要目标是独立。微服务应该相互独立。

      如果将图像存储在另一个容器中,则会引入耦合。您只能在其他容器可用时发送邮件。

      因此,一般而言,在微服务架构中,最好的方法是将图像包含在您的邮件图像中。

      【讨论】:

        【解决方案3】:

        与您的用例没有直接关系,但与问题的标题相关:

        假设有一个带有网络服务器 (httpd) 的图像。 htdocs 中的静态文件应该是容器镜像的一部分,还是应该通过文件系统挂载来获得?

        我对此类问题的回答在一定程度上取决于网络服务器安装/修补的责任和生命周期以及构成内容的文档。如果您想将内容的责任移交给其他团队,您可能希望使用卷挂载并授予其他团队修改该卷的权限。

        这与汉斯给出的答案并不矛盾。对于一个可能比您运行容器更长的 png,我认为将其烘焙到图像中没有问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-10
          • 1970-01-01
          • 2022-01-22
          • 2021-09-26
          • 2019-03-21
          • 1970-01-01
          • 1970-01-01
          • 2021-11-16
          相关资源
          最近更新 更多