gpt4 book ai didi

docker - 在 Docker 镜像构建时排除路径以提高大小

转载 作者:行者123 更新时间:2023-12-02 21:24:07 25 4
gpt4 key购买 nike

在我们的项目中,我们有一个带有 Angular2 客户端的 ASP.NET Core 项目。在 Docker 构建时,我们启动:

FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app

RUN ["dotnet", "restore"]

RUN apt-get -qq update ; apt-get -qqy --no-install-recommends install \
git \
unzip
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash -
RUN apt-get install -y nodejs build-essential
RUN ["dotnet", "restore"]

RUN npm install
RUN npm run build:prod

RUN ["dotnet", "build"]

EXPOSE 5000/tcp
ENV ASPNETCORE_URLS http://*:5000

ENTRYPOINT ["dotnet", "run"]

由于恢复 npm 包对于使用 npm run build 构建 Angular2 客户端至关重要。 ,我们的 Docker 镜像很大,我的意思是差不多 2GB。内置的 Angular2 客户端本身只有 1.7Mb。

我们的应用程序没什么特别的:简单的 Web API 写入 MongoDB 并显示静态文件。

为了提高我们图像的大小,有没有办法排除运行时无用的路径?例如 node_modules或任何 .NET Core 源 ?

最佳答案

Dotnet 可能会恢复很多,特别是如果您有多个目标平台(linux、mac、windows)。

根据您的应用程序的配置方式(即作为可移植的 .NET Core 应用程序或作为自包含应用程序),它还可以为一个或多个平台和/或体系结构(x64、x86)拉取整个 .NET Core 框架。这个主要解释here .

"Microsoft.NETCore.App" : "1.0.0"定义,没有类型平台,那么完整的框架将通过 nuget 获取。然后,如果您定义了多个运行时

 "runtimes": {
"win10-x64": {},
"win10-x86": {},
"osx.10.10-x86": {},
"osx.10.10-x64": {}
}

它也将获得所有这些平台的本地库。但不仅在您的项目目录中,而且在 ~/.nuget 中和 npm-cache除了 node_modules在您的项目中 + 在您的 wwwdata 中的最终副本.

但是,这不是 docker 的工作方式。您在 Dockerfile 中执行的所有操作 写入虚拟文件系统 的容器!这就是为什么你会看到这些问题。

您应该关注 my previous comment on your other question :

运行 dotnet restore , dotne builddotnet publish 外面 Dockerfile,例如在 bash 或 powershell/batch 脚本中。

完成调用后,使用以下命令复制容器中发布文件夹的内容
dotnet publish
docker build bin\Debug\netcoreapp1.0\publish ... (your other parameters here)

这将在您的文件系统上生成发布文件,仅包含所需的 dll 文件、 View 和 wwwroot内容没有所有其他构建文件、工件、缓存或源,并将运行来自 bin\Debug\netcoreapp1.0\publish 的 docker 进程文件夹。

您还需要更改 docker 文件,以复制文件而不是运行容器构建期间的命令。

Scott 将此 Dockerfile 用于 his example in his blog :
FROM ... # Your base image here
ENTRYPOINT ["dotnet", "YourWebAppName.dll"] # Application to run
ARG source=. # An argument from outside, here store the path from real filesystem
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82 # Define the port it should listen
EXPOSE 82
COPY $source . # copy the files from defined folder, here bin\Debug\netcoreapp1.0\publish to inside the docker container

这是构建 docker 容器的推荐方法。当您在其中运行构建命令时,所有构建和发布工件都保留在虚拟文件系统中,并且 docker 镜像会意外增长。

关于docker - 在 Docker 镜像构建时排除路径以提高大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41634894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com