Dockerfile
在 Docker 的世界里, 我们可以通过一个叫 Dockerfile 的文件来创建 Docker 镜像, 随后可以运行容器.
Dockerfile 就是一个文本文件, 里面写着一些指令. 通过 Docker Client, 并使用 docker build 这个命令, docker build 命令会读取该文件里面的指令, 生成一层文件系统, 然后就生产出了一个 docker 的镜像.
Dockerfile 的文件名就是 Dockerfile, 当然了也可以叫别的名, 但是通常就叫 Dockerfile.
Dockerfile 里面包含着各种指令, 这些指令会创建一个中间层镜像, 这个中间层镜像可以被缓存, 这样的话以后构建的时候速度就很快了.
Dockerfile 的主要指令:
FROM. 通常情况下, 你要创建的镜像是基于另外一个镜像的, 这就需要使用 FROM, 当然也可以完全从头创建.
MAINTAINER. 该镜像的维护人.
RUN. 这里可以定义一些需要运行的命令. 例如 NPM install,dotnet restore 等等.
COPY. 开发的时候, 可以把源码放在 Volumes 里. 而在生产环境下, 经常需要把源码复制到容器里面, 使用 COPY 就可以做到这点.
ENTRYPOINT. 它可以定义容器的入口, 把容器配置成像 exe 一样的运行文件. 通常是一些例如 dotnet 命令, node 命令等等.
CMD. 设置容器运行的默认命令和参数. 当容器运行的时候, 这个可以在命令行被覆盖.
WORKDIR. 设定容器运行的工作目录.
EXPOSE. 暴露端口.
ENV. 设定环境变量.
VOLUME. 定义 Volume, 并控制如何在宿主中进行存储.
下面是官网的一个 Dockerfile 的例子:
FROM python:27.-slim, 说明该镜像要基于 python:2.7-slim 这个镜像构建. 这将会是一层.
COPY . /App, 是指在构建镜像的时候, 从当前目录把源码复制到 / App 目录下. 这又是一层.
RUN xxx, 是指在 WORKDIR(/App) 下执行 pip install xxx 这行命令.
EXPOSE 80, 是指把容器的 80 端口暴露给外界.
ENV, 定义了环境变量.
CMD ["python", "app.py"], 里定义了容器运行的默认命令和参数.
创建一个 ASP.NET Core Dockerfile
在 Docker hub 里找到 aspnetcore:
里面第一个 microsoft/aspnetcore 只有运行时, 所以只能 dotnet run, 适用于生产环境.
第二个 microsoft/aspnetcore-build 里有完整的 dotnet sdk, 可以执行 dotnet restore, dotnet build, dotnet run 等等.
使用 VSCode 打开我上篇文章建立的 ASP.NET Core 项目 (或者新建一个也可以):
然后我们这样来创建 Dockerfile, 首先点击 Extensions, 搜索 docker:
可以找到一个 Docker 扩展, 是由微软开发的. 安装它即可.
安装完后, 点击 Docker 按个图标:
就可以看到本机上的 Docker 镜像, 容器, 注册信息等等.
然后按 Ctrl+Shift+P, 然后输入 docker:
可以看到有很多可用的命令.
选择 Add Docker Files to Workspace, 然后选择 ASP.NET Core:
然后选择操作系统, 这里我选 Linux:
然后填写内部的端口, 我这个项目是 5001:
然后按回车, 就会生成 Dockerfile, 同时还有一个. dockerignore 文件:
(在编辑 Dockerfile 文件的时候还有智能提示的).
看一下这个文件:
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base, 就是把前面的镜像起了一个别名, 叫做 base.
WORKDIR /App, 工作目录是 /App.
端口 5001.
下面几句类似, 然后:
COPY ["VolumeSample.csproj", "./"], 就是把 VolumeSample.csproj 复制到当前工作的目录.
RUN dotnet restore "./VolumeSample.csproj", 执行 dotnet restore.
COPY . ., 然后把所有的源码也复制到当前的工作目录.
WORKDIR "/src/.", 切换工作目录到 / src.
RUN dotnet build "VolumeSample.csproj" -c Release -o /App, 再执行 dotnet build 命令, 并把结果放在 / App 目录下.
后边几句也是类似:
COPY --from=publish /App ., 是指从 publish 目录复制, 具体是从 publish/App 目录复制, 到当前的工作目录.
ENTRYPOINT ["dotnet", "VolumeSample.dll"], 就是运行该镜像会执行的命令 dotnet VolumeSample.dll.
(一个项目里可以有多个 Dockerfile, 例如区分开发和生产环境, 但是文件名最好使用 dockerfile 后缀, 因为这样在 VSCode 里有智能提示).
创建镜像
其实上面使用 VSCode 生成的 Dockerfile 并不是我需要的, 我需要的 Dockerfile 还是按照官方文档来吧:
最后是这样的:
也是多个 Stage 的.
然后执行这个命令来构建镜像:
docker build -t solenovex/aspnetcore .
使用 docker build,-t 表示 tag, 然后是用户名和要起的镜像名, 镜像名后边可以跟着具体的 tag, 例如 solenovex/aspnetcore:1.0, 如果不加的话就是 latest. 最后一个. 表示当前这个含有 Dockerfile 目录是我要进行构建的内容.
执行的时候会遇到. net sdk 版本不匹配的问题, 也就是 microsoft/aspnetcore-build 这个镜像的. net sdk 版本有点低.
所以, 我只好改为使用 microsoft/dotnet:2.1-sdk 这个镜像了:
再次执行: docker build -t solenovex/aspnetcore .
这个构建的过程还是挺快的, 过程大概如下:
成功了.
然后从 VSCode 的 docker 扩展里就可以看到我刚刚创建的镜像:
然后在 Powershell 里面创建 / 运行一个容器:
执行 docker ps -a:
可以看到该容器运行后就马上退出了, 查看一下日志看看原因:
错误信息是:
其实这个错误信息感觉并不明确.
具体怎么解决这个错误, 且听下回分解..
来源: https://www.cnblogs.com/cgzl/p/9997124.html