zoukankan      html  css  js  c++  java
  • Dockerfile build run

    Dockerfile
    From:
    定制的镜像都是基于 FROM 的镜像
    RUN:
    执行命令,在镜像构建的时候会执行。有两种模式
    shell格式
    RUN <命令行命令>
    # <命令行命令> 等同于,在终端操作的 shell 命令。

    exec格式

    RUN ["可执行文件", "参数1", "参数2"]
    # 例如:
    # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

    多一个run都会在docker上新建一层,过多层,使镜像过大。可以用 && 组合命令。  这样就只有一个run 就只有一层。

    FROM centos
    RUN yum install wget
    RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
    RUN tar -xvf redis.tar.gz
    以上执行会创建 3 层镜像。可简化为以下格式:
    FROM centos
    RUN yum install wget 
        && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" 
        && tar -xvf redis.tar.gz

    COPY:

    复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
    COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
    COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

    [--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。

    <源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

    COPY hom* /mydir/
    COPY hom?.txt /mydir/

    <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

    CMD:

    CMD 在docker run 时运行。
    RUN 是在 docker build。

    作用 在容器启动时候运行默认的程序,程序结束,容器就结束了。cmd指令指定的程序会被docker run命令行参数中指定运行的程序覆盖

    注意 如果DockerFile中有多个cmd,只有最后一个生效。

    shell格式

    CMD <shell 命令> 

    exec格式  推荐使用

    CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
    CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

    ENTRYPOINT:

    类似于 CMD 指令, 在容器启动时候运行默认的程序,程序结束,容器就结束了。但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。

    当指定了 ENTRYPOINT 后, CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令

    优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

    注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

    ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

    可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。

    FROM nginx
    
    ENTRYPOINT ["nginx", "-c"] # 定参
    CMD ["/etc/nginx/nginx.conf"] # 变参   run命令中可以修改的
    不传参数
    $ docker run nginx:test 容器内会默认运行以下命令,启动主进程。 nginx
    -c /etc/nginx/nginx.conf
    传参数
    $ docker run  nginx:test -c /etc/nginx/new.conf
    
    容器内会默认运行以下命令
    nginx -c /etc/nginx/new.conf

    ENV:

    设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

    ENV <key> <value>
    ENV <key1>=<value1> <key2>=<value2>...

    以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:

    ENV NODE_VERSION 7.2.0
    
    RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" 
      && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

    ARG:

    构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

    构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

    ARG <参数名>[=<默认值>]

    EXPOSE:

    声明镜像端口

    • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
    • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
    EXPOSE <端口1> [<端口2>...]

    WORKDIR:

    工作目录

    #test
    FROM ubuntu
    MAINTAINER hello
    RUN mkdir /mydir
    RUN echo hello world > /mydir/test.txt
    WORKDIR /mydir
    CMD ["more" ,"test.txt"]

    CMD ["more" ,"test.txt"] 中没有指定test.txt的目录,就可以直接输出,原因是制定了工作目录为/mydir,相当于cd

    可以在 docker run命令中用 -w参数覆盖掉WORKDIR指令的设置。

    USER:

    用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

    USER <用户名>[:<用户组>]

    一个.net core项目的dockefile文件

    FROM hub.xxxxx.cn/public/dotnet-core:v2.2.2
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
    
    WORKDIR /app
    EXPOSE 8000
    COPY . /app
    
    WORKDIR /app
    ENTRYPOINT [ "dotnet", "/app/xxx.dll" ]   
    Docker build
    参数说明
    --build-arg=[] :设置镜像创建时的变量;
    
    --cpu-shares :设置 cpu 使用权重;
    
    --cpu-period :限制 CPU CFS周期;
    
    --cpu-quota :限制 CPU CFS配额;
    
    --cpuset-cpus :指定使用的CPU id;
    
    --cpuset-mems :指定使用的内存 id;
    
    --disable-content-trust :忽略校验,默认开启;
    
    -f :指定要使用的Dockerfile路径;
    
    --force-rm :设置镜像过程中删除中间容器;
    
    --isolation :使用容器隔离技术;
    
    --label=[] :设置镜像使用的元数据;
    
    -m :设置内存最大值;
    
    --memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
    
    --no-cache :创建镜像的过程不使用缓存;
    
    --pull :尝试去更新镜像的新版本;
    
    --quiet, -q :安静模式,成功后只输出镜像 ID;
    
    --rm :设置镜像成功后删除中间容器;
    
    --shm-size :设置/dev/shm的大小,默认值是64M;
    
    --ulimit :Ulimit配置。
    
    --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
    
    --network: 默认 default。在构建期间设置RUN指令的网络模式
    1、dockerfile文件路径  (常用)
    使用当前目录的 Dockerfile 创建镜像,标签为 XXX/CRMAPI:V1。
    docker build -t XXX/CRMAPI:v1 . 

    使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。

    docker build github.com/creack/docker-firefox

    也可以通过 -f Dockerfile 文件的位置:

    $ docker build -f /path/to/a/Dockerfile .
     
    2、上下文路径
    docker build -t nginx:test .

    最后的  .   是上下文路径。

    上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

    解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

    如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

    注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

     
     

    Docker run
    docker run -d -p 8030:8000 --cpus=2 -m 2G --memory-swap=2G --env ASPNETCORE_ENVIRONMENT=release -v /data/pf/logs/errorLogs:/app/wwwroot/errorLogs -v /data/pf/logs/NSLogs:/app/wwwroot/NSLogs -v /data/pf/logs/subscribenbusLogs:/app/wwwroot/subscribenbusLogs --name="xxxxx" hub.xxxx.con/xxxxx:latest
     
     
     
  • 相关阅读:
    socket学习笔记——获取域名与IP(linux)
    socket学习笔记——实现收发文件(Windows)
    socket学习笔记——IO口的基本操作(读、写)
    Microsoft Visual C++ 2010(86) Redistributable不能安装完美解决
    AD转换精度的计算
    cuda编程基础
    CUDA中并行规约(Parallel Reduction)的优化
    Warp divergence
    提取图片中文字
    GPU基本概念详解
  • 原文地址:https://www.cnblogs.com/wudequn/p/13461448.html
Copyright © 2011-2022 走看看