zoukankan      html  css  js  c++  java
  • 6.9 docker(一) Dockerfile 指令详解

    Dockerfile 指令详解 

    COPY 复制文件

    格式:

    • COPY [--chown=<user>:<group>] <源路径>... <目标路径>
    • COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
    • 一种类似于命令行,一种类似于函数调用

    <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

    COPY package.json /usr/src/app/

    <源路径> 可以是多个,甚至可以是通配符
    COPY hom* /mydir/
    COPY hom?.txt /mydir/


    使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关文件都在使用 Git 进行管理的时候。

    在使用该指令的时候还可以加上 --chown=<user>:<group> 选项来改变文件的所属用户及所属组。

    COPY --chown=55:mygroup files* /mydir/
    COPY --chown=bin files* /mydir/
    COPY --chown=1 files* /mydir/
    COPY --chown=10:11 files* /mydir/

    <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzipbzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。
    FROM scratch
    ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /

    --chown=<user>:<group> 选项来改变文件的所属用户及所属组。

    ADD --chown=55:mygroup files* /mydir/
    ADD --chown=bin files* /mydir/
    ADD --chown=1 files* /mydir/
    ADD --chown=10:11 files* /mydir/



    CMD 指令的格式和 RUN 相似,也是两种格式:

    • shell 格式:CMD <命令>
    • exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
    • 在运行时可以指定新的命令来替代镜像设置中的这个默认命令,比如,ubuntu 镜像默认的 CMD 是 /bin/bash,如果我们直接 docker run -it ubuntu 的话,会直接进入 bash。我们也可以在运行时指定运行别的命令,如 docker run -it ubuntu cat /etc/os-release。这就是用 cat /etc/os-release 命令替换了默认的 /bin/bash 命令了,输出了系统版本信息。
    • 一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 ",而不要使用单引号。

      如果使用 shell 格式的话,实际的命令会被包装为 sh -c 的参数的形式进行执行。比如:

      CMD echo $HOME
      

      在实际执行中,会将其变更为:

      CMD [ "sh", "-c", "echo $HOME" ]
    • 一些初学者将 CMD 写为:

      CMD service nginx start
      

      然后发现容器执行后就立即退出了。甚至在容器内去使用 systemctl 命令结果却发现根本执行不了。这就是因为没有搞明白前台、后台的概念,没有区分容器和虚拟机的差异,依旧在以传统虚拟机的角度去理解容器。

    使用 service nginx start 命令,则是希望 upstart 来以后台守护进程形式启动 nginx 服务。而刚才说了 CMD service nginx start 会被理解为 CMD [ "sh", "-c", "service nginx start"],因此主进程实际上是 sh。那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会令容器退出。

    正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行。比如:

    CMD ["nginx", "-g", "daemon off;"]





















     
  • 相关阅读:
    Java SSL证书的安装
    zookeeper集群配置
    ERROR org.apache.zookeeper.ClientCnxn:532
    线程池c3p0和dbcp2的配置初始化实例
    SIP/2.0 403 Forbidden(Invalid domain in From: header)
    OkHttp实现文件上传进度
    Http 缓存机制
    Cookie、Session 和 Token区别
    RecyclerView-- 侧滑删除和拖动排序
    RecyclerView--添加头部和底部
  • 原文地址:https://www.cnblogs.com/guogle/p/10995022.html
Copyright © 2011-2022 走看看