Dockerfile是docker 执行 build 镜像构建命令的时候所需的文件,描述了镜像构建所需的base image和构建镜像时需要做的事情
1. Dockerfile创建touch Dockerfile 注意:docker build 命令中的Dockerfile文件路径是指Dockerfile的父级文件夹路径,不是Dockerfile本体2. Dockerfile内容 常见指令:
#Version 1.0.0 注释 FROM centos:centos7 #指定base image MAINTAINER yuuma "xxxxx@qq.com" #设置作者信息 ENV REFRESHED_TIME 2022-06-06 #自定义环境变量 RUN yum install -y vim #在容器内执行的命令 EXPOSE 8080 #开放端口
| 指令 | 格式 | 用法 |
|---|---|---|
| FROM | FROM {container} | 指定构建镜像所引用的base image |
| MAINTAINER | MAINTAINER {author} {email} | 指定镜像的作者信息,可以通过docker inspect IMAGE命令查看 |
| ENV | ENV {key} {value} | 记录一个环境变量,可被这行指令之后的指令使用,在其它指令中使用$key即可调用,也可通过在容器内输入env查看 |
| RUN | RUN {command} | 执行一个命令,每一个RUN指令结束后都会构建一个新镜像并启动为容器执行下一个RUN指令 |
| EXPOSE | EXPOSE {port} | 开放端口,端口都需要手动开放 |
Tips : 环境变量可以通过在docker run时,使用参数 -e {…}来配置环境变量
CMD 和 ENTRYPOINT1.CMD :
CMD [ command ] CMD [ "/bin/bash" ] CMD [ "ls", "-a"]
CMD指令可以指定一个启动容器后执行的命令,使用效果等同于docke run命令后面跟随的容器执行命令
注意:CMD和docker run后的容器执行命令同时存在时,CMD的命令会被覆盖掉
2.ENTRYPOINT :
ENTEYPOINT [ command ] ENTEYPOINT [ "/bin/bash" ] ENTEYPOINT [ "ls", "-a"]
ENTRYPOINT结构与CMD相同,但是ENTRYPOINT指令可以作为执行命令的描述,使执行命令的参数通过CMD或者docke run后附带命令传递进来,例:
ENTRYPOINT [ "ls" ] #执行命令描述 CMD [ "/bin" ] 或 docker run IMAGE "/bin" #执行命令的参数 最终得到的容器内执行命令是 "ls /bin"WORKDIR
跳转到指定目录,执行后续指令,例:
WORKDIR /bin #后续指令将会在/bin目录下执行
WORKDIR与ENV的结合使用,例:
ENV HOME_PATH /home #配置环境变量HOME_PATH WORKDIR $HOME_PATH #跳转到/home目录下执行后续指令USER
指定该镜像构建成的容器将以哪个用户身份去执行,可以指定用户以及分组,例:
USER 用户名/UID:分组/GID USER user USER user:group USER user:gid USER uid USER uid:group USER uid:gid 还可以通过在docker run 命令中,使用-u参数指定执行容器的用户
Tips : 不指定用户的话,容器默认以root用户身份执行
VOLUME向镜像构建的容器中添加卷,例:
VOLUME [ "/home/myFIle" ] #为容器添加卷 VOLUME [ "/home/myFIle", "/usr/local" ] #可以为容器添加多个卷,以数组的形式书写即可
VOLUME指令添加的卷,绑定的宿主机地址默认为/var/lib/docker/volumes/{CONTAINER} (不同版本的docker可以会有所差异)
当docker run -v 和 VOLUME指定同一个目标目录时,-v 会覆盖掉VOLUME的映射
更多可以查阅 一文说清楚Dockerfile 中VOLUME到底有什么用? 这位大佬的博客
将外部文件复制到容器里,例:
ADD /home/myConf/myNginx.conf /etc/nginx/nginx.conf #上述代码将本机/home/myConf目录下的myNginx.conf文件,复制到了容器中的/etc/nginx目录下, #并命名为nginx.conf
ADD指令的文件源还可以是url格式,例:
ADD http://wordpress.org/latest.zip /home/latest.zip
如果将ADD的文件源指定为一个合法的归档文件(包括gzip, bzip2, xz)的话,Docker甚至会将其解开,例:
ADD latest.tar.gz /var/www/wordpress/
Tips:ADD 指令通过文件路径最后一个字符是否是 / 来判断需要处理的是文件目录还是文件
COPYCOPY和ADD非常相像,但是COPY仅仅只负责复制的工作,例:
COPY settings.xml /home/maven/
COPY的目标源必须是容器内的一个绝对路径,不存在的文件目录将会被创建
COPY的文件源必须和Dockerfile在同一目录下,不能复制该路径以外的
如果文件源源是文件,那文件随同元数据会被一起复制; 如果文件源是目录,那这整个目录包括文件系统元数据都会被复制
Tips:由该指令复制的文件或者目录,uid和gid都会设置为0
指定某指令为触发器,例:
FROM centos:centos7 MAINTAINER yuuma "xxxxx@qq.com" ENV REFRESHED_TIME 2022-06-06 RUN yum install -y git ONBUILD RUN yum install -y vim #触发器 EXPOSE 8080
成为触发器的那行指令,只有在当前Dockerfile构建时,或者作为其它镜像的base image被构建时,才会触发。(子镜像会触发,孙子之后的镜像不会触发)
Tips:FROM, MAINTAINER, ONBUILD,这三个指令都不能作为ONBUILD的触发器指令



