文件说明
此文件用于docker镜像文件的制作
基本结构
Dockerfile文件由行命令组成,以#开头注释行
一般分为四部分,基础镜像信息、维护者信息、镜像操作指令和容器启动执行指令。
例如
#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed. #For more information, please see https://aka.ms/containercompat FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-nanoserver-1903 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/core/sdk:3.0-nanoserver-1903 AS build WORKDIR /src COPY ["WebApiDemo/WebApiDemo.csproj", "WebApiDemo/"] RUN dotnet restore "WebApiDemo/WebApiDemo.csproj" COPY . . WORKDIR "/src/WebApiDemo" RUN dotnet build "WebApiDemo.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "WebApiDemo.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "WebApiDemo.dll"]
开始指明基于的镜像说明,下面推荐说明维护者信息,后面是镜像操作指令,最后是CMD指令,用于指定运行容器是操作的命令。
指令
FORM
格式为 FROM <image> 或者 <image>:<tag>
第一条指令必须为FORM指令,并且如果同一个Dockerfile中创建多个镜像时,可以使用多个FORM指令(每个镜像一次)
MAINTAINER
格式为 MAINTAINER <name> ,指定维护者信息
RUN
格式为 RUN <command> 或者 RUN ["executable","param1","param2"]
前者在shell终端中运行命令,后者则使用exec运行。
指定使用其他终端可以通过第二种方式实现。
每条RUN指令在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时候可以使用 换行。
CMD
支持三种格式:
-
- CMD ["executable","param1","param2"] 使用exec执行,推荐方式
- CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用
- CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数
每个Dockerfile只能有一条CMD命令,如果指定多条命令,则只有最后一条会被执行
如果用户启动容器的时候指定了运行的命令,则会覆盖CMD指定命令
EXPOSE
指定暴漏的端口号,格式为 EXPOSE <port> [<port>... ]
-P ,自动分配随机端口
-p ,指定端口
ENV
格式为 ENV <key> <value> 。指定一个环境变量,后续RUN指令会用到,并在容器运行时保持。
例如:
ENV PG_MAJOR 9.3 ENV PG_VERSION 9.3.4 RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && … ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD
格式为 ADD <src> <dest>
该命令复制指定的 <src> 到容器中 <dest> ,其中 <src> 可以是Dockerfile所在目录的一个相对的路径;也可以是URL;还可以是tar文件(自动解压为目录)
COPY
格式为 COPY <src> <dest>
复制本地的 <src>(为dockerfile所在的相对目录) 到 到容器中的 <dest>
ENTRYPOINT
两种格式:
-
- ENTRYPOINT ["executable","param1","param2"]
- ENTRYPOINT command parma1 param2
配置容器启动后执行的命令,且不可被docker run 提供的参数所覆盖
每个Dockerfile中只能有一个 ENTRYPOINT,当指定多个时只对最后一个有效
VOLUME
格式为 VOLUME ["/data"]
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据库
USER
格式为 USER daemon
指定运行容器时的用户名和UID,后续的 RUN 也会指定用户
WORKDIR
格式为 WORKDIR /path/to/workdir
为后续的 RUN、CMD、ENTRYPOINT 的指令配置工作目录
可以使用多个 WORKDIR 指令,后续指令如果是相对路径,则会基于之前的命令指定的路径
e.g.最终路径为 /a/b/c ,可以简单理解为多次CD指令
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
ONBUILD
格式为 ONBUILD [INSTRUCTION]
配置当前所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令
推荐使用该指令时在标签中注明,如:ruby:1.9-onbuild
e.g.Dockerfile使用如下的内容创建镜像 image-A
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基于image-A创建新的镜像时候,新Dockerfile中使用 FORM image-A 指定基础镜像时,会自动执行 ONBUILD的指令内容,等价于在后面添加了两条指令
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src