• 前言:

 上一篇文章简单使用了docker 拉取镜像、启动容器、编译镜像;其中编译镜像时,使用到了Dockerfile,那么接下来我们就详细的来说说Dockerfile

DockerFile是什么:

  Dockerfile 是一个用来构建镜像的文本文件,Dockerfile内容中包含了一条条构建镜像所需的指令和说明。最终采用docker build 命令通过dockerfile中指令构建镜像

各种指令详情:

1、From:指定基础镜像(dockerfile第一个指令)

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

 注意:

  • 有效的Dockerfile必须从FROM指令开始
  • ARG是Dockerfile中唯一可能位于FROM之前的指令
  • FROM可以在一个Dockerfile中多次出现,以创建多个映像或将一个构建阶段用作另一个构建阶段的依赖项
  • 通过FROM指令添加AS name,可以选择为新生成阶段指定名称。该名称可以在后续的FROM和COPY--FROM=<name>指令中使用,以引用在此阶段中构建的镜像。
  • 标记或摘要值是可选的

2、RUN:构建镜像时执行的命令

RUN has 2 forms:

  • RUN <command>                                                      ##命令在shell中运行,默认情况下/bin/sh -c在Linux或cmd /S /CWindows上运行
  • RUN ["executable", "param1", "param2"]    ##exec 方式

例如:

RUN ["/bin/bash", "-c", "echo hello"]

 注意:

  • 将在当前图像顶部的新层中执行所有命令,并提交结果
  • JSON格式中,必须转义反斜杠。
    例如:RUN ["c:\\windows\\system32\\tasklist.exe"]  

3、CMD:构建容器后调用,也就是在容器启动时才进行调用。

