Docker入门(四)—Dockerfile指令详解


title: Docker入门(四)—Dockerfile指令详解
tags: Docker


Dockerfile指令

        我们已经看过了一些 Dockerfile中可用的指令,如RUN和 EXPOSE。但是,实际上还可以在 Dockerfile中放入很多其他指令,这些指令包括CMD、 ENTRYPOINT、ADD、COPY、 VOLUME、 WORKDIR、USER、 ONBUILD、 LABEL、 STOPSIGNAL、ARG和ENV等。可以在http://docsdocker.com/reference/builder查看Dockerfile中可以使用的全部指令的清单

1.FROM

        FROM指令用于导入镜像,第一条指令必须是FROM,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。

#从头制作baseImage
`FROM scratch`
#使用已有的baseImage
`FROM centos`
#指定使用的版本
`FROM ubuntu:14.04`

2.LABEL

        LABEL指令用于为Docker定义一些说明信息。

`LABEL maintainer=731227039@qq.com`
`LABEL version=”1.0”`
`LABEL description=”xxx”`

3.RUN

    RUN用于执行命令,每执行一条RUN,多一个分层,一般用&&合并语句,反斜杠换行。

RUN yum -y update && yum -y install lrzsz \net-tools
RUN apt-get -y update && apt-get -y install lrzsz\net-tools
RUN /bin/bash -c ‘source $HOME/.bashrc;echo $HOME’

4.ENV

        ENV指令用来在镜像构建过程中设置环境变量。

#设置常量
`ENV MYSQL_MAJOR 5.5`
#使用常量
`$MYSQL_MAJOR`
`RUN apt-get -y install mysql-server=”${MYSQL_VERSION}”`

注意:如果需要,可以通过在环境变量前加上一个反斜线来进行转义。

5.CMD

        CMD指令用于指定一个容器启动时要运行的命令。这有点儿类似于RUN指令,只是RUN指令是指定镜像被构建时要运行的命令,而CMD是指定容器被启动时要运行的命令。这和使用 docker run命令启动容器时指定要运行的命令非常类似,比如:
docker run ubuntu:latest /bin/echo hello docker
使用CMD
CMD [“/bin/echo”,”hello docker”] 它和上面的命令是等效的.

注意:最后,还需牢记,使用 docker run命令可以覆盖CMD指令。如果我们在 Dockerfile里指定了CMD指令,而同时在 docker run命令行中也指定了要运行的命令,命令行中指定的命令会覆盖 Dockerfi1e中的CMD指令。

6.ENTRYPOINT

        ENTRYPOINT指令与CMD指令非常类似,也很容易和CMD指令弄混。这两个指令到底有什么区别呢?为什么要同时保留这两条指令?正如我上面提醒的那样,docker run命令行会覆盖CMD指令。而ENTRYPOINT指令提供的命令则不容易在启动容器时被覆盖。实际上, docker run命令行中指定的任何参数都会被当做参数再次传递ENTRYPOINT指令中指定的命令。
    让我们来看一个 ENTRYPOINT指令的例子:

ENTRYPOINT ["/bin/echo","hello docker"]

7.WORKDIR:

        WORKDIR指令用来在从镜像创建一个新容器时,在容器内部设置一个工作目录ENTRYPOINT和或CMD指定的程序会在这个目录下执行。
        我们可以使用该指令为 Dockerfile中后续的一系列指令设置工作目录,也可以为最终的容器设置工作目录。

进入或创建目录,尽量不要使用相对路径

#进入/root目录
WORKDIR /root
#如果没有会自动创建
WORKDIR /test
WORKDIR demo
#输出:/test/demo
RUN pwd

8.ADD

        ADD指令用来将构建环境下的文件和目录复制到镜像中。比如,在安装一个应用程序时。ADD指令需要源文件位置和目的文件位置两个参数。

ADD software.lic /opt/application/software.lic

        这里的ADD指令将会将构建目录下的 software.lic文件复制到镜像中的/optapplication/ software.lic。指向源文件的位置参数可以是一个URL,或者构建上下文或环境中文件名或者目录。

注意: 不能对构建目录或者上下文之外的文件进行ADD操作。
ADD 是通过/ 来判断是文件还是目录 ,如果指向的目录那么是以/结尾 ,否则就是指向文件。

9.COPY

    COPY指令非常类似于ADD,它们根本的不同是COPY只关心在构建上下文中复制本地文件,而不会去做文件提取( extraction)和解压( decompression)的工作。
COPY conf.d/ /etc/apache2/

        这条指令将会把本地conf.d目录中的文件复制到/etc/ apache2/目录中。文件源路径必须是一个与当前构建环境相对的文件或者目录,本地文件都放到和Dockerfile同一个目录下。COPY指令的目的位置则必须是容器内部的一个绝对路径。
        任何由该指令创建的文件或者目录的UID和GID都会设置为0。
        如果源路径是一个目录,那么这个目录将整个被复制到容器中。
        如果目的位置不存在, Docker将会自动创建所有需要的目录结构,就像 mkdir-p命令那样。

10. EXPOSE

告诉 Docker服务端容器暴露的端口号,供互联系统使用。
EXPOSE 8080

11. VOLUME

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的
数据等。

VOLUME ["/data"]

12.USER

        USER指令用来指定该镜像会以什么样的用户去运行。
USER nginx
        基于该镜像启动的容器会以 nginx用户的身份来运行。我们可以指定用户名或UID以
及组或GID,甚至是两者的组合:
USER user
USER user:group
USER user:uid

13.STOPSIGNAL

        STOPSIGNAL指令用来设置停止容器时发送什么系统调用信号给容器。这个信号必须是内核系统调用表中合法的数,如9,或者 SIGNAME格式中的信号名称,如 SIGKILL。

14.ARG

        ARG指令用来定义可以在 docker build命令运行时传递给构建运行时的变量,我们只需要在构建时使用-- build-arg标志即可。用户只能在构建时指定在Dockerfile文件中定义过的参数。

ARG build
ARG webapp user=user
        上面例子中第二条ARG指令设置了一个默认值,如果构建时没有为该参数指定值,就会使用这个默认值。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值