搜索
 找回密码
 立即注册

Dockerfile详解超全(一)

桃花烟雨暮迟迟 2023-02-21 11:27 946
一、环境介绍
1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录
2.Dockerfile中相对路径默认都是Dockerfile所在的目录
3.Dockerfile中一定要惜字如金,能写到一行的指令,一定要写到一行,原因是分层构建,联合挂载这个特性。Dockerfile中每一条指令被视为一层
4.Dockerfile中指明大写(约定俗成)

二、指令介绍
FROM

功能为指定基础镜像,并且必须是第一条指令。

如果不以任何镜像为基础,那么写法为:FROM scratch。

同时意味着接下来所写的指令将作为镜像的第一层开始
语法:

  1. FROM <image>
  2. FROM <image>:<tag>
  3. FROM <image>:<digest>
  4. 三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest
复制代码
MAINTAINER

指定作者

语法:

  1. MAINTAINER <name>
复制代码
新版docker中使用LABEL指明
LABEL

功能是为镜像指定标签

语法:

  1. LABEL <key>=<value> <key>=<value> <key>=<value> ...
  2. 一个Dockerfile种可以有多个LABEL,如下:

  3. LABEL "com.example.vendor"="ACME Incorporated"
  4. LABEL com.example.label-with-value="foo"
  5. LABEL version="1.0"
  6. LABEL description="This text illustrates \
  7. that label-values can span multiple lines."
  8. 但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号

  9. 如下:

  10. LABEL multi.label1="value1" \
  11. multi.label2="value2" \
  12. other="value3"

复制代码

说明:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖

ADD

一个复制命令,把文件复制到镜像中。
如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。
语法如下:

  1. 1. ADD <src>... <dest>
  2. 2. ADD ["<src>",... "<dest>"]
复制代码
  • 路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径,推荐写成绝对路径

  • 可以是一个本地文件或者是一个本地压缩文件,还可以是一个url

  • 如果把写成一个url,那么ADD就类似于wget命令
    示例



  1. ADD test relativeDir/
  2. ADD test /relativeDir
  3. ADD http://example.com/foobar /
复制代码

注意事项

  • src为一个目录的时候,会自动把目录下的文件复制过去,目录本身不会复制
  • 如果src为多个文件,dest一定要是一个目录
COPY

看这个名字就知道,又是一个复制命令

语法如下:

  1. COPY <src>... <dest>
  2. COPY ["<src>",... "<dest>"]
复制代码

与ADD的区别

  • COPY的只能是本地文件,其他用法一致
EXPOSE

功能为暴漏容器运行时的监听端口给外部

但是EXPOSE并不会使容器访问主机的端口

如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数
语法:

  1. EXPOSE <port>/<tcp/udp>
复制代码
ENV

功能为设置环境变量

语法有两种

  1. ENV <key> <value>
  2. ENV <key>=<value> ...
复制代码

两者的区别就是第一种是一次设置一个,第二种是一次设置多个

在Dockerfile中使用变量的方式

  1. <p style="box-sizing: border-box; outline: 0px; margin-bottom: 16px; line-height: 26px; overflow: auto hidden;"><font color="#4d4d4d" face="-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif"><span style="font-size: 16px; font-variant-ligatures: no-common-ligatures;">$varname</span></font></p><p style="box-sizing: border-box; outline: 0px; margin-bottom: 16px; line-height: 26px; overflow: auto hidden;"><font color="#4d4d4d" face="-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif"><span style="font-size: 16px; font-variant-ligatures: no-common-ligatures;">${varname}</span></font></p><p style="box-sizing: border-box; outline: 0px; margin-bottom: 16px; line-height: 26px; overflow: auto hidden;"><font color="#4d4d4d" face="-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif"><span style="font-size: 16px; font-variant-ligatures: no-common-ligatures;">${varname:-default value}</span></font></p><p style="box-sizing: border-box; outline: 0px; margin-bottom: 16px; line-height: 26px; overflow: auto hidden;"><font color="#4d4d4d" face="-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif"><span style="font-size: 16px; font-variant-ligatures: no-common-ligatures;">$(varname:+default value}</span></font></p>
复制代码

第一种和第二种相同

第三种表示当变量不存在使用-号后面的值

第四种表示当变量存在时使用+号后面的值(当然不存在也是使用后面的值)



随机推荐

6 回复

snow
2023-2-21 11:33:01
出租一楼
桃花烟雨暮迟迟
2023-2-21 11:38:58
楼主

感谢支持,虽然有点水
xiu
2023-2-21 12:13:24
虽然看不懂,但是感觉好厉害的样子
uid=50
欢迎大家加入西柚论坛!
data
2023-2-21 17:48:06
看不懂,很厉害的样子
魔法巴拉
2023-2-22 10:59:48
admin_
2023-2-22 15:47:00
水水更健康
游客
高级模式
返回顶部