关于 Alpine Linux 此处就不再过多讲述,请自行查看相关文档。
下表列出了当前支持的 .NET
体系结构以及支持它们的 Alpine
版本。 这些版本在 .NET
到达支持终止日期或 Alpine
的体系结构受支持之前仍受支持。请注意,Microsoft
仅正式支持 x86_64、armv7、aarch64
。 其他体系结构由分发维护人员支持,并且可以使用 apk
包管理器进行安装。
apline
环境安装必须依赖使用包管理器进行安装时,将为你安装这些库。 但是,如果手动安装 .NET
或发布自包含的应用,则需要确保已安装以下库:
apk add bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib
libgdiplus
(.NET
应用需要 System.Drawing.Common
程序集时)如果 .NET
应用使用 System.Drawing.Common
程序集,则还需要安装 libgdiplus
。 由于 Linux
上不再支持 System.Drawing.Common
,因此这仅适用于 .NET 6
,并且需要设置 System.Drawing.EnableUnixSupport
运行时配置开关。
要在 Alpine 3.16
或更高版本上安装 libgdiplus
(较旧版本不包含该包),请运行:
apk add libgdiplus
asp.net core
运行时sudo apk add aspnetcore6-runtime
.net core/.net
运行时sudo apk add dotnet6-runtime
sudo apk add dotnet6-sdk
三者之间的关系说明,如下图所示:
此处目标是构建 asp.net core
应用程序的基础镜像,所以采用 asp.net core runtime
环境(生产环境推荐 Release
发布文件)。
此处我们介绍如何基于 Alpine Linux
环境构建 ASP.NET Core6.x
的 Runtime
的基础镜像。
Microsoft
参考文档:
注意修改 Alpine
的镜像 repo
(repositories
)源为国内源:
# 清华源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
# 阿里源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 中科大源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
完整的 Dockerfile
编写如下:
# https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-alpine
FROM docker.io/library/alpine:3.18.3
LABEL version="aspnetcore:6.0-alpine"
LABEL description="Based on x86_64 alpine platform: v3.18.3 building aspnetcore6-runtime"
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update
RUN apk add bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib
RUN apk add aspnetcore6-runtime
进入刚编写的 Dockerfile
文件目录,然后执行如下命令:
docker image build -t aspnetcore:6.0-x86_64-alpine ./
输出如下信息:
PS C:\Users\Jeffrey.Chai\Desktop\dist> docker image build -t aspnetcore:6.0-x86_64-alpine ./
[+] Building 0.1s (9/9) FINISHED docker:default
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 499B 0.0s
=> [internal] load metadata for docker.io/library/alpine:3.18.3 0.0s
=> [1/5] FROM docker.io/library/alpine:3.18.3 0.0s
=> CACHED [2/5] RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 0.0s
=> CACHED [3/5] RUN apk update 0.0s
=> CACHED [4/5] RUN apk add bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib 0.0s
=> CACHED [5/5] RUN apk add aspnetcore6-runtime 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:974536111ddef9f00e20779f822bbaf646e2ec46ac3ec515158ef6c8e4abfb9a 0.0s
=> => naming to docker.io/library/aspnetcore:6.0-x86_64-alpine
说明:该步骤已经构建完成新镜像 aspnetcore:6.0-x86_64-alpine
。
如有私有镜像仓库,可推送私有仓库,推送命令如下:
# 登录 docker hub 仓库
docker login -u username -p xxx
# 推送镜像到仓库
docker push aspnetcore:6.0-x86_64-alpine
参数说明:
-u
用户名-p
用户密码docker save
:导出镜像,按指定镜像保存成(.tar/.zip
)归档文件。docker image save -o aspnetcore-6.0-x86_64-alpine.tar aspnetcore:6.0-x86_64-alpine
关于 docker save
命令用法:
PS C:\Users\Jeffrey.Chai\Desktop\dist> docker image save --help
Usage: docker image save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Aliases:
docker image save, docker save
Options:
-o, --output string Write to a file, instead of STDOUT
docker load
:导入(载入)镜像将上面导出的镜像(image
)归档文件拷贝到(已安装 docker
)目标主机环境,执行如下命令:
docker image load aspnetcore-6.0-x86_64-alpine.tar
关于 docker load
命令使用:
PS C:\Users\Jeffrey.Chai\Desktop\dist> docker image load --help
Usage: docker image load [OPTIONS]
Load an image from a tar archive or STDIN
Aliases:
docker image load, docker load
Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output
以上就是 asp.net core 6.0
的 runtime
环境基础镜像构建过程。
— The glow of a firefly may be faint, but when it shines, it challenges the darkness.
docker images
PS C:\Users\Jeffrey.Chai\Desktop\dist> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcore 6.0-x86_64-alpine 974536111dde 36 minutes ago 148MB
alpine 3.18.3 7e01a0d0a1dc 3 weeks ago 7.34MB
基于上面的构建的 aspnetcore6-runtime
基础镜像,接下来我们再此基础上镜像 app
应用镜像构建,完整的 Dcokerfile
编写如下:
FROM aspnetcore:6.0-x86_64-alpine
WORKDIR /app
LABEL version="1.0.0"
LABEL description="xxx镜像描述"
COPY . ./
EXPOSE 80
ENTRYPOINT ["dotnet", "hello.dll"]
说明:直接把该
Dockerfile
文件拷贝到asp.net core
应用程序发布文件目录执行docker build
命令即可。