Dockerfile文件中的指令介绍
1、CMD
CMD指令用来指定一个容器启动时要运行的命令
CMD和RUN指令的区别
CMD指令是指定镜像被构建时要运行的命令,而RUN是指定容器被启动时要运行的命令
注意事项
CMD指令在使用时很容易被覆盖,其常见的两种情况如下:
1.若使用docker run命令构建容器时,若在docker run命令中也指定了要运行的命令,则命令行中指定的命令会覆盖Dockerfile文件中的CMD指令
2.Dockerfile文件中只能指定一条CMD指令,若指定了多条CMD指令,也只有最后一条CMD指令会被使用。
2、ENTRYPOINT
docker run命令行中指定的任何参数都会被当做参数再次传递给ENTRYPOINT指令中的命令,且ENTRYPOINT指令运行应用程序有两种i形式,分别是shell格式和exec格式:
shell格式:ENTRYPOINT node app.js
exec格式:ENTRYPOINT [“node”, “app.js”]
shell格式和exec格式的区别
shell格式在容器中运行进程的,pid为1的进程是shell进程,即主进程是shell,而不是node;但是在exec格式中,主进程是node,因此常使用exec格式去运行进程,防止启动多余的shell进程
ENTRYPOINT和CMD的区别
ENTRYPOINT用来定义容器启动时被调用的可执行程序,而CMD通常用于给ENTRYPOINT指令传递参数
3、WORKDIR
WORKDIR指令用来在从镜像创建一个新容器时,在容器内部设置一个工作目录
如如下内容:
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT [ "rackup" ]
这里,我们将工作目录切换为/opt/webapp/db后运行了bundle install命令后,又将工作目录切换为/opt/webapp
4、ENV
ENV指令用来在镜像构建过程中设置环境变量。如
ENV RVM_PATH /home/rvm/
该行命令的作用是将/home/rvm/用RVM_PATH变量去表示,在后面的RUN指令中都可以使用该环境变量。
也可以在docker run命令时使用-e选项来传递环境变量,这些变量只在该容器运行时有效,即在docker run命令时使用-e选项设置环境变量。
5、USER
USER指令用来指定镜像会以什么样的用户去运行,如
USER user:group
指定基于该镜像启动的容器以group组中user的身份去运行,如果不指定则默认是root身份。
该命令可以在docker run命令时使用-u选项去指定,如果Dockerfile中有USER指令,且docker run时也适用了-u选项,则-u选项会覆盖Dockerfile文件中USER指令指定的值
6、VOLUME
VOLUME指令用来向基于镜像创建的容器添加卷。一个卷是可以存在于一个或者多个容器内的特定的目录,这个目录可以绕过联合文件系统,并提供如下共享数据或者对数据进行持久化的功能
1.卷可以在容器间共享和重用
2.一个容器可以不是必须和其他容器共享卷
3.对卷的修改是修改之后立马生效
4.对卷的修改不会对更新镜像产生影响
5.卷会一直存在直到没有任何容器再使用它
卷功能可以让我们将数据或者其他内容添加到镜像中,而不是提交到镜像中,并且允许我们在多个容器间共享这些内容。如
VOLUME ["/opt/project"]
该指令会为基于此镜像创建的任何容器创建一个名字为/opt/project的挂载点,即在基于该镜像创建的容器中新建一个名为/opt/project的文件夹,用于将宿主机的文件挂载到该目录
7、ADD
ADD指令用来将构建环境下的文件和目录复制到镜像中。如
ADD software.lic /opt/app/software.lic
该指令将宿主机中构建目录下的software.lic文件复制到容器中的/opt/app/software.lic。构建目录指的是Dockerfile文件所在的目录
注意事项
1.ADD指向的源文件可以是一个url,也可以是dockerfile文件所在目录下的文件或文件夹。不能对构建目录之外或者上下文之外的文件进行ADD操作
2.ADD对文件操作时,Docker会通过目的地址的参数是否是/来判断是文件还是文件夹,若目的地址以/结尾,则认为源位置指向的是文件夹。
3.若源文件是压缩文件(归档文件),则ADD会自动将其解压,若目的位置的目录中已经存在了和归档文件同名的文件或文件夹,则目的位置中的文件或文件夹不会被覆盖
4.ADD指定会使构建的缓存无效,如果通过ADD指令向镜像添加一个文件或文件夹,那么会使得Dockerfile文件中的后续指令都不能继续使用之前的构建缓存
8、COPY
COPY指令类似于ADD,COPY只关心在构建上下文中复制本地文件,而不会去做文件提取和解压的工作,如
COPY conf.d/ /etc/nginx/
该指令将本地的conf.d目录中的文件复制到/etc/nginx/目录中。
注意事项
1.文件源路径必须是一个与当前构建环境相对的文件或文件夹,即只能复制在当前构建目录下的文件或文件夹,因为构建环境会上传到Docker守护进程,而复制操作是在Docker守护进程中进行的,位于任何构建环境之外的东西都是不可用的。
2.COPY指令的目的位置必须是容器内部的一个绝对路径
3.任何由该指令创建的文件或文件夹的目录的UID和GID都会被设置为0
4.如果目的位置不存在,Docker将会自动创建所有需要的目录结构。
9、LABEL
LABEL指令用于为Docker镜像添加元数据。元数据以键值对的形式展现。如:
LABEL version="1.0"
LABEL location="New York" type="Data Center" role="Web Server"
10、STOPSIGNAL
STOPSIGNAL指令用来设置停止容器时发送什么系统调用信号给容器。这个信号必须是内核系统调用表中合法的数,如SIGKILL等
11、ARG
ARG指令用来定义可以在docker build命令运行时传递给构建运行时的变量,我们只需要在构建时使用–build-arg标志即可。只能在构建时使用在Dockerfile文件中定义过的参数,如
ARG build
ARG webapp=user
若在docker build中使用的命令如下:
docker build --build-arg build=1234 -t test .
则此时build的值为1234,webapp的值为user,若还指定了webapp的值,则webapp的值会被覆盖
docker中的默认ARG变量
1.HTTP_PROXY
2.http_proxy
3.HTTPS_PROXY
4.https_proxy
5.FTP_PROXY
6.ftp_proxy
7.NO_PROXY
8.no_proxy
12、ONBUILD
ONBUILD指令能为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像时,该镜像中的触发器将会被执行。即触发器会在构建过程中插入新指令,可以认为这些指令是紧跟在FROM之后执行的
注意事项
1.触发器会按照在父镜像中指定的顺序执行,并且只能被继承一次。有点类似于JAVA中的继承
2.ONBUILD中不能运行FROM、MAINTAINER和ONBUILD命令,这是为了防止在Dockerfile文件的构建过程中产生递归调用