文章目录
- dockerfile是什么
- Dockerfile常用指令
- 1. FROM
- 2. MAINTAINER
- 3. WORKDIR
- 4.COPY
- 5.ADD
- 6.ENV
- 7.RUN
- 8.CMD
- 9.ENTRYPOINT
dockerfile是什么
Dockerfile是一个文本配置文件,用于自动化构建Docker镜像。
Dockerfile是由一系列命令和参数构成的脚本,它指导Docker守护程序如何一步步构建出一个Docker镜像。这个文件通常包含以下几个部分:
- 基础镜像(FROM):指定一个已存在的镜像作为新镜像的基础。
- 维护者信息(MAINTAINER):记录镜像创建者的联系信息。
- 操作指令(如ADD、RUN等):定义在镜像构建过程中需要执行的步骤,例如添加文件、安装软件包等。
- 容器启动后指令:设置容器启动时执行的命令,如启动服务等。
使用Dockerfile的好处在于,它允许用户通过一个简单的文本文件来定义和控制镜像的构建过程,确保了容器的一致性和可重复性。此外,Dockerfile还支持#作为注释行,以及可以使用反斜杠将长指令分布在多行上,以提高可读性。
Dockerfile常用指令
1. FROM
# 制作基础镜像:基于openjdk 镜像
FROM openjdk:8
2. MAINTAINER
# 谁创造了它(作者信息)
MAINTAINER zhupeng
3. WORKDIR
# 类似于Linux中的cd命令:cd高级的地方在于,若发现没有这个目录,就自动创建出来,建议使用绝对路径
WORKDIR /usr/local/testdir
4.COPY
# 文件拷贝
# 案例一:将1.txt拷贝到根目录下。它不仅仅能拷贝单个文件,还支持Go语言风格的通配符,比如如下:
COPY 1.txt /
# 案例二:拷贝所有 abc 开头的文件到testdir目录下
COPY abc* /testdir/
# 案例三:? 是单个字符的占位符,比如匹配文件 abc1.log
COPY abc?.log /testdir/
5.ADD
# 往它肚子里放点文件(会自动解压)
ADD springboot-1.0-SNAPSHOT.jar app.jar
# 案例一:将1.txt拷贝到根目录的abc目录下。若/abc不存在,则会自动创建
ADD 1.txt /abc
# 案例二:将test.tar.gz解压缩然后将解压缩的内容拷贝到/home/work/test
ADD test.tar.gz /home/work/test
# docker官方建议当要从远程复制文件时,尽量用curl/wget命令来代替ADD。因为用ADD的时候会创建更多的镜像层。镜像层的size也大。
ADD/COPY对比
1.二者都是只复制目录中的文件,而不包含目录本身。
2.COPY能干的事ADD都能干,甚至还有附加功能。
3.ADD可以支持拷贝的时候顺带解压缩文件,以及添加远程文件(不在本宿主机上的文件)
4.只是文件拷贝的话可以用COPY,有额外操作可以用ADD代替。
6.ENV
# 设置环境常量,方便下文引用
ENV JAVA_HOME /usr/local/jdk1.8
RUN ${JAVA_HOME}/bin/java -jar xxx.jar
7.RUN
# RUN指令是在构建镜像时运行,在构建时能修改镜像内部的文件[docker::build]
# SHELL命令格式:RUN yum -y install vim
# EXEC命令格式: RUN ["yum","-y","install","vim"]
# SHELL:当前shell是父进程,生成一个子shell进程去执行脚本,脚本执行完后退出子shell进程,回到当前父进程。
# EXEC:用EXEC进程替换当前进程,并且保持PID不变,执行完毕后直接退出,不会退回原来的进程。
# 总结:也就是说shell会创建子进程执行,EXEC不会创建子进程。推荐EXEC命令格式
8.CMD
# 1.容器启动时执行,而不是镜像构建时执行[docker run]
# 2.Dockerfile中只有最后一个ENTRYPOINT会被执行,推荐用EXEC格式。
# 3.重点在于如果容器启动的时候有其他额外的附加指令,则CMD指令不生效。
9.ENTRYPOINT
# 容器创建时执行,而不是镜像构建时执行。
# Dockerfile中只有最后一个ENTRYPOINT会被执行,推荐用EXEC格式。
ENTRYPOINT ["java","-jar","app.jar"]
# 给我一个存放行李的地方(目录挂载):将本地文件夹挂载到当前容器
VOLUME /tmp
# 声明需要暴露的端口
EXPOSE 8080