三种格式:

  • CMD ["executable","param1","param2"]     ##执行可执行文件,优先
  • CMD ["param1","param2"]                            ##设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数
  • CMD command param1 param2                   ##执行shell内部命令

 例如:

  CMD ["/usr/bin/wc","--help"]

  注意:

  • CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
  • EXEC形式被解析为一个JSON阵列,这意味着必须使用双引号(“)周围的话不单引号(')

4、LABEL:设置镜像标签

LABEL <key>=<value> <key>=<value> <key>=<value> ...

 添加(K-V)形式元数据到镜像中,如果标签值中需要包含空格时,需要设置引号;反斜杠用于换号设置;示例如下:

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."

 注意:

  • 镜像中可以有多个LABLE,可以在一行指令中指定多个标签,如以下两种格式:
LABEL multi.label1="value1" multi.label2="value2" other="value3"

LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
  • 可以继承基础镜像中包含的的标签,如果标签已存在时,但值不同;则最近设置的值将覆盖以前的值

5、MAINTAINER(废弃):设置生成镜像的作者信息,可使用更加灵活的LABEL替代

MAINTAINER <name>
例如:
MAINTAINER <name>
替代:
LABEL maintainer="abc"

6、EXPOSE:指定容器运行时监听指定网络端口;可以设置端口是TCP或UDP,默认TCP;

 语法:

EXPOSE <port> [<port>/<protocol>...]
例如:

EXPOSE 80/tcp
EXPOSE 80/udp

 注意:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

7、ENV:设置环境变量

 语法:

ENV <key>=<value> ...   ##可以设置多个环境变量,如果key中包含空格,使用""进行标识;反斜杠用于换行
ENV <key> <value>     ##只能设置一个置,不推荐该写法
例如:
 ENV MY_NAME="John Doe"
 ENV MY_DOG=Rex\ The\ Dog
 ENV MY_CAT=fluffy

 注意:

  • 从生成的映像运行容器时,使用ENV设置的环境变量将保持不变。
  • 修改ENV:docker run --env <key>=<value>

8、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可以指定读个资源,但是如果它们是文件或目录,则将其路径解释为相对于构建上下文源的路径。
  • src支持通配符,匹配规则采用Go的 filepath.Match规则完成
  • 目录本身不被复制,仅其内容被复制。
  • 如果<src>是以公认的压缩格式(身份,gzip,bzip2或xz)作为本地tar归档文件,则将其解压缩为目录,来自远程URL的资源不会被解压缩。
  • 如果<src>直接或由于使用通配符而指定了多个资源,则该资源<dest>必须是目录,并且必须以斜杠结尾/
  • 如果<dest>不以斜杠结尾,则将其视为常规文件,并将其内容<src>写入<dest>
  • 如果<dest>不存在,它将与路径中所有缺少的目录一起创建

9、COPY:复制文件到容器指定目录

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
例如:
 COPY test.txt /absoluteDir/
 COPY test.txt relativeDir/

 注意:同ADD指令差不多,区别为以下内容

  • 不会自动解压文件,也不能访问网络资源
  • src不能为网络资源

10、ENTRYPOINT:配置容器,使其可执行化

ENTRYPOINT ["executable", "param1", "param2"]    ##(可执行文件, 优先)
ENTRYPOINT command param1 param2           ##(shell内部命令)
例如:
ENTRYPOINT ["top", "-b"]

 CMD和ENTRYPOINT相互作用

  1. Dockerfile应至少指定CMDENTRYPOINT命令之一。

  2. ENTRYPOINT 使用容器作为可执行文件时应定义。

  3. CMD应该用作ENTRYPOINT在容器中定义命令或执行临时命令的默认参数的方式。

  4. CMD 当使用替代参数运行容器时,将被覆盖。  

11、VOLUME:指定持久化目录

VOLUME ["/data"]
例如:
 VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"] 

 注意:

  • 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

    • 卷可以容器间共享和重用
    • 容器并不一定要和其它容器共享卷
    • 修改卷后会立即生效
    • 对卷的修改不会对镜像产生影响
    • 卷会一直存在,直到没有任何容器在使用它
  • 基于Windows的容器上的卷:使用基于Windows的容器时:除C盘目录、不存在或空目录
  • 从Dockerfile中更改卷:如果在声明了卷之后有任何构建步骤更改了卷中的数据,则这些更改将被丢弃。
  • SON格式:列表被解析为JSON数组。您必须用双引号(")而不是单引号(')括住单词。

12、USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户

USER <user>[:<group>]
or
USER <UID>[:<GID>]

 注意:

  • 使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。
  • 镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
  • 当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

13、WORKDIR:设置工作目录

WORKDIR /path/to/workdir

  注意:

  • 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
  • 在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

14、ARG:构建参数

ARG <name>[=<default value>]
例如:
 ARG user1=someuser
 ARG buildno=1 

  注意:

  • ARG 设置的环境变量仅对 Dockerfile 内有效
  • 不建议使用构建变量传递敏感信息,构建变量值在docker history 可以查看
  • 内置Arg变量:
    • HTTP_PROXY
    • http_proxy
    • HTTPS_PROXY
    • https_proxy
    • FTP_PROXY
    • ftp_proxy
    • NO_PROXY
    • no_proxy

15、ONBUILD:设置镜像触发器

ONBUILD <INSTRUCTION>
例如:

ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
 

 注意:

  • 不允许ONBUILD使用链接说明ONBUILD ONBUILD
  • ONBUILD指令可能不会触发FROMMAINTAINER指令

16、STOPSIGNAL: STOPSIGNAL指令设置将发送到容器以退出的系统调用信号

STOPSIGNAL signal 

17、HEALTHCHECK:指定某个程序或者指令来监控 docker 容器服务的运行状态。

两种形式:

  • HEALTHCHECK [OPTIONS] CMD command   (通过在容器内部运行命令来检查容器运行状况)
  • HEALTHCHECK NONE             (禁用从基映像继承的任何运行状况检查)

例如:

HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1

 注意:

  • HEALTHCHECKDockerfile中只能有一条指令。如果您列出多个,则只有最后一个HEALTHCHECK才会生效。

18、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:cmdpowershell

DockerFile示例:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

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
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "cz.IdentityServer.dll"]

参考:https://docs.docker.com/engine/reference/builder/

Docker学习—DockerFile的更多相关文章

  1. Docker学习——Dockerfile

    上一篇我们讲了docker的基本使用,掌握了前一篇,docker使用基本不成问题,但是要是你学习了Dockerfile,你会发现它使用起来有多方便了.项目最终部署时,我们希望docker容器打开时项目 ...

  2. Docker学习—Compose

    前言 前面<Docker学习-DockerFile>文中介绍了dockerfile相关的语法,及使用方式:接下来了解docker三剑客之一的 Compose:接下来详细学习. 一.dock ...

  3. Docker 学习8 Dockerfile详解2

    一.继续上章节Docker学习7 CMD命令后. 11.ENTRYPOINT a.容器启动后相当于会启动ENTRYPOINT + CMD 命令,CMD相当于参数传给entrypoint的 [root@ ...

  4. Docker学习(三): Dockerfile指令介绍

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  5. [转帖]Docker学习之Dockerfile命令详解

    Docker学习之Dockerfile命令详解 https://it.baiked.com/system/docker/2436.html 图挺好的 前言 之前,制作镜像的伪姿势搭建已经见过了,今天介 ...

  6. Docker学习(六)Dockerfile构建自定义镜像

    Docker学习(六)Dockerfile构建自定义镜像 前言 通过前面一篇文章可以知道怎么去使用一个镜像搭建服务,但是,如何构造自己的一个镜像呢,docker提供了dockerfile可以让我们自己 ...

  7. Docker学习(六)——Dockerfile文件详解

    Docker学习(六)--Dockerfile文件详解 一.环境介绍 1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录 ...

  8. Docker学习总结(17)——学会使用Dockerfile

    Docker.Dockerfile.Docker镜像.容器这些都是什么鸟? 老生常谈,再再再--普及一下: Docker: 最早是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起 ...

  9. Docker学习之Dockerfile

    通过编写简单的文件创建docker镜像 dockerfile 用来创建docker镜像. 格式 : FROM alpine:latest MAINTAINER XSW CMD echo "h ...

随机推荐

  1. 渗透测试之信息收集(Web安全攻防渗透测试实战指南第1章)

    收集域名信息 获得对象域名之后,需要收集域名的注册信息,包括该域名的DNS服务器信息和注册人的联系方式等. whois查询 对于中小型站点而言,域名所有人往往就是管理员,因此得到注册人的姓名和邮箱信息 ...

  2. Codeforces Round #672 (Div. 2) A - C1题解

    [Codeforces Round #672 (Div. 2) A - C1 ] 题目链接# A. Cubes Sorting 思路: " If Wheatley needs more th ...

  3. Flex、Grid、媒体查询实现响应式布局

    本篇文章主要讲述使用Flex布局.Grid布局以及媒体查询三种方式来实现响应式布局. 文章涉及代码在线coding地址 效果图: 文字描述: 屏幕大小不同,展示列数不同,1-5号按照屏幕大小可展示2到 ...

  4. 连接mysql客户端报错: java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'

    报这个错可能是因为用了低版本的的客户端.驱动连接高版本的mysql服务器. 解决方式有三种:升级客户端版本.修改服务端认证方式和适应服务端认证方式. 我是通过升级客户端版本解决,参考一下链接: Upg ...

  5. 在Windows7系统中设置虚拟内存大小

    当我们的电脑物理内存空间不够用时,操作系统就会自动从硬盘空间上分出一块空间来当内存使用,这就是虚拟内存.可以说虚拟内存是物理内存的补充,是备用的物理内存.一般来说,如果电脑里的程序不多,占用内存资源不 ...

  6. VUE 安装项目

    注意:在cmd中执行的命令 1,前提是安装了node.js 查看 npm 版本号 2,创建项目路径 mkdir vue cd vue 3,安装vue-cli (脚手架) npm install -个v ...

  7. C# 软件开机启动

    如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! !---------------------------- ...

  8. 《流畅的Python》第二部分 数据结构 【序列构成的数组】【字典和集合】【文本和字节序列】

    第二部分 数据结构 第2章 序列构成的数组 内置序列类型 序列类型 序列 特点 容器序列 list.tuple.collections.deque - 能存放不同类型的数据:- 存放的是任意类型的对象 ...

  9. ansible-介绍

    常用自动化运维工具 CFengine Chef Puppet 基于Ruby开发,采用C/S架构,扩展性强,基于SSL认证 SaltStack 基于python开发,采用C/S架构,相对于puppet更 ...

  10. 一键同步,紧跟潮流——CODING 现已支持导入 GitHub 仓库

    为方便用户从 GitHub 快速迁移到 CODING 并开始使用,CODING 现已支持导入 GitHub 仓库.免去繁琐步骤,只需简单两步操作即可完成导入,让仓库静默同步,无缝衔接,平滑过渡:同时还 ...