Dockerfile参数简介

Dockerfile参数简介:https://docs.docker.com/engine/reference/builder/

指令                     含义解释

FROM :              FROM debian:stretch表示以debian:stretch作为基础镜像进行构建

MAINTAINER:   维护者信息
RUN :                可以看出RUN后面跟的其实就是一些shell命令,通过&&将这些脚本连接在了一行执行,这么做的原因是为了减少镜像的层数,每多一行RUN都会给镜像增加一层,所以这里选择将所有命令联结在一起执行以减少层数
ARG :                特地将这个指令放在RUN之后讲解,这个指令可以进行一些宏定义,比如我定义ENV JAVA_HOME=/opt/jdk,之后RUN后面的shell命令中的${JAVA_HOME}都会被/opt/jdk代替
ENV :                 可以看出这个指令的作用是在shell中设置一些环境变量(其实就是export)
FROM…AS…:  这是Docker 17.05及以上版本新出来的指令,其实就是给这个阶段的镜像起个别名:FROM ...(基础镜像) AS ...(别名),在后面引用这个阶段的镜像时直接使用别名就可以了

COPY:              顾名思义,就是用来来回复制文件的,COPY . /root/workspace/agent表示将当前文件夹(.表示当前文件夹,即Dockerfile所在文件夹)的所以文件拷贝到容器的/root/workspace/agent文件夹中。通过--from参数也可以从前面阶段的镜像中拷贝文件过来,比                               如--from=builder表示文件来源不是本地文件系统,而是之前的别名为builder的容器

WORKDIR:       在执行RUN后面的shell命令前会先cdWORKDIR后面的目录

ENTRYPOINT:  这个参数表示镜像的“入口”,镜像打包完成之后,使用docker run命令运行这个镜像时,其实就是执行这个ENTRYPOINT后面的可执行文件(一般是一个shell脚本文件),也可以通过["可执行文件", "参数1", "参数2"]这种方式来赋予可执行文件的执行参数,                               这个“入口”执行的工作目录也是WORKDIR后面的那个目录

各命令详解

FROM

指定哪种镜像作为新镜像的基础镜像,如:

FROM ubuntu:14.04

MAINTAINER

指明该镜像的作者和其电子邮件,如:

MAINTAINER vector4wang "[email protected]"

RUN

在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境,可使用\来换行,如:

RUN echo ‘hello docker!‘     > /usr/local/file.txt

也可以使用exec格式RUN ["executable", "param1", "param2"]的命令,如:

RUN ["apt-get","install","-y","nginx"]

要注意的是,executable是命令,后面的param是参数

COPY

将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:

COPY application.yml /etc/springboot/hello-service/src/resources

注意:需要复制的目录一定要放在Dockerfile文件的同级目录下
原因:

因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。
---《THE DOCKER BOOK》

ADD

将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样,如:

ADD application.yml /etc/springboot/hello-service/src/resources

但是ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。

EXPOSE

暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):

EXPOSE 8080
EXPOSE 8081
...

WORKDIR

在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如

WORKDIR /usr/local
WORKDIR webservice
RUN echo ‘hello docker‘ > text.txt
...

最终会在/usr/local/webservice/目录下生成text.txt文件

ONBUILD

当一个包含ONBUILD命令的镜像被用作其他镜像的基础镜像时(比如用户的镜像需要从某为准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该命令就会执行。
如创建镜像image-A

FROM ubuntu
...
ONBUILD ADD . /var/www
...

然后创建镜像image-B,指定image-A为基础镜像,如

FROM image-A
...

然后在构建image-B的时候,日志上显示如下:

Step 0 : FROM image-A
# Execting 1 build triggers
Step onbuild-0 : ADD . /var/www
...

USER

指定该镜像以什么样的用户去执行,如:

USER mongo

VOLUME

用来向基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据)
如:

VOLUME /data/db /data/configdb

注意:VOLUME 主机目录 容器目录

CMD

容器启动时需要执行的命令,如:

CMD /bin/bash

同样可以使用exec语法,如

CMD ["/bin/bash"]

当有多个CMD的时候,只有最后一个生效。

ENTRYPOINT

作用和用法和CMD一模一样

CMD和ENTRYPOINT的区别

敲黑板!!!非常重要
一定要注意!

一定要注意!

一定要注意!
CMD和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点:

  • CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会

如使用CMD ["/bin/bash"]ENTRYPOINT ["/bin/bash"]后,再使用docker run -ti image启动容器,它会自动进入容器内部的交互终端,如同使用
docker run -ti image /bin/bash

但是如果启动镜像的命令为docker run -ti image /bin/ps,使用CMD后面的命令就会被覆盖转而执行bin/ps命令,而ENTRYPOINT的则不会,而是会把docker run 后面的命令当做ENTRYPOINT执行命令的参数
以下例子比较容易理解
Dockerfile中为

...
ENTRYPOINT ["/user/sbin/nginx"]

然后通过启动build之后的容器

docker run -ti image -g "daemon off"

此时-g "daemon off"会被当成参数传递给ENTRYPOINT,最终的命令变成了

/user/sbin/nginx -g "daemon off"
  • CMD和ENTRYPOINT都存在时

CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖,如:

...
ENTRYPOINT ["echo","hello","i am"]
CMD ["docker"]

之后启动构建之后的容器

  • 使用docker run -ti image

    输出“hello i am docker”

  • 使用docker run -ti image world

    输出“hello i am world”

指令比较多,可以通过分类(如开头的表格)的办法去记忆

示例

自己写了个简单的示例,非常简单

FROM ubuntu
MAINTAINER vector4wang [email protected]

WORKDIR /usr/local/docker
ADD temp.zip ./add/
COPY temp.zip ./copy/
EXPOSE 22
RUN groupadd -r vector4wang && useradd -r -g vector4wang vector4wang
USER vector4wang

ENTRYPOINT ["/bin/bash"]

下面是运行过程

1.png

2.png

(动态图太大了上传不了)

注意 登录之后的用户名和ADD、COPY进去的文件

后记

以上只是自己通过看书写demo和浏览其他人的博文所总结出来的,之后在实战的过程中会把遇到的一些实际问题追加进来。

链接:https://www.jianshu.com/p/10ed530766af

 

原文地址:https://www.cnblogs.com/ling-yu-amen/p/10955361.html

时间: 2024-11-08 20:44:07

Dockerfile参数简介的相关文章

Linux 内核引导参数简介

概述 内核引导参数大体上可以分为两类:一类与设备无关.另一类与设备有关.与设备有关的引导参数多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导参数.比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导参数,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导参数说明.大多数参数是通过"__setup(... , ...)"函数设置的,少部分是通过"early_param(..

mqtt------ mosca服务器端参数简介

一:服务器端 为什么使用mosca:mosca是基于node.js开发,上手难度相对较小,其次协议支持完整,除了不支持Qos 2,其它的基本都支持.持久化支持redis以及mongo.二次开发接口简单.部署非常简单,并且支持docker镜像. mosca参数简介: var mosca = require('mosca') ascoltatore :  是Mosca作者开发的一个订阅与发布类库,Mosca核心的订阅与发布模型 var ascoltatore = { type: 'redis', /

DockerFile 参数详解

Docker 指令: From --- ENV ---设置环境变量ENV App_DIR /appp Add 和 Copy 可以复制文件到容器里面 1.区别 Add 可以写网络的链接地址 Add 支持解压功能 Run 指令: ENTRYPOINT : 只有最后一条生效 docker build -t register_ip/centos7 . 帮助 docker help run -p 与 -P 区别: -P 随便取一个端口号映射 #重要作用 当前镜像不生效 #当被当成镜像重新设定时生效 OnB

docker Dockerfile 参数讲解

maintainer 这个参数已经弃用了 官方推荐 LABEL 作为信息标注 ADD 命令 ADD有2个参数,源和目标.它的基本作用是从源系统的文件系统上复制文件到目标容器的的文件系统.如果源是1个URL,那该URL的内容将被下载并复制到容器中. 如 ADD run.sh / CMD 命令 和RUN命令相似,CMD可以用于执行特定的命令.和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像启动容器后被调用. 如 CMD "command" "arg1"

2.airflow参数简介

比较重要的参数: 参数 默认值 说明 airflow_home /home/airflow/airflow01 airflow home,由环境变量$AIRFLOW_HOME决定 dags_folder /home/airflow/airflow01/dags dag python文件目录 base_log_folder /home/airflow/airflow01/logs 主日志目录 executor SequentialExecutor, LocalExecutor, CeleryExe

VM参数简介

block_dump Linux 内核里提供了一个 block_dump 参数用来把 block 读写(WRITE/READ)状况转存(dump)到日志里,这样可以通过 dmesg 命令来查看. 该参数表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作. 缺省设置:0,表示禁用Block Debug 将这个值设置为非零值,则在dmesg里记录各进程的block IO状况 dirty_background_bytes 当脏页所占的内存数量超过dirty_ba

HOG参数简介及Hog特征维数的计算(转)

HOG构造函数 CV_WRAP HOGDescriptor() :winSize(64,128), blockSize(16,16), blockStride(8,8),      cellSize(8,8),nbins(9), derivAperture(1), winSigma(-1), histogramNormType(HOGDescriptor::L2Hys),L2HysThreshold(0.2), gammaCorrection(true), nlevels(HOGDescript

jqGrid中prmNames,jsonReader,colModel的参数简介

1,prmNames 前端向服务端发送的参数 jsonReader : {       root: "rows",   // json中代表实际模型数据的入口        page: "page",   // json中代表当前页码的数据        total: "total", // json中代表页码总数的数据        records: "records", // json中代表数据行总数的数据        

【JS】 arguments参数简介

在读singalR.js源码时发现了它里面的一个format方法:   format: function () {             /// <summary>Usage: format("Hi {0}, you are {1}!", "Foo", 100) </summary>             var s = arguments[0];             for (var i = 0; i < arguments.