dockerfile文件参数详解

简介:dockerfile文件中FROM的作用,LABEL的作用,RUN的作用,WORKDIR的作用,CMD的作用、ENTRYPOINT的作用,ADD和COPY的作用,ENV的作用

1. FROM的作用

FROM的作用是定义基础镜像(baseimage),表示当前容器是基于哪个基础镜像构建新的镜像。例如:Centos、Ubuntu等。定义的格式如下:

FROM 基础镜像名

注意:如果是制作基础镜像(base image)可以直接写 scratch 。一般我们都是在某个基础镜像上镜像制作新镜像。

如果只写镜像名,默认为最新版本,例如 FROM ubuntu 。也可以指定基础镜像版本号。例如:FROM ubuntu:20.04 或者 FROM centos:7

2. LABEL的作用

label的作用主要描述镜像的作者、版本号及简介信息等。

LABEL maintainer="作者的名称"
LABEL version="1.0"
LABEL description="简介"

3. RUN的作用

run的作用是打包镜像时运行系统命令。例如 apt-get update && apt-get install -y vim 等。一般都是给镜像安装一些软件包。由于是打包镜像时执行,所以run只会执行一次。

由于每一次run都会制作一个分成,因此建议大家把多个run命令合并为一个。如果安装的命令比较多,可以使用 \ 换行,具体表现如下:

RUN apt-get update && apt-get install -y vim && \
   rm -rf /var/lib/apt/lists/*

4. WORKDIR

workdir的作用是定义工作目录,它的实际作用类似于 cd 命令,但是如果workdir的目录不存在,会自动创建目录。例如下方案例:

WORKDIR /app
WORKDIR blog
RUN PWD

上面的命令打印结构为 /app/blog , 最后实际的工作目录为 /app/blog 目录。如果blog不存在,会自动创建blog目录

RUN命令执行cd操作也可进入某个目录,但是不推荐大家使用RUN来定义实际的工作目录

workdir尽量使用绝对路径不要使用相对路径,相对路径容易出错

5. CMD

cmd和run的作用都是执行命令和参数,但是cmd是容器启动时执行的命令和参数,并且定义了多个cmd时只有最后一个cmd才会执行此外,如果 docker run 运行容器时指定了其他执行的命令,cmd相关命令会直接忽略。cmd的格式和run一样,具体格式如下:

FROM ubuntu
RUN apt-get update && apt-get install -y vim && \
   rm -rf /var/lib/apt/lists/*
CMD echo 'hello' && bash /app/test.sh

上述dockerfile文件打包的镜像,如果使用【docker run 镜像名】命令运行容器时会执行一次CMD相关命令。但是如果使用【docker run -it 镜像名 /bin/bash】以交互方式运行容器时会忽略CMD的命令

6. ENTRYPOINT

entrypoint和上面的run以及cmd一样都是执行命令和参数,区别于entrypoint是让容器以应用程序或者服务的形式运行,并且entrypoint一定会执行不会被忽略。entrypoint一般用于启动容器中的某个应用程序。格式如下所示:

FROM ubuntu
ENTRYPOINT /app/start.sh

/app/start.sh:为某个应用启动的脚本。关于脚本可以使用下方的COPY或者ADD命令将本地的脚本复制到镜像中

ENTRYPOINT和CMD结合,可以实现将参数暴露到容器外。run运行容器时可以自定义参数传给要执行的命令。例如下方案例:

FROM ubuntu
ENTRYPOINT /app/start.sh
CMD []

上述dockerfile文件打包后的镜像,通过run运行时就可以自定义传参,比如传参a=11,在/app/start.sh脚本中就可以接受参数a进行特殊处理:

docker run 镜像名 --a=11

7. ADD 和 COPY

ADD和COPY的作用都是将本地的文件添加到docker镜像中。两者之间最大的区别就是:ADD除了copy功能之外还自带解压缩的功能。例如:ADD 一个压缩包到镜像中时,会自动解压缩到指定的目录中。具体格式如下:

ADD nginx.conf /usr/local/nginx/nginx.conf
ADD test.tar.gz /
COPY test.py /app/

注意add和copy指定的目录必须是 / 结尾。否则会把copy的文件的内容复制到指定的文件中,非 / 结尾的会把最后的文件夹的名称当成文件名

这两个命令还可以结合 WORKDIR 使用。这样可以节省根目录的定义。具体格式如下:

WORKDIR /app
ADD test.py test/

结合workdir后,最终test.py实际目录为:/app/test/test.py

8. ENV定义常量

env的作用是定义常量,其他命令可以通过 ${} 的形式使用常量。这样可以增加dockerfile的可维护性

ENV MYSQL_VERSION 5.6
RUN apt-get update && apt-get install -y vim && \
   rm -rf /var/lib/apt/lists/* && apt-get install -y mysql-server="${MYSQL_VERSION}"

9. EXPOSE 标记容器监听的端口

EXPOSE指令用于向Docker守护进程声明容器运行时需要监听的网络端口。它并不会自动将这些端口映射到主机上的任何端口,而是只是向用户以及后续的Dockerfile指令传达这个信息。这个指令可以帮助其他开发人员或者管理员清楚地知道应用程序在容器内部所侦听的端口号,从而更好地配置和管理容器,使其更加高效。通常情况下,可以将使用EXPOSE指令来记录应用程序的端口,将应用程序端口映射到主机端口的工作放在Docker run命令或Docker Compose文件中进行。

EXPOSE 5000

10. 数据持久化

10.1 volume方式数据持久化

在dockerfile中定义数据持久化目录,可以实现数据持久化

VOLUME 数据持久化目录

数据持久化目录是指本地宿主机的本地目录

10.2 bind mounting方式持久化

上面的方式虽然简单,但是需要在dockerfile中设置数据持久化目录。而bind mounting方式不需要,直接启动运行容器时设置共享目录或者说数据同步目录即可

docker run -d -v 本地目录:docker容器的目录

有遗漏或者不对的可以在我的公众号留言哦

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1