🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
--- **FROM 指定基础镜像** ``` FROM <镜像>:[tag] FROM <镜像>@digest[校验码] ``` **MAINTAINER 提供Dockerfile 制作者提供本人信息** ``` MAINTANIER "maXcon <409985270@qq.com>" ``` **COPY 把宿主机中的文件复制到镜像中去** - src 原文件 - 支持通配符 - 通常相对路径 - dest 目标路径 - 通常绝对路径 有空白字符隔开的字串需要用"",否则会被当做两个文件 > 文件复制准则: > 1 src必须是build上下文中的路径,不能是其父目录 > 2 如果src是目录,则其内部文件或子目录会被递归复制但src目录自身不会被复制 > 3 如果指定了多个src,或在src中使用了通配符,则dest必须是一个目录,且必须以/结尾 > 4 如果dest实现不存在,它将会被自动创建,这包括其父目录 **ADD 类似COPY命令** 支持URL路径----如果可以访问网络的话,会访问网络下载到本地然后打包进镜像 > 操作准则: 1 如果src为URL且dest不以/结尾,则src指定的文件将被下载并 直接被创建为dest;如果dest以/结尾,则文件名URL指定的文件 将被直接下载并保存为dest/filename 2 如果是压缩包会被解压,但通过URL路径获取到的tar文件不会被展开 3 如果src有多个,或其间接或直接使用了通配符,则dest必须是一个 以/结尾的目录路径,如果dest不以/结尾,则其被视为一个普通文件 src的内容将被直接写入到dest中 **WORKDIR 指定工作目录** > 每次只会影响这个指令后续的指令 ``` ADD nginx-1.14.2.tar.gz /usr/local/src/ #不受影响 WORKDIR /usr/local/src/ ADD nginx-1.14.2.tar.gz ./ #受影响 ``` **VOLUME 卷** 只能定义docker管理的卷: ``` VOLUME /data/mysql ``` 运行的时候会随机在宿主机的目录下生成一个卷目录 **EXPOSE 为容器打开指定要监听的端口以实现与外部通信** 使用格式: ``` EXPOSE 80/tcp 23/udp ``` 不加协议默认为tcp 使用-P选项可以暴露这里指定的端口, 但是宿主的关联至这个端口的端口是随机的 **ENV** 用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于 其后的其它命令所调用 调用格式: `$A` 或 `${A}` ``` ENV <key> <value> ENV <key>=<value> ``` 第一种格式中,`key`之后的所有内容均会被其视作`<value>`的组成部分 因此,一次只能设置一个变量 第二种格式可用一次设置多个变量,每个变量为一个`<key>=<value>` 的键值对,如果`<value>`中包含空格,可以反斜线(\)进行转义 也可以通过对`<value>`加引号进行标识。另外,反斜线也可用于续航 定义多个变量时。建议使用第二种方式,以便在同一层中完成所有功能 具体用法: ``` 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/ ENV A /web/html COPY index.html ${A:-/web/html} ``` 在docker run 中传递变量: `docker run -e [list] `传变量值 如果在dockerfile中赋值变量后也能在docker run中继续赋值 `docker run --name b1 --rm -e A=xx [镜像ID]` 不会影响docker build 的过程 `printenv`输出环境变量信息 **RUN命令** 使用格式: `RUN <command>` ``` RUN ["<executable>","<param1>","<param2>"] ``` 第一种格式中`<command>`命令通常是一个shell命令,且以`/bin/sh -c`来运行它 这意味此进程在容器中的PID不能为1,不能接收Unix信号,因此,当使用docker stop命令 来停止容器时,此进程接收不到信号 第二种语法格式中的参数是一个JSON格式的数组,其中`<executable>`为要运行的命令,后面的 `<paramN>`为传递给命令的选项或参数,然而,此种格式指定的命令不会以`/bin/sh -c`来运行它 因此常见的shell操作如变量替换以及通配符替换将不会进行 不过如果要运行的命令依赖于 此shell特性的话,可以将其替换为下面的格式: ``` RUN ["/bin/bash","-c","<executable>","<param1>"] ``` **CMD 运行于docker run中** 语法有三种写法, 只能是双引号 1. `CMD ["executable","param1","param2"]`启动为ID为1的进程,具体实例: ``` CMD ["/bin/sh","-c","/bin/httpd","-f","-h /web/html"] ``` 2. `CMD ["param1","param2"]` ``` CMD ["param1","param2"] # 此种用法用于为ENTRYPOINT指令提供默认参数 CMD ["nginx"] ``` 3. `CMD command param1 param2` 直接运行为shell的子进程,param*=执行参数 ``` docker run -it -p 8888:80 172.20.23.31/server1/nginx-base:v1 nginx ``` 可用于执行脚本\添加脚本: ``` ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh RUN chmod +x /apps/tomcat/bin/run_tomcat.sh RUN chown -R tomcat:tomcat /apps /data/tomcat CMD ["/apps/tomcat/bin/run_tomcat.sh"] #引用脚本 ```