Dockerfile文件的书写规则

     Dockerfile的指令是忽略大小写的,建议使用大写,使用#作为注释,每一行只支持一条指令,每条指令可以携带多个参数。
     Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。

#### 1.FROM
构建指令
用法:
FROM
或:
FROM :

FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。
FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像。
如果FROM语句没有指定镜像标签,则默认使用latest标签。

2.MAINTAINER

构建指令
用法:

MAINTAINER
用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。

3.RUN

构建指令
用法:

 1.RUN <command> (the command is run in a shell - `/bin/sh -c`)  
2. RUN ["executable", "param1", "param2" ... ]  (exec form)  

每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的RUN都在之前RUN提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建,类似源码的版本控制。
RUN产生的缓存在下一次构建的时候是不会失效的,会被重用,可以使用–no-cache选项,即docker build –no-cache,如此便不会缓存。

4.CMD

设置指令
用法:

1.CMD ["executable","param1","param2"] (like an exec, this is the preferred form)  
2. CMD command param1 param2 (as a shell) 
当Dockerfile指定了ENTRYPOINT,那么使用下面的格式:
3.CMD ["param1","param2"] (as default parameters to ENTRYPOINT)  
    ENTRYPOINT指定的是一个可执行的脚本或者程序的路径,
    该指定的脚本或者程序将会以param1和param2作为参数执行。
    所以如果CMD指令使用上面的形式,
    那么Dockerfile中必须要有配套的ENTRYPOINT。

CMD指定在 Dockerfile 中只能使用一次,如果有多个,则只有最后一个会生效。

CMD的目的是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。

CMD会在启动容器的时候执行,build 时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了。

5.EXPOSE

设置指令
用法:
EXPOSE […]

# 映射一个端口  
EXPOSE port1  
# 相应的运行容器使用的命令  
docker run -p port1 image  
# 映射多个端口  
EXPOSE port1 port2 port3  
# 相应的运行容器使用的命令  
docker run -p port1 -p port2 -p port3 image  
# 还可以指定需要映射到宿主机器上的某个端口号  
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image  
6.ENV

构建指令,在image中设置一个环境变量。
用法:

1.ENV <key> <value>       # 只能设置一个变量  
2.ENV <key>=<value> ...   # 允许一次设置多个变量

设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run –env key=value时设置或修改环境变量。

7.ADD

构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果是文件且中不使用斜杠结束,则会将视为文件,的内容会写入;如果是文件且中使用斜杠结束,则会文件拷贝到目录下。
格式:

ADD <src> <dest>  

(从src复制文件到container的dest路径)
是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
是container中的绝对路径

8.COPY

构建指令

COPY <src>... <dest>

COPY复制新文件或者目录从 并且添加到容器指定路径中 。用法同ADD,唯一的不同是不能指定远程文件 URLS。

9.ENTRYPOINT

用法:

1.ENTRYPOINT "executable", "param1", "param2"
2.ENTRYPOINT command param1 param2 (shell form)

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖,而CMD是可以被覆盖的。如果需要覆盖,则可以使用docker run –entrypoint选项。

每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效。

10.VOLUME(指定挂载点)

设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。
格式:

1. VOLUME ["<mountpoint>"]  


01. FROM base  
02. VOLUME ["/tmp/data"]  

运行通过该Dockerfile生成image的容器,/tmp/data目录中的数据在容器关闭后,里面的数据还存在。例如另一个容器也有持久化数据的需求,且想使用上面容器共享的/tmp/data目录,那么可以运行下面的命令启动一个容器:

01. docker run -t -i -rm -volumes-from container1 image2 bash  

container1为第一个容器的ID,image2为第二个容器运行image的名字。

11.USER
USER daemon

指定运行容器时的用户名或 UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户。

12.WORKDIR

设置指令
可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。
格式:

WORKDIR /path/to/workdir  

# 在 /p1/p2 下执行 vim a.txt  
WORKDIR /p1 WORKDIR p2 RUN vim a.txt 
13.ONBUILD(在子镜像中执行)
ONBUILD <Dockerfile关键字>  

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值