1、什么是Dockerfile
Dockerfile 是一个文本文件,其中包含一条条指令,每一条指令都用于构建镜像中的每一层。Dockerfile可以使用docker build
命令进行编译。在编写Dockerfile 之前先看看常用的镜像命令。
1.1 FORM命令
FORM
命令用来指定基础镜像,后面所有的操作都是基于这个基础镜像进行操作的 (基础镜像一般使用Alpine镜像,优点是小巧,安装速度比较快)
1.2 MAINTAINER命令
MAINTAINER
命令用于将镜像作者相关的信息一起写入镜像中,通常格式为:MAINTAINER 作者姓名 邮箱地址 后续执行docker inspect 命令可以输出相应作者信息 如下所示
1.3 RUN
命令
RUN
用于创建一个新的容器并执行一个命令,RUN命令最常用的就是安装包用的apt-get 命令,关于这个命令需要注意以下两点:
(1) 不要使用RUN apt-get upgrade 命令或者dist-upgrade 命令
如果基础镜像中某个包版本比较旧,盲目升级会导致意想不到的兼容问题,如果确定某个包需要升级(如foo),可以使用apt-get install -y foo
它会自动升级foo包。
(2)将RUN apt-get update
命令和apt-get install
命令组合成一条RUN声明。
将RUN apt-get update
命令放在一条单独的RUN声明会导致缓存问题,以及后续的apt-get install 命令执行失败,因此,通常将RUN apt-get update
命令个apt-get install
命令组合成一条RUN命令(为了保持Dockerfile文件的可读性和可维护性,一般将长的命令或复杂的命令使用反斜杠"\"进行连接)
RUN apt-get update && apt-install -y \
package-a \
package-b \
package-c \
1.3 ADD
和COPY
命令
ADD命令和COPY命令的功能都是实现复制,但一般优先使用COPY命令,因为COPY比ADD命令更透明。
COPY命令只支持将宿主机文件复制到容器中,而ADD命令有一些不明显的功能(如将宿主机tar提取和远程URL支持)。因此,ADD命令的最坚固用了是将宿主机的tar文件自动提取到镜像中,如"ADD jdk-8u421-linux-x64.tar.gz"。为了使镜像尽可能小,一般不建议使用ADD命令从远程URL中获取包,而是使用curl和wget。 这样就可以在文件提取完之后删除不需要的文件从而减小镜像体积。
1.4 ENV
命令
ENV
用于为容器安装的程序更新PATH环境变量。例如使用ENV PATH /usr/local/nginx/bin:$PATH
来确保后面的CMD [nginx]
命令可用。 ENV
命令也可以为容器化的服务提供必要的环境变量,如MySQL的MYSQL_ROOT_PASSWORD
1.5 WORKDIR
命令
指定工作目录
1.6 EXPOSE
命令
EXPOSE
命令用于指定容器将要监听的端口,比如Nginx应该使用EXPOSE 80
1.7 CMD
和ENTRPOINT
命令
CMD
和ENTRPOINT
命令都可以用于设置容器启动时要执行的命令。在Dockerfile文件中,CMD
和ENTRPOINT
命令至少必有其一。
1.8 VOLUME
命令
VOLUME
命令用于指定宿主机和容器目录的映射,一般为配置文件或者容器创建的文件和目录,如Nginx的配置文件
下面通过一个简单的示例来演示如何使用Dockerfile 构建我们的镜像。
FROM centos # 指定基础镜像为CentOS
MAINTAINER cgr caicai105230@gmail.com # 作者信息
RUN mkdir /root/training # 在CentOS中创建一个"/root/training" 目录
RUN mkdir /root/tools # 在CentOS中创建一个"/root/tools" 目录
COPY jdk-8u421-linux-x64.tar.gz /root/tools # 将宿主机的JDK二进制文件复制到CentOS的"/root/tools" 目录下
RUN tar zxvf /root/tools/jdk-8u421-linux-x64.tar.gz -C /root/training # 将JDK二进制文件解压到CentOS的"/root/training" 目录下
ENV JAVA_HOME /root/training/jdk1.8.0_421
ENV PATH $JAVA_HOME/bin: $PATH # 在CentOS中设置JAVA_HOME 环境变量
ADD https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.96/bin/apache-tomcat-9.0.96.tar.gz /root/tools # 从Apache网站下载Tomcat的二进制安装文件
RUN tar zxvf /root/tools/apache-tomcat-9.0.96.tar.gz -C /root/training # 将Tomcat二进制安装文件解压到CentOS 的"/root/training" 目录
COPY MyDemoWeb.war /root/training/apache-tomcat-9.0.96/webapps # 将宿主机上的MyDemoWeb.war 复制到CentOS 的Tomcat 的webapps目录下
ENTRYPOINT ["/root/training/apache-tomcat-9.0.96/bin/catalina.sh", "run"] # 启动容器时运行Tomcat
使用docker build -t 镜像名称:tag .
命令编译Dockerfile文件,参数-t用于指定镜像的标签名称,这里一定要注意,命令中最后的".",是当前命令行执行的所在目录,千万不要忽略了。
构建完成后使用docker images
查看镜像列表
补充用法
docker build -t 项目:tag 上下文(Dockerfile配置文件所在的文件夹)
# 指定Dockerfile 位置
docker build -f Dockerfile地址
# 远程Dockerfile配置文件的地址
docker build URL
避坑指南
Status: Downloaded newer image for 111.229.198.148/library/vue-demo:latest WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested exec /docker-entrypoint.sh: exec format error
这个问题是因为在Mac系统中,构建了镜像,发布到镜像仓库中,然后pull 下来运行时报的错
docker build -t image-name:tag .
解决方案 使用docker build 时使用参数--platform
指定平台类型
docker build --platform linux/amd64 -t image-name:tag .
评论区