zoukankan      html  css  js  c++  java
  • 常用dockerfile命令详解和常用打包-持续更新

    一、命令详解

    Dockerfile构建镜像是以基础镜像为基础的,Dockerfile是一个文本文件,内容是用户编写的一些docker指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
    Dockerfile的基本指令有十三个,分别是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD

    类型 命令
    基础镜像信息 FROM
    维护者信息 MAINTAINER
    镜像操作指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
    容器启动时执行指令 CMD、ENTRYPOINT

    1.1、FROM :指定基础镜像

    所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个nginx镜像的容器,再进行修改一样,基础镜像是必须指定的。而FROM就是指定基础镜像,因此一个Dockerfile中FROM是必备的指令,并且必须是第一条指令。
    如:指定ubuntu的14版本作为基础镜像

    FROM ubuntu:14
    

    1.2、 RUN:执行命令

    RUN指令在新镜像内部执行的命令,如:执行某些动作、安装系统软件、配置系统信息之类,

    格式如下两种:

    1)shell格式:RUN< command > ,就像直接在命令行中输入的命令一样。

    如在nginx里的默认主页中写”hello“:

    RUN echo 'hello ' >/etc/nginx/html/index.html
    

    2)exec格式:RUN ["可执行文件", "参数1", "参数2"]

    如在新镜像中用yum方式安装nginx:

    RUN ["yum","install","nginx"]
    注:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错,RUN书写时的换行符是
    

    1.3、COPY:复制文件

    COPY命令用于将宿主机器上的的文件复制到镜像内,如果目的位置不存在,Docker会自动创建。但宿主机器用要复制的目录必须是和Dockerfile文件统计目录下。

    格式:

    COPY [--chown=<user>:<group>] <源路径>... <目标路径>
    COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
    

    如把宿主机中的package.json文件复制到容器中/usr/src/app/目录下:

    COPY package.json /usr/src/app/
    

    1.4、CMD:容器启动命令

    CMD命令用于容器启动时需要执行的命令,CMD在Dockerfile中只能出现一次,如果出现多个,那么只有最后一个会有效。
    其作用是在启动容器的时候提供一个默认的命令项。如果用户执行docker run的时候提供了命令项,就会覆盖掉这个命令,没提供就会使用构建时的命令。

    格式:

    shell 格式:CMD <命令>
    exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
    

    如容器启动时进入bash:

    CMD /bin/bash
    

    也可以用exec写法:

    CMD ["/bin/bash"]
    

    1.5 、MAINTAINER:指定作者

    用来指定dockerfile的作者名称和邮箱,主要作用是为了标识软件的所有者是谁。
    语法:

    MAINTAINER <name> <email>
    

    如:

    MAINTAINER autor_jiabuli 6766633@qq.com
    

    1.6、EXPOSE:暴露端口

    EXPOSE命名适用于设置容器对外映射的容器端口号,如tomcat容器内使用的端口8081,则用EXPOSE命令可以告诉外界该容器的8081端口对外,在构建镜像时
    用docker run -p可以设置暴露的端口对宿主机器端口的映射。

    语法:

    EXPOSE <端口1> [<端口2>...]
    

    如:

    EXPOSE 8081
    

    EXPOSE 8081 其实等价于 docker run -p 8081 当需要把8081端口映射到宿主机中的某个端口(如8888)以便外界访问时,则可以用docker run -p 8888:8081

    1.7、WORKDIR:配置工作目录

    WORKDIR命令是为RUN、CMD、ENTRYPOINT指令配置工作目录。其效果类似于Linux命名中的cd命令,用于目录的切换,但是和cd不一样的是:如果切换到的目录不存在,WORKDIR会为此创建目录。

    语法:

    WORKDIR path
    

    如需要在nginx目录下创建一个hello.txt的文件:

    ##进入/usr/local/nginx目录下
    WORKDIR /usr/local/nginx
    
    ##进入/usr/local/nginx中的html目录下
    WORKDIR html
    
    ## 在html目录下创建了一个hello.txt文件
    RUN echo 'hello' > hello.txt
    

    1.8、ENTRYPOINT:容器启动执行命名

    ENTRYPOINT的作用和用法和CMD一模一样,但是ENTRYPOINT有和CMD有2处不一样:

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

    1.9、VOLUME

    VOLUME用来创建一个可以从本地主机或其他容器挂载的挂载点。例如我们知道tomcat的webapps目录是放web应用程序代码的地方,此时我们要把webapps目录挂载为匿名卷,这样任何写入webapps中的心都不会被记录到容器的存储层,让容器存储层无状态化。

    格式:

    VOLUME ["path"]
    

    如创建tomcat的webapps目录的一个挂载点

    VOLUME /usr/local/tomcat/webapps
    

    这样,在运行容器时,也可以用过docker run -v来把匿名挂载点挂载都宿主机器上的某个目录,如

    docker run -d -v /home/tomcat_webapps:/usr/local/tomcat/webapps
    

    1.10、 USER

    USER命令用于指定当前望下执行的用户,需要注意的是这个用户必须是已经存在,否则无法指定。它的用法和WORKDIR有点像,切换用户。

    格式:

    USER daemon
    

    1.11、ADD

    作用和使用方法和COPY一模一样,在此不重复讲述。 区别在于ADD指令不仅能够将构建命令所在的主机本地的文件或目录,而且能够将远程URL所对应的文件或目录,作为资源复制到镜像文件系统。但由于ADD指令不支持认证,如果从远程获取资源需要认证,则只能使用RUN wget或RUN curl替代。

    RUN mkdir -p /usr/src/things && curl -SL http://example.com/big.tar.xz | tar -xJC /usr/src/things && make -C /usr/src/things all
    

    1.12、ONBUILD

    ONBUILD用于配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
    意思就是:这个镜像创建的时候不会执行ONBUILD的内容,如果其它镜像以这个镜像为基础创建镜像,就会先执行基础镜像的ONBUILD命令,通常用语构建基础镜像。

    格式:

    ONBUILD [INSTRUCTION]
    
    #构建ONBUILD镜像
    
    FROM node:slim RUN 
    
    mkdir /app WORKDIR /app 
    
    ONBUILD COPY ./package.json /app 
    
    ONBUILD RUN [ "npm", "install" ] 
    
    ONBUILD COPY . /app/ 
    
    CMD [ "npm", "start" ]
    
    #使用
    FROM my-node
    

    1.13、ENV:设置环境变量

    ENV命名用于设置容器的环境变量,这些变量以”key=value”的形式存在,在容器内被脚本或者程序调用,容器运行的时候这个变量也会保留。

    格式:

    • 1) 设置一个: ENV
    • 2) 设置多个:ENV = =...

    如设置一个环境变量JAVA_HOME,接下来的命名就可以使用这个变量:

    ENV JAVA_HOME ``/opt/jdk``ENV PATH $PATH:$JAVA_HOME``/bin
    

    在使用ENV设置环境变量时,有几点需要注意:

    • 1)具有传递性,也就是当前镜像被用作其它镜像的基础镜像时,新镜像会拥有当前这个基础镜像所有的环境变量
    • 2)ENV定义的环境变量,可以在dockerfile被后面的所有指令(CMD除外)中使用,但不能被docker run 的命令参数引用

    如:

    ENV tomcat_home_name tomcat_7``RUN ``mkdir` `$tomcat_home_name
    

    3)除了ENV之外,docker run -e 也可以设置环境变量传入容器内。

    如:

    docker run -d tomcat -e ``"tomcat_home_name=tomcat_7"
    

    这样我们进入容器内部用ENV可以看到tomcat_home_name这个环境变量。

    二、示例

    2.1、nodejs程序

    制定node镜像的版本
    
    #FROM node:8.9-alpine
    
    FROM node:10.15.3
    
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
    
    ADD . /app
    
    WORKDIR /app
    
    #RUN npm install
    
    EXPOSE 3000
    
    CMD ["npm", "run", "public"]
    

    2.2、python

    FROM hub.ict.ac.cn/dev/python3.7:my
    
    # auther
    MAINTAINER rock
    
    # set time zone;
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
    
    # Creating Application Source Code Directory
    RUN mkdir -p /prometheusAPI
    
    # Setting Home Directory for containers
    WORKDIR /prometheusAPI
    
    # Installing python dependencies
    COPY requirements.txt /prometheusAPI
    RUN pip install --user  -r requirements.txt
    
    # Copying src code to Container
    COPY . /prometheusAPI
    
    # Running Python Application
    CMD ["sh", "/prometheusAPI/start.sh"]
    

    三、打包

    3.1、docker pull基础镜像

    docker pull xxx:xx

    3.2、编写dockerfile文件

    使用docker build构建镜像,格式:docker build [OPTIONS] PATH | URL | -
    OPTIONS有很多指令,下面列举几个常用的:

    --build-arg=[] :设置镜像创建时的变量;
    -f :指定要使用的Dockerfile路径;
    --force-rm :设置镜像过程中删除中间容器;
    --rm :设置镜像成功后删除中间容器;
    --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;
    

    示例:

    把dockerfile放到项目目录内,cd到项目目录,执行
    docker build -t prometheusAPI:Vtest .
    

    3.3、将打包好的镜像上传到镜像库(可选)

    3.4、测试构建好的镜像

    docker run --rm hub.ict.ac.cn/dev/prmetheusapi:V1

    注:使用cmd构造的镜像,docker run测试的时候不能加任何命令:比如docker run --rm hub.ict.ac.cn/dev/prmetheusapi:V1 /bin/bash
    /bin/bash 内容会覆盖掉CMD。正确的命令应该是docker run --rm hub.ict.ac.cn/dev/prmetheusapi:V1

    --------------------------------------------------------- 恐惧是因为努力的还不够,加油 ~~---------------------------------------------
  • 相关阅读:
    第十章、数据库运行维护与优化
    第九章、安全管理
    第八章、数据库后台编程技术
    第七章、高级数据库查询
    第六章、数据库及数据库对象
    第五章、UML与数据库应用系统
    第四章、数据库应用系统功能设计与实施
    struts2标签debug
    SSH框架 more than one namespace has been specificed without a prefix
    Http Status 404
  • 原文地址:https://www.cnblogs.com/zhaobowen/p/13337441.html
Copyright © 2011-2022 走看看