构建没有依赖关系的Docker映像?

时间:2020-10-26 14:37:34

标签: docker

我是Docker的新手,所以我不知道这是否违反Docker应该如何工作的原则,但是是否可以将Dockerfile中的依赖项标记为某种类型的“延迟加载”,因此它们不会包含在由此生成的图像中吗?

这里的具体情况是,当开发尺寸甚至可能小于1MB的非常小的应用时-例如.Net Core中的一个“微服务” REST-API-从我的Dockerfile构建的映像的大小为207MB,甚至更大,因为这恰好是我的服务所依赖的.NET运行时的大小。

是否可以配置映像,使其仅包含我的代码,而不是通过映像提供相当大的运行时?

谢谢!

2 个答案:

答案 0 :(得分:0)

据我所知,您必须在应用程序中安装所需的一切。就像您在操作系统上安装整个.net核心以运行任何甚至最简单的.net应用程序一样。

另一点是,在这207MB内存中,大约100Mb属于win nano服务器。至少上次我是这样看的。

光明的一面。最小的linux映像只有几MB。而.Net Core应该是跨平台的。

因此,如果您要缩小图像,我建议您采用这种方式。这是一些链接-https://docs.microsoft.com/en-us/dotnet/core/install/linux

p.s。我从未在Linux上尝试过.net核心-尽管它总是很有趣。因为它应该比我更快。

答案 1 :(得分:0)

这是可能的,但实际上并不是docker的精神。最好在构建映像时预先加载安装,这样就可以避免在每次启动应用程序时在运行时进行安装。可能要花几分钟。

如果您的用例确实需要它,我将签出alpine linux docker映像作为基本映像。它很小。然后,当您的容器启动时,运行一个bash脚本,

  1. 安装dotnet:https://docs.microsoft.com/en-us/dotnet/core/install/linux-alpine
  2. 运行您的应用

我在这里释义,但从精神上讲,这会起作用

# This is the large dotnet image, but it is ony used to build
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build

COPY Code/. ./Code/
# you will need to add some flags here to get it to compile to alpine
RUN dotnet publish ./Code -c Release

# This is your runtime image that is actually loaded into a container
FROM alpine AS runtime
# Copy compiled files from build to runtime image
COPY --from=build [Your alpine publish directory from above] .

# Add a bash script from your dev environment that will do the work
COPY installDotnetAndStartupScript.sh .
ENTRYPOINT ["installDotnetAndStartupScript.sh"]