目录
1、介绍(详细见格式)
FROM 指定基础镜像(常用)
RUN 用来执行命令行命令的(常用)
ADD 复制文件,会自动解压
WORKDIR 设置进入容器后的当前工作目录,默认是/目录,可 设置为root家目录【WORKDIR /root】,表示当容器 启动后会自动进入/root下而不是/下,相当于cd。
EXPOSE 指定对外端口【若做了指定端口映射,docker ps可以看到指定的对外端口,若没做指定端口映射,默认在PORTS列为空,使用此选项可以看到指定的端 口与宿主机的哪些端口做了映射,例EXPOSE 22 80, 这样就可以看到22和80与宿主机的哪些端口做了 随机映射,】,-p 是随机端口,EXPOSE命令只是声明了容器应该打开的端口并没有实际上将它打开!
CMD 指定容器启动后要做什么(容易被替换)
ENTRYPOINT 容器启动后执行的命令,使用此参数后初始命令不 容易被覆盖
VOLUME 设置卷,挂载工作目录(不常用)
ENV 容器的环境变量
COPY 复制文件,目录一定要以/结尾不然会识别成文件
【容器启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD】
【若制作镜像时候不指定CMD,会自动使用初始镜像内的CMD命令】
2、格式
2.1 COPY
格式:COPY 主机路径下文件 容器内路径下
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
COPY hom* /mydir/
COPY hom?.txt /mydir/
【文件和dockerfile要在同一目录下,且不要使用绝对路径,如下所示】
【COPY test.sh /root/test.sh 这种是对的】
【COPY /root/test.sh /root/test.sh 主机路径使用绝对路径会报错】
2.2 ADD 更高级的复制文件
ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。在某些情况下,这个自动解压缩的功能非常有用。
FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
官方要求尽可能的使用 COPY ,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用COPY 指令,仅在需要自动解压缩的场合使用 ADD。
2.3 CMD 容器启动命令
CMD <命令>
CMD echo $HOME
CMD ["可执行文件", "参数1", "参数2"...]
CMD [ "sh", "-c", "echo $HOME" ]
CMD ["参数1", "参数2"...]
CMD 指令就是用于指定默认的容器主进程的启动命令的,在运行时可以指定新的命令来替代镜像设置中的这个默认命令
【注意:Docker不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样;CMD service nginx start这种写法时错误的】
【正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行;CMD ["nginx", "-g", "daemon off;"]】
【若制作镜像时候不指定CMD,会自动使用初始镜像内的CMD命令】
2.4 ENTRYPOINT 入口点
ENTRYPOINT的格式和 RUN 指令格式一样,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数--entrypoint来指定。应用场景:
① 让镜像变成像命令一样使用
② 应用运行前的准备工作
2.5 ENV 设置环境变量
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>
ENV VERSION=1.0 DEBUG=on
ENV NODE_VERSION 7.2.0
2.6 ARG 构建参数
ARG <参数名>[=<默认值>]
和 ENV 的效果一样,都是设置环境变量。所不同的是, ARG 所设置的构建环境的
环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的,该默认值可以在构建命令docker build中用--build-arg <参数名>=<值>来覆盖。
2.7 VOLUME 定义匿名卷
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
① dockerfile中写法:VOLUME /data
② docker run -d -v mydata:/data xxxx,在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了Dockerfile 中定义的匿名卷的挂载配置。
2.8 EXPOSE 声明端口
EXPOSE <端口1> [<端口2>...]
EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来,若不使用的话就是docker随机映射了
参数-p ,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问。
EXPOSE命令只是声明了容器应该打开的端口并没有实际上将它打开!也就是说,如果你不用-p或者-P中指定要映射的端口,你的容器是不会映射端口出去的,从而我们知道我们是没有办法在Dockerfile里面进行端口映射的,我们只能在容器启动的时候或者在docker-compose文件中使用ports来指定将要映射的端口。
那我们的EXPOSE能用来干什么呢?第一点就是写在Dockerfile中进行声明,能让运维人员或者后来者知道我们开启了容器的哪些端口。还有一点就是,当我们声明了EXPOSE端口之后,我们使用-P命令进行随机映射的时候,是会对这个端口进行映射的。比如说我们现在对一个tomcat容器进行EXPOSE 9999声明,那么我们进行-P随机映射的时候是会对9999端口进行映射的。
2.9 WORKDIR 指定工作目录
WORKDIR <工作目录路径>
3.0 USER 指定当前用户
WORKDIR 一样, USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。
[root@test-ybb-1 test3]# cat dockerfile
FROM nginx:latest
RUN useradd qq
USER qq
RUN echo "hello" > world.txt
3.1 总结
如果以 root 执行的脚本,在执行期间希望改变身份,比如希望以某个已经建立好的用户来运行某个服务进程,不要使用 su 或者 sudo ,这些都需要比较麻烦的配置,而且在 TTY 缺失的环境下经常出错。建议使用 gosu(该命令需要下载安装)