美文网首页
Dockerfile常用指令

Dockerfile常用指令

作者: 铁血男儿_a555 | 来源:发表于2020-07-05 13:07 被阅读0次

    3.1.FROM

    指明构建的新镜像是来自于哪个基础镜像,例如:

    FROM centos:6

    基础镜像不存在会在Docker Hub上拉去(一般会是文件的第一个指令) 使用格式:FROM <镜像>:[tag]

    3.2.MAINTAINER

    指明镜像维护着及其联系方式(一般是邮箱地址),例如

    MAINTAINER BRUCELIU<bruceliu9527@163.com>

    不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如:

    LABEL maintainer="bruceliu.cn"

    [逐渐废弃] LABLE --替代MAINTANIER 具体使用: LABLE maintainer="作者信息"

    3.3.RUN

    RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种: • shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式. • exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。使用格式:

    RUN RUN ["","",""]

    构建镜像时运行的Shell命令,例如:

    RUN ["yum", "install", "httpd"]

    RUN yum install httpd

    RUN 就像 Shell 脚本一样可以执行命令,那么我们是否就可以像 Shell 脚本一样把每个命令对应一个 RUN 呢?比如这样:

    RUN apt-get update

    RUN apt-get install -y gcc libc6-dev make

    RUN wget http://download.redis.io/releases/redis-4.0.1.tar.gz

    RUN tar xzf redis-4.0.1.tar.gz

    RUN cd redis-4.0.1

    Dockerfile 中每一个指令都会建立一层,RUN 也不例外。每一个 RUN 的行为,和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。 而上面的这种写法,创建了 多 层镜像。这是完全没有意义的,而且很多运行时不需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。 这是很多初学 Docker 的人常犯的一个错误。

    Union FS 是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过 127 层。上面的Dockerfile 正确的写法应该是这样

    FROM centos

    RUN apt-get update \

    && apt-get install -y gcc libc6-dev make \

    && wget http://download.redis.io/releases/redis-4.0.1.tar.gz \

    && tar xzf redis-4.0.1.tar.gz \

    && cd redis-4.0.1

    首先,之前所有的命令只有一个目的,就是编译、安装 redis 可执行文件。因此没有必要建立很多层,这只是一层的事情。因此,这里没有使用很多个 RUN 对一一对应不同的命令,而是仅仅使用一个 RUN 指令,并使用 && 将各个所需命令串联起来。将之前的 7 层,简化为了 1 层。

    在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写Shell 脚本,而是在定义每一层该如何构建且,这里为了格式化还进行了换行。Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。良好的格式,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯。

    3.4.CMD

    启动容器时执行的Shell命令,例如:

    CMD ["-C", "/start.sh"]

    CMD ["/usr/sbin/sshd", "-D"]

    CMD /usr/sbin/sshd -D

    3.5.EXPOSE

    声明容器运行的服务端口,为容器打开指定要监听的端口以实现与外部通信,例如:

    EXPOSE 80 443

    3.6.ENV

    ENV指令可以用于为docker容器设置环境变量 ENV设置的环境变量,可以使用 docker inspect命令来查看。同时还可以使用docker run --env =来修改环境变量。

    具体用法:

    ENV JAVA_HOME /usr/local/jdk

    ENV JRE_HOME $JAVA_HOME/jre

    ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/

    ENV PATH $PATH:$JAVA_HOME/bin/

    3.7.ADD

    类似COPY命令,拷贝文件或目录到镜像中,例如:

    ADD <src>...<dest>

    ADD html.tar.gz /var/www/html

    ADD https://xxx.com/html.tar.gz /var/www/html

    3.8.COPY

    拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:

    COPY ./start.sh /start.sh

    3.9.ENTRYPOINT

    启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序,例如:

    ENTRYPOINT ["/bin/bash", "-C", "/start.sh"]

    ENTRYPOINT /bin/bash -C '/start.sh'

    PS:Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效。

    3.10. VOLUME

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

    VOLUME ["/var/lib/mysql"]

    只能定义docker管理的卷: VOLUME /data/mysql运行的时候会随机在宿主机的目录下生成一个卷目录!一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。

    3.11 USER

    为RUN、CMD和ENTRYPOINT执行Shell命令指定运行用户,例如:

    USER <user>[:<usergroup>]

    USER <UID>[:<UID>]

    USER bruceliu

    3.12 WORKDIR

    Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个 RUN 都是独立进行的。

    如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次 WORKDIR。

    WORKDIR /usr/local/tomcat/

    相关文章

      网友评论

          本文标题:Dockerfile常用指令

          本文链接:https://www.haomeiwen.com/subject/ytkvqktx.html