上一篇文章简单使用了docker 拉取镜像、启动容器、编译镜像;其中编译镜像时,使用到了Dockerfile,那么接下来咱们就详细的来讲说Dockerfilehtml
Dockerfile 是一个用来构建镜像的文本文件,Dockerfile内容中包含了一条条构建镜像所需的指令和说明。最终采用docker build 命令经过dockerfile中指令构建镜像python
一、From:指定基础镜像(dockerfile第一个指令)mysql
FROM [--platform=<platform>] <image> [AS <name>] OR FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] OR FROM [--platform=<platform>] <image>[@<digest>] [AS <name>] 例如: FROM mysql:5.8
注意:golang
Dockerfile
必须从FROM
指令开始二、RUN:构建镜像时执行的命令sql
两种方式: RUN <command> ##命令在shell中运行,默认状况下/bin/sh -c在Linux或cmd /S /CWindows上运行 RUN ["executable", "param1", "param2"] ##exec 方式 例如: RUN ["/bin/bash", "-c", "echo hello"]
注意:docker
例如:RUN ["c:\\windows\\system32\\tasklist.exe"]
三、CMD:构建容器后调用,也就是在容器启动时才进行调用。shell
三种格式: CMD ["executable","param1","param2"] ##执行可执行文件,优先 CMD ["param1","param2"] ##设置了 ENTRYPOINT,则直接调用ENTRYPOINT添加参数 CMD command param1 param2 ##执行shell内部命令 例如: CMD ["/usr/bin/wc","--help"]
注意:
apache
四、LABEL:设置镜像标签windows
添加(K-V)形式元数据到镜像中,若是标签值中须要包含空格时,须要设置引号;反斜杠用于换号设置;示例以下:数组
LABEL <key>=<value> <key>=<value> <key>=<value> ...
例如:
LABEL "com.example.vendor"="ACME Incorporated" LABEL com.example.label-with-value="foo" LABEL version="1.0" LABEL description="This text illustrates \ that label-values can span multiple lines."
注意:
LABEL multi.label1="value1" multi.label2="value2" other="value3" LABEL multi.label1="value1" \ multi.label2="value2" \ other="value3"
五、MAINTAINER(废弃):设置生成镜像的做者信息,可以使用更加灵活的LABEL替代
MAINTAINER <name> 例如: MAINTAINER <name> 替代: LABEL maintainer="abc"
六、EXPOSE:指定容器运行时监听指定网络端口;能够设置端口是TCP或UDP,默认TCP;
语法:
EXPOSE <port> [<port>/<protocol>...] 例如: EXPOSE 80/tcp EXPOSE 80/udp
注意:EXPOSE并不会让容器的端口访问到主机。要使其可访问,须要在docker run
运行容器时经过-p来发布这些端口,或经过-P
参数来发布EXPOSE导出的全部端口
七、ENV:设置环境变量
语法:
ENV <key>=<value> ... ##能够设置多个环境变量,若是key中包含空格,使用""进行标识;反斜杠用于换行 ENV <key> <value> ##只能设置一个置,不推荐该写法 例如: ENV MY_NAME="John Doe" ENV MY_DOG=Rex\ The\ Dog ENV MY_CAT=fluffy
注意:
八、ADD:将本地文件添加到容器中
ADD [--chown=<user>:<group>] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] ##包含空格的路径时,使用该方式 例如: ADD test.txt relativeDir/ ADD test.txt /absoluteDir/
注意:
--chown
功能仅在用于构建Linux容器的Dockerfiles上受支持,而在Windows容器上不起做用<src>
是以公认的压缩格式(身份,gzip,bzip2或xz)做为本地tar归档文件,则将其解压缩为目录,来自远程URL的资源不会被解压缩。<src>
直接或因为使用通配符而指定了多个资源,则该资源<dest>
必须是目录,而且必须以斜杠结尾/
<dest>
不以斜杠结尾,则将其视为常规文件,并将其内容<src>
写入<dest>
<dest>
不存在,它将与路径中全部缺乏的目录一块儿建立九、COPY:复制文件到容器指定目录
COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] 例如: COPY test.txt /absoluteDir/ COPY test.txt relativeDir/
注意:同ADD指令差很少,区别为如下内容
十、ENTRYPOINT:配置容器,使其可执行化
ENTRYPOINT ["executable", "param1", "param2"] ##(可执行文件, 优先) ENTRYPOINT command param1 param2 ##(shell内部命令) 例如: ENTRYPOINT ["top", "-b"]
CMD和ENTRYPOINT相互做用
Dockerfile应至少指定CMD
或ENTRYPOINT
命令之一。
ENTRYPOINT
使用容器做为可执行文件时应定义。
CMD
应该用做ENTRYPOINT
在容器中定义命令或执行临时命令的默认参数的方式。
CMD
当使用替代参数运行容器时,将被覆盖。
十一、VOLUME:指定持久化目录
VOLUME ["/data"] 例如: VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
注意:
"
)而不是单引号('
)括住单词。十二、USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户
USER <user>[:<group>]
or
USER <UID>[:<GID>]
注意:
docker run
运行容器时,能够经过-u参数来覆盖所指定的用户。1三、WORKDIR:设置工做目录
WORKDIR /path/to/workdir
注意:
经过WORKDIR设置工做目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
在使用运行容器时,能够经过-w参数覆盖构建时所设置的工做目录。docker run
1四、ARG:构建参数
ARG <name>[=<default value>] 例如: ARG user1=someuser ARG buildno=1
注意:
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
FTP_PROXY
ftp_proxy
NO_PROXY
no_proxy
1五、ONBUILD:设置镜像触发器
ONBUILD <INSTRUCTION> 例如: ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注意:
ONBUILD
使用连接说明ONBUILD ONBUILD
ONBUILD
指令可能不会触发FROM
或MAINTAINER
指令1六、STOPSIGNAL: STOPSIGNAL指令设置将发送到容器以退出的系统调用信号
STOPSIGNAL signal
1七、HEALTHCHECK:指定某个程序或者指令来监控 docker 容器服务的运行状态。
两种形式: HEALTHCHECK [OPTIONS] CMD command (经过在容器内部运行命令来检查容器运行情况) HEALTHCHECK NONE (禁用从基映像继承的任何运行情况检查) 例如: HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1
注意:
HEALTHCHECK
Dockerfile中只能有一条指令。若是您列出多个,则只有最后一个HEALTHCHECK
才会生效。
1八、SHELL:容许重写命令的SHELL形式所使用的默认SHELL。Linux上的默认shell为[“/bin/sh”、“-c”];Windows上的默认shell为[“cmd”、“/S”、“/c”]
语法:
SHELL ["executable", "parameters"] 例如: SHELL ["powershell", "-command"]
注意:
SHELL
能够出现屡次。每一个SHELL
指令将覆盖全部先前的SHELL
指令,并影响全部后续的指令SHELL
指令在Windows上特别有用,在Windows上有两个经常使用且彻底不一样的本机shell:cmd
和powershell
#设置基础镜像 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base #设置工做目录
WORKDIR /app #设置监听端口
EXPOSE 80
#设置镜像 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
#设置工做目录 WORKDIR /src
#复制文件夹 COPY ["cz.IdentityServer/cz.IdentityServer.csproj", "cz.IdentityServer/"] #执行项目还原命令
RUN dotnet restore "cz.IdentityServer/cz.IdentityServer.csproj" #复制文件
COPY . . WORKDIR "/src/cz.IdentityServer"
#执行编译项目命令 RUN dotnet build "cz.IdentityServer.csproj" -c Release -o /app/build #执行发布项目 FROM build AS publish RUN dotnet publish "cz.IdentityServer.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app
#复制发布内容到docker目录 COPY --from=publish /app/publish .
#启动项目 ENTRYPOINT ["dotnet", "cz.IdentityServer.dll"]
参考:https://docs.docker.com/engine/reference/builder/