导图社区 Dockerfile
这是一篇关于Dockerfile的思维导图,主要内容有FROM、MAINTAINER、LABEL、COPY、ADD、EXPOSE、ENV、ARG。
编辑于2022-08-13 08:44:55Spring基础 高级功能详解,如 additional-spring-configuration-metadata.json将会合并到spring-configuration-metadata.json中,并覆盖掉相同的说明。
敏捷开发相关的理论知识--Scrum,我们的最高目标是通过尽早和持续第交付有价值的软件来满足客户;欢迎对需求提出变更 - 即使在项目开发后期,要善于利用需求变更,帮助客户获得竞争优势;
这是一篇关于Dockerfile的思维导图,主要内容有FROM、MAINTAINER、LABEL、COPY、ADD、EXPOSE、ENV、ARG。
社区模板帮助中心,点此进入>>
Spring基础 高级功能详解,如 additional-spring-configuration-metadata.json将会合并到spring-configuration-metadata.json中,并覆盖掉相同的说明。
敏捷开发相关的理论知识--Scrum,我们的最高目标是通过尽早和持续第交付有价值的软件来满足客户;欢迎对需求提出变更 - 即使在项目开发后期,要善于利用需求变更,帮助客户获得竞争优势;
这是一篇关于Dockerfile的思维导图,主要内容有FROM、MAINTAINER、LABEL、COPY、ADD、EXPOSE、ENV、ARG。
Dockerfile
环境介绍
1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录
2.Dockerfile中相对路径默认都是Dockerfile所在的目录
构建Dockerfile
docker build -f Dockerfile文件路径 -t 标题名 .
-f: --file 可无 默认文件 Dockerfile -t: --tag 可无 自动生成标题名 .: 必输 Docker守护进程
3.Dockerfile中一定要惜字如金,能写到一行的指令,一定要写到一行,原因是分层构建,联合挂载这个特性。
4.Dockerfile中指明大写(约定俗成)
Dockerfile中每一条指令被视为一层
元素
FROM
指定基础镜像,并且必须是第一条指令,如果不以任何镜像为基础,那么写法为:FROM scratch。
MAINTAINER
指定作者,新版docker中使用LABEL指明
LABEL
为镜像指定标签
格式: LABEL <key>=<value> <key>=<value> <key>=<value> ... 示例: LABEL version="1.0" description="这是一个Web服务器" by="IT笔录" 注: 使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
COPY
功能类似ADD,但是不会自动解压文件,也不能访问网络资源
ADD
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式: ADD <src>... <dest> ADD ["<src>",... "<dest>"] 用于支持包含空格的路径 示例: ADD hom* /mydir/ # 添加所有以"hom"开头的文件 ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt" ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/ ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
ADD test relativeDir/ 到容器工作目录 ADD test /relativeDir 到容器绝对路径 ADD http://example.com/foobar / 下载文件到容器目录
EXPOSE
暴漏容器运行时监听端口给外部
格式: EXPOSE <port> [<port>...] 示例: EXPOSE 80 443 EXPOSE 8080 EXPOSE 11211/tcp 11211/udp 注: EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
EXPOSE <port>/<tcp/udp>
只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
好处
在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射 EXPOSE 的端口
声明端口,方便使用者知道内部端口使用情况
ENV
作用
设置环境变量
格式: ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量 ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行 示例: ENV myName John Doe ENV myDog Rex The Dog ENV myCat=fluffy
作用范围
在build docker imag的过程中有效,在image被创建和container启动后作为环境变量依旧也有效,并且可以重写覆盖
格式
设置
一次设置一个
ENV <key> <value>
一次设置多个
ENV <key>=<value> <key>=<value>
换行设置多个
ENV VERSION=1.0 DEBUG=on \ NAME="Happy Feet"
使用
在Dockerfile中使用变量的方式 $varname ${varname} ${varname:-default value} $(varname:+default value} 第一种和第二种相同 第三种表示当变量不存在使用-号后面的值 第四种表示当变量存在时使用+号后面的值(当然不存在也是使用后面的值)
ARG
格式: ARG <name>[=<default value>] 示例: ARG site ARG build_user=www
作用
设置变量命令,ARG命令定义变量,可多个
作用范围
仅仅在build docker image的过程中(包括CMD和ENTRYPOINT)有效
arg设置的key-value可以在env中使用
在docker build创建镜像的时候,使用 --build-arg =来指定参数
格式
设置
ARG user1=someuser
build时不指定则用当前默认值
ARG buildno
build时不指定则会警告
使用
注意
如果没有给初始值,build时如果没有指定该arg则会失败
RUN
运行指定的命令
shell格式
RUN <command>
exec格式
RUN ["executable", "param1", "param2"]
注意:RUN是构件容器时就运行的命令以及提交运行结果
场景
安装装软件
CMD
容器启动时要运行的命令
格式: CMD ["executable","param1","param2"] (执行可执行文件,优先) CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数) CMD command param1 param2 (执行shell内部命令) 示例: CMD echo "This is a test." | wc - CMD ["/usr/bin/wc","--help"] 注: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
shell格式
CMD command param1 param2
CMD echo "hello"
exec格式
CMD ["executable","param1","param2"]
CMD [ "sh", "-c", "echo $HOME"]
CMD ["param1","param2"]
CMD [ "echo", "$HOME" ]
注意: 1:包括参数的一定要用双引号,不能是单引号。千万不能写成单引号。 2:CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子 3:写一条,如果写了多条,那么只有最后一条生效
使用场景
指定容器的默认执行的命令
启动命令中指定了命令,则cmd失效
ENTRYPOINT
启动时的默认命令
格式: ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先) ENTRYPOINT command param1 param2 (shell内部命令) 示例: FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"] 注: ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
shell格式
ENTRYPOINT command param1 param2
exec格式
ENTRYPOINT ["executable", "param1", "param2"]
注意: 1:写一条,如果写了多条,那么只有最后一条生效 2:容器启动时才运行 3:ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖 4:如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效
使用场景
区别
CMD 和 RUN 的区别
RUN命令适用于在 docker build 构建docker镜像时执行的命令 CMD命令是在 docker run 执行docker镜像构建容器时使用
CMD 和 ENTRYPOINT的区别
shell 写法环境下
如果存在 ENTRYPOINT命令,则不管是在Dockerfile中存在CMD命令也好,还是在 docker run执行的后面添加的命令也好,CMD都不会被执行。 如果不存在 ENTRYPOINT命令,则可以被 docker run后面设置的命令覆盖,实现动态执行命令操作
exec 写法环境下
如果存在 ENTRYPOINT命令,则在Dockerfile中如果存在CMD命令或者是在 docker run执行的后面添加的命令,会被当做 ENTRYPOINT命令的参数来使用
FROM centos CMD ["hello"] ENTRYPOINT ["echo"] 使用 docker run xxx 后,显示打印 hello,此时 CMD命令的内容会被充当ENTRYPOINT命令的参数,且这种情况,CMD命令的内容不会被ENTRYPOINT命令覆盖,还可以支持在docker run 后面的命令覆盖 Dockerfile中的CMD命令。 例如:执行 docker run xx helllo-docker , 会显示打印 hello-docker,可以得出 此时 docker run后面的内容将Dockerfile中的最后一条CMD命令的参数内容覆盖,搭配ENTRYPOINT命令使用。这种方法较常用,可以支持动态修改参数内容,保存执行命令一样。
VOLUME
将宿主机目录挂载到容器中
格式: VOLUME ["/path/to/dir"] 示例: VOLUME ["/data"] VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2" 注: 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能: 1 卷可以容器间共享和重用 2 容器并不一定要和其它容器共享卷 3 修改卷后会立即生效 4 对卷的修改不会对镜像产生影响 5 卷会一直存在,直到没有任何容器在使用它
VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db
USER
启动容器的用户,可以是用户名或UID
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户 格式: USER user USER user:group USER uid USER uid:gid USER user:gid USER uid:group 示例: USER www 注: 使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
USER daemo
USER UID
WORKDIR
切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效
设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效
格式: WORKDIR /path/to/workdir 示例: WORKDIR /a (这时工作目录为/a) WORKDIR b (这时工作目录为/a/b) WORKDIR c (这时工作目录为/a/b/c) 注: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
WORKDIR /a WORKDIR b WORKDIR c RUN pwd 值:/a/b/c
#也可解析环境变量 WORKDIR $DIRPATH/$DIRNAME
ONBUILD
格式: ONBUILD [INSTRUCTION] 示例: ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src 注: 当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
ONBUILD RUN ls -al
只对当前镜像的子镜像生效
相当于临时加一个镜像层输出前边镜像的信息
STOPSIGNAL
当容器停止时给系统发送什么样的指令,默认是15
HEALTHCHECK