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文件的构建过程中产生递归调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值