Dockerfile文件详解
什么是dockerfile?**
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
例:
docker build -f /path/to/a/Dockerfile
Dockerfile的基本结构**
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
Dockerfile文件说明**
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
在这里列出了一些常用的指令
指令 含义解释
FROM : FROM debian:stretch表示以debian:stretch作为基础镜像进行构建
MAINTAINER: 维护者信息
RUN : RUN后面跟的其实就是一些shell命令,通过&&将这些脚本连接在了一行执行,这么做的原因是为了减少镜像的层数,每多一行RUN都会给镜像增加一层,所以这里选择将所有命令联结在一起执行以减少层数
ARG : 特地将这个指令放在RUN之后讲解,这个指令可以进行一些宏定义,比如我定义ENV JAVA_HOME=/opt/jdk,之后RUN后面的shell命令中的${JAVA_HOME}都会被/opt/jdk代替
ENV : 可以看出这个指令的作用是在shell中设置一些环境变量(其实就是export)
FROM…AS…: 这是Docker 17.05及以上版本新出来的指令,其实就是给这个阶段的镜像起个别名:FROM ...(基础镜像) AS ...(别名)
,在后面引用这个阶段的镜像时直接使用别名就可以了
COPY: 顾名思义,就是用来来回复制文件的,COPY . /root/workspace/agent表示将当前文件夹(.表示当前文件夹,即Dockerfile所在文件夹)的所以文件拷贝到容器的/root/workspace/agent文件夹中。通过--from参数也可以从前面阶段的镜像中拷贝文件过来,比 如--from=builder表示文件来源不是本地文件系统,而是之前的别名为builder的容器
WORKDIR: 在执行RUN
后面的shell命令前会先cd
进WORKDIR
后面的目录
ENTRYPOINT: 这个参数表示镜像的“入口”,镜像打包完成之后,使用docker run命令运行这个镜像时,其实就是执行这个ENTRYPOINT后面的可执行文件(一般是一个shell脚本文件),也可以通过["可执行文件", "参数1", "参数2"]这种方式来赋予可执行文件的执行参数,这个“入口”执行的工作目录也是WORKDIR后面的那个目录
各命令详解
FROM
指定哪种镜像作为新镜像的基础镜像,如:
FROM ubuntu:<span>14.04</span>
### MAINTAINER
指明该镜像的作者和其电子邮件,如:
MAINTAINER vector4wang <span>"</span><span>xxxxxxx@qq.com</span><span>"</span>
### LABEL
给镜像添加信息。使用docker inspect可查看镜像的相关信息
LABEL maintainer=<span>"</span><span>394498036@qq.com</span><span>"</span><span> LABEL version</span>=<span>"</span><span>1.0</span><span>"</span><span> LABEL description</span>=<span>"</span><span>This is description </span> 欢迎关注:编程坑太多,我在等你.<span>"</span>
RUN
在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境,可使用来换行,如:
RUN echo <span>'</span><span>hello docker!</span><span>'</span><span> \ </span>> /usr/local/file.txt
也可以使用exec格式RUN ["executable", "param1", "param2"]
的命令,如:
RUN [<span>"</span><span>apt-get</span><span>"</span>,<span>"</span><span>install</span><span>"</span>,<span>"</span><span>-y</span><span>"</span>,<span>"</span><span>nginx</span><span>"</span>]
要注意的是,executable
是命令,后面的param是参数
### COPY
将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:
COPY application.yml /etc/springboot/hello-service/src/resources
注意:需要复制的目录一定要放在Dockerfile文件的同级目录下
原因:
> 因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。
> ---《THE DOCKER BOOK》
### ADD
将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样,如:
ADD application.yml /etc/springboot/hello-service/src/resources
但是ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。
### EXPOSE
暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):
EXPOSE <span>8080</span><span> EXPOSE </span><span>8081</span><span> ...</span>
WORKDIR
在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如
WORKDIR /usr/<span>local WORKDIR webservice RUN </span><span>echo</span> <span>'</span><span>hello docker</span><span>'</span> ><span> text.txt ...</span>
最终会在/usr/local/webservice/
目录下生成text.txt文件
ONBUILD
当一个包含ONBUILD命令的镜像被用作其他镜像的基础镜像时(比如用户的镜像需要从某为准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该命令就会执行。
如创建镜像image-A
FROM ubuntu
...
ONBUILD ADD . /var/www
...
然后创建镜像image-B,指定image-A为基础镜像,如
FROM image-<span>A ...</span>
然后在构建image-B的时候,日志上显示如下:
Step <span>0</span> : FROM image-<span>A # Execting </span><span>1</span><span> build triggers Step onbuild</span>-<span>0</span> : ADD . /var/<span>www ...</span>
USER
指定该镜像以什么样的用户去执行,如:
USER mongo
### VOLUME
用来向基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据)
如:
VOLUME /data/db /data/configdb
注意:VOLUME 主机目录 容器目录
### CMD
容器启动时需要执行的命令,如:
CMD /bin/bash
同样可以使用exec语法,如
CMD [<span>"</span><span>/bin/bash</span><span>"</span>]
当有多个CMD的时候,只有最后一个生效。
### ENTRYPOINT
作用和用法和CMD一模一样
### CMD和ENTRYPOINT的区别
敲黑板!!!非常重要
一定要注意!
一定要注意!
一定要注意!
CMD和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点:
* CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会
如使用CMD ["/bin/bash"]
或ENTRYPOINT ["/bin/bash"]
后,再使用docker run -ti image
启动容器,它会自动进入容器内部的交互终端,如同使用
docker run -ti image /bin/bash
。
但是如果启动镜像的命令为docker run -ti image /bin/ps
,使用CMD后面的命令就会被覆盖转而执行bin/ps
命令,而
。
以下例子比较容易理解
Dockerfile中为
...
ENTRYPOINT ["/user/sbin/nginx"]
然后通过启动build之后的容器
docker run -ti image -g <span>"</span><span>daemon off</span><span>"</span>
此时-g "daemon off"
会被当成参数传递给ENTRYPOINT,最终的命令变成了
/user/sbin/nginx -g <span>"</span><span>daemon off</span><span>"</span>
* CMD和ENTRYPOINT都存在时
CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖,如:
...
ENTRYPOINT ["echo","hello","i am"]
CMD ["docker"]
之后启动构建之后的容器
- 使用
docker run -ti image
输出“hello i am docker” - 使用
docker run -ti image world
输出“hello i am world”
指令比较多,可以通过分类(如开头的表格)的办法去记忆
示例
自己写了个简单的示例,非常简单
FROM ubuntu
MAINTAINER vector4wang xxxx@qq.com
WORKDIR /usr/local/docker
ADD temp.zip ./add/
COPY temp.zip ./copy/
EXPOSE 22
RUN groupadd -r vector4wang && useradd -r -g vector4wang vector4wang
USER vector4wang
ENTRYPOINT ["/bin/bash"]
选材新颖独特,通过细节描写赋予主题鲜活生命力。
作者的观点新颖且实用,让人在阅读中获得了新的思考和灵感。
论点鲜明,论据链环环相扣,论证有力。
《特技狂人》动作片高清在线免费观看:https://www.jgz518.com/xingkong/5262.html
《在迷途》记录片高清在线免费观看:https://www.jgz518.com/xingkong/100057.html
《割腕者的天堂》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/78049.html
《特技狂人》动作片高清在线免费观看:https://www.jgz518.com/xingkong/5262.html
《重装警察》动作片高清在线免费观看:https://www.jgz518.com/xingkong/49416.html
6666啊woc