Dockerfile

发布于:2022-12-07 ⋅ 阅读:(426) ⋅ 点赞:(0)

Dockerfile,相当于是一个文档,客户可以基于dockerfile生成新的容器

Dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指定进行自动构建容器,基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像都是多层叠加而成,因此,层越多,效率越低,创建镜像,层越少越好。因此能在一个指令完成的动作尽量通过一个指令定义。

Dockerfile中的常用指令:

 RUN,CMD,ENTRYPOINT的区别

A.RUN 指令:用于指定 docker build 过程中要运行的命令,可以写多条

B.CMD和ENTRYPOINT在运行容器时运行,只能写一条,如果是写多条,最后一条生效 C.CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 D.ENTRYPOINT类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆 盖,如果运行 docker run 时使用了 --entrypoint 选项,

此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序;

1 FROM ---指定基础镜像(基础镜像不存在会在Docker Hub上拉去)

使用格式:   

FROM :[tag]     

FROM @digest[校验码] 

2 MAINTANIER --提供Dockerfile 制作者提供本人信息

    [逐渐废弃]

LABLE --替代MAINTANIER 

具体使用:

LABLE maintainer="作者信息"

使用格式:

MAINTANIER "制作者信息"

3 COPY --把宿主机中的文件复制到镜像中去!

    文件要在Dockerfile工作目录

src 原文件

    --支持通配符

    --通常相对路径

dest 目标路径   

    --通常绝对路径

有空白字符隔开的字串需要用"",否则会被当做两个文件!

文件复制准则:

1 src必须是build上下文中的路径,不能是其父目录

2 如果src是目录,则其内部文件或子目录会被递归复制

   但src目录自身不会被复制

3 如果指定了多个src,或在src中使用了通配符,则dest必须是一个

  目录,且必须以/结尾

4 如果dest实现不存在,它将会被自动创建,这包括其父目录

4 ADD --类似COPY命令

支持URL路径----如果可以访问网络的话,会访问网络下载

到本地然后打包进镜像!

操作准则:

1 如果src为URL且dest不以/结尾,则src指定的文件将被下载并

直接被创建为dest;如果dest以/结尾,则文件名URL指定的文件

将被直接下载并保存为dest/filename

2 如果是压缩包会被解压,但通过URL路径获取到的tar文件不会被展开

3 如果src有多个,或其间接或直接使用了通配符,则dest必须是一个

以/结尾的目录路径,如果dest不以/结尾,则其被视为一个普通文件

src的内容将被直接写入到dest中!

5 WORKDIR --指定工作目录

每次只会影响这个指令后续的指令

ADD nginx-1.14.2.tar.gz /usr/local/src/ --不受影响

WORKDIR /usr/local/src/

ADD nginx-1.14.2.tar.gz ./ --受影响

.............................................................

6 VOLUME --卷

只能定义docker管理的卷:

VOLUME /data/mysql

运行的时候会随机在宿主机的目录下生成一个卷目录!

................................................................

7 EXPOSE 为容器打开指定要监听的端口以实现与外部通信

使用格式:

EXPOSE 80/tcp 23/udp

不加协议默认为tcp

使用-P选项可以暴露这里指定的端口!

但是宿主的关联至这个端口的端口是随机的!

..............................................................

8 ENV

用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于

其后的其它命令所调用

调用格式:

$A 或 ${A}

ENV  

ENV =

第一种格式中,key之后的所有内容均会被其视作的组成部分

因此,一次只能设置一个变量!

第二种格式可用一次设置多个变量,每个变量为一个=

的键值对,如果中包含空格,可以反斜线(\)进行转义

也可以通过对加引号进行标识。另外,反斜线也可用于续航

定义多个变量时。建议使用第二种方式,以便在同一层中完成所有功能

具体用法:

ENV JAVA_HOME /usr/local/jdk

ENV JRE_HOME $JAVA_HOME/jre

ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/

ENV PATH $PATH:$JAVA_HOME/bin/

..............................................................

9 RUN命令:

使用格式:

RUN

RUN ["","",""]

第一种格式中 来运行它

这意味此进程在容器中的PID不能为1,不能接收Unix信号,因此,当使用docker stop命令

来停止容器时,此进程接收不到信号

第二种语法格式中的参数是一个JSON格式的数组,其中为要运行的命令,后面的

为传递给命令的选项或参数,然而,此种格式指定的命令不会以"/bin/sh -c">来运行它

因此常见的shell操作如变量替换以及通配符替换将不会进行 不过如果要运行的命令依赖于

此shell特性的话,可以将其替换为下面的格式:

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


网站公告

今日签到

点亮在社区的每一天
去签到