建筑兼职网站,天津网站优化公司哪家好,公司网站建设 阜阳,网站建设广告一、编译镜像 前些天发现了一个巨牛的人工智能学习网站#xff0c;通俗易懂#xff0c;风趣幽默#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 编译镜像 Dockerfile类似于Makfile#xff0c;用户使用docker build就可以编译镜像#xff0c;使用该命令可以设置编译…一、编译镜像 前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到教程。 1. 编译镜像 Dockerfile类似于Makfile用户使用docker build就可以编译镜像使用该命令可以设置编译镜像时使用的CPU数量、内存大小、文件路径等 语法docker build [OPTIONS] PATH| URL| - 常见选项 -t 设置镜像的名称和TAG格式为name:tag -f Dockerfile的名称默认为PATH/Dockerfile 例子docker build -f ~/php.Dockerfile . 注意PATH是编译镜像使用的工作目录Docker Daemon在编译开始时会扫描PATH中的所有文件可以在编译目录中加入.dockerignore过滤不需要的文件 Docker Daemon从Dockerfile中顺序读取指令生成一个临时容器在容器中执行指令容器编译成功后会提交作为镜像层加入最终镜像为了加快编译过程Docker Daemon采用了缓存机制如果在缓存中找到了需要的中间镜像则直接使用该镜像而不生成临时容器编译时可以使用选项–no-cache选择不使用缓存
2. dockerignore文件 编译开始前Docker Daemon会读取编译目录中的.dockerignore文件忽略其中的文件和目录在其中可以使用通配符?代表一个字符*代表零个或任意个字符使用通配符时总会出现那么几个例外这时可以使用!文件名Docker Daemon会读取!后面的文件
*/temp* 忽略PATH路径下一级子目录中以temp开头的文件和目录如PAHT/A/temp.txt
*/*/temp* 忽略PATH路径下二级子目录中以temp开头的文件和目录如PATH/A/B/temp.txt
*.md
!README.md 忽略所有md文件除了README.md
二、Dockerfile指令详解 Dockerfile由多条指令组成每条指令在编译镜像时执行相应的程序完成某些功能由指令参数组成以逗号分隔#作为注释起始符虽说指令不区分大小写但是一般指令使用大些参数使用小写 指令FROM 功能描述设置基础镜像 语法FROM image[: tag | digest] 提示镜像都是从一个基础镜像操作系统或其他镜像生成可以在一个Dockerfile中添加多条FROM指令一次生成多个镜像 注意如果忽略tag选项会使用latest镜像 指令MAINTAINER 功能描述设置镜像作者 语法MAINTAINER name 指令RUN 功能描述 语法RUN command RUN [“executable”,”param1”,”param2”] 提示RUN指令会生成容器在容器中执行脚本容器使用当前镜像脚本指令完成后Docker Daemon会将该容器提交为一个中间镜像供后面的指令使用 补充RUN指令第一种方式为shell方式使用/bin/sh -c command运行脚本可以在其中使用\将脚本分为多行 RUN指令第二种方式为exec方式镜像中没有/bin/sh或者要使用其他shell时使用该方式其不会调用shell命令 例子RUN source $HOME/.bashrc;\ echo $HOME RUN [“/bin/bash”,”-c”,”echo hello”] RUN [“sh”,”-c”,”echo”,”$HOME”] 使用第二种方式调用shell读取环境变量 指令CMD 功能描述设置容器的启动命令 语法CMD [“executable”,”param1”,”param2”] CMD [“param1”,”param2”] CMD command 提示CMD第一种、第三种方式和RUN类似第二种方式为ENTRYPOINT参数方式为entrypoint提供参数列表 注意Dockerfile中只能有一条CMD命令如果写了多条则最后一条生效 指令LABEL 功能描述设置镜像的标签 延伸镜像标签可以通过docker inspect查看 格式LABEL key value key value … 提示不同标签之间通过空格隔开 注意每条指令都会生成一个镜像层Docker中镜像最多只能有127层如果超出Docker Daemon就会报错如LABEL .... 假装这里有个换行 LABEL ....合在一起用空格分隔就可以减少镜像层数量同样可以使用连接符\将脚本分为多行 镜像会继承基础镜像中的标签如果存在同名标签则会覆盖 指令EXPOSE 功能描述设置镜像暴露端口记录容器启动时监听哪些端口 语法EXPOSE port port … 延伸镜像暴露端口可以通过docker inspect查看 提示容器启动时Docker Daemon会扫描镜像中暴露的端口如果加入-P参数Docker Daemon会把镜像中所有暴露端口导出并为每个暴露端口分配一个随机的主机端口暴露端口是容器监听端口主机端口为外部访问容器的端口 注意EXPOSE只设置暴露端口并不导出端口只有启动容器时使用-P/-p才导出端口这个时候才能通过外部访问容器提供的服务 指令ENV 功能描述设置镜像中的环境变量 语法ENV key value…| key value 注意环境变量在整个编译周期都有效第一种方式可设置多个环境变量第二种方式只设置一个环境变量 提示通过${变量名}或者 $变量名使用变量使用方式${变量名}时可以用${变量名:-default} ${变量名:cover}设定默认值或者覆盖值 ENV设置的变量值在整个编译过程中总是保持不变的 指令ADD 功能描述复制文件到镜像中 语法ADD src… dest|[“ src”,… “ dest”] 注意当路径中有空格时需要使用第二种方式 当src为文件或目录时Docker Daemon会从编译目录寻找这些文件或目录而dest为镜像中的绝对路径或者相对于WORKDIR的路径 提示src为目录时复制目录中所有内容包括文件系统的元数据但不包括目录本身 src为压缩文件并且压缩方式为gzip,bzip2或xz时指令会将其解压为目录 如果src为文件则复制文件和元数据 如果dest不存在指令会自动创建dest和缺失的上级目录 指令COPY 功能描述复制文件到镜像中 语法COPY src… dest|[“ src”,… “ dest”] 提示指令逻辑和ADD十分相似同样Docker Daemon会从编译目录寻找文件或目录dest为镜像中的绝对路径或者相对于WORKDIR的路径 指令ENTRYPOINT 功能描述设置容器的入口程序 语法ENTRYPOINT [“executable”,”param1”,”param2”] ENTRYPOINT command param1 param2shell方式 提示入口程序是容器启动时执行的程序docker run中最后的命令将作为参数传递给入口程序 入口程序有两种格式exec、shell其中shell使用/bin/sh -c运行入口程序此时入口程序不能接收信号量 当Dockerfile有多条ENTRYPOINT时只有最后的ENTRYPOINT指令生效 如果使用脚本作为入口程序需要保证脚本的最后一个程序能够接收信号量可以在脚本最后使用exec或gosu启动传入脚本的命令 注意通过shell方式启动入口程序时会忽略CMD指令和docker run中的参数 为了保证容器能够接受docker stop发送的信号量需要通过exec启动程序如果没有加入exec命令则在启动容器时容器会出现两个进程并且使用docker stop命令容器无法正常退出无法接受SIGTERM信号超时后docker stop发送SIGKILL强制停止容器 例子FROM ubuntu 换行 ENTRYPOINT exec top -b 指令VOLUME 功能描述设置容器的挂载点 语法VOLUME [“/data”] VOLUME /data1 /data2 提示启动容器时Docker Daemon会新建挂载点并用镜像中的数据初始化挂载点可以将主机目录或数据卷容器挂载到这些挂载点 指令USER 功能描述设置RUN CMD ENTRYPOINT的用户名或UID 语法USER name 指令WORKDIR 功能描述设置RUN CMD ENTRYPOINT ADD COPY指令的工作目录 语法WORKDIR Path 提示如果工作目录不存在则Docker Daemon会自动创建 Dockerfile中多个地方都可以调用WORKDIR如果后面跟的是相对位置则会跟在上条WORKDIR指定路径后如WORKDIR /A WORKDIR B WORKDIR C最终路径为/A/B/C 指令ARG 功能描述设置编译变量 语法ARG name[ defaultValue] 注意ARG从定义它的地方开始生效而不是调用的地方在ARG之前调用编译变量总为空在编译镜像时可以通过docker build –build-arg var value设置变量如果var没有通过ARG定义则Daemon会报错 可以使用ENV或ARG设置RUN使用的变量如果同名则ENV定义的值会覆盖ARG定义的值与ENV不同ARG的变量值在编译过程中是可变的会对比使用编译缓存造成影响ARG值不同则编译过程也不同 例子ARG CONT_IMAG_VER 换行 RUN echo $CONT_IMG_VER ARG CONT_IMAG_VER 换行 RUN echo hello 当编译时给ARG变量赋值hello则两个Dockerfile可以使用相同的中间镜像如果不为hello则不能使用同一个中间镜像 指令ONBUILD 功能描述设置自径想的编译钩子指令 语法ONBUILD [INSTRUCTION] 提示从该镜像生成子镜像在子镜像的编译过程中首先会执行父镜像中的ONBUILD指令所有编译指令都可以成为钩子指令 指令STOPSIGNAL 功能描述设置容器退出时Docker Daemon向容器发送的信号量 语法STOPSIGNAL signal 提示信号量可以是数字或者信号量的名字如9或者SIGKILL信号量的数字说明在Linux系统管理中有简单介绍 补充ONBUILD流程
编译时读取所有ONBUILD镜像并记录下来在当前编译过程中不执行指令生成镜像时将所有ONBUILD指令记录在镜像的配置文件OnBuild关键字中子镜像在执行FROM指令时会读取基础镜像中的ONBUILD指令并顺序执行如果执行过程中失败则编译中断当所有ONBUILD执行成功后开始执行子镜像中的指令子镜像不会继承基础镜像中的ONBUILD指令补充CMD ENTRYPOINT和RUN的区别 RUN指令是设置编译镜像时执行的脚本和程序镜像编译完成后RUN指令的生命周期结束 容器启动时可以通过CMD和ENTRYPOINT设置启动项其中CMD叫做容器默认启动命令如果在docker run命令末尾添加command则会替换镜像中CMD设置的启动程序ENRTYPOINT叫做入口程序不能被docker run命令末尾的command替换而是将command当作字符串传递给ENTRYPOINT作为参数
FROM ubuntu
ENTRYPOINT [ps]//通过命令docker run --rm test启动容器打印ps的输出
//通过命令docker run --rm test -ef启动容器打印ps -ef的输出 在docker run中可以通过–entrypoint替换镜像中的入口程序在Dockerfile中应该至少有一条CMD或者ENTRYPOINT指令如果同时定义了CMD和ENTRYPOINT则CMD会作为参数传递给ENTRYPOINT
FROM ubuntu
ENTRYPOINT [ps]
CMD [-ef]//通过命令docker run --rm test启动容器打印ps -ef的输出 转自https://blog.csdn.net/qq_29999343/article/details/78318397