一、概述

自制镜像的目的不是为了解决配置更新的问题,而是为了定制化应用服务。

镜像的制作:基于容器制作;dockerfile

dockerfile的格式:注释信息+指令(约定俗成使用大写)及其参数

dockerfile中的指令是顺序执行的,第一个非注释行必须是“FROM”指令。

docker制作镜像的工作逻辑:专用的工作目录,文件名首字母大写的dockerfile文件;引用的文件或目录路径不能是工作目录的父目录,只能是当前目录或子目录,因此需要将使用的文件放到此目录下。

dockerfile中每一条指定都会生成一层镜像层,所以要尽量少写指令。

构建命令:docker build --help

二、操作

1、指令

  • From:dockerfile文件的第一个非注释行,用于为镜像文件构建过程中指定基准镜像,后续的指定运行于此基准镜像所提供的的运行环境。(FROM <repository>:<tag>)
  • LABEL:为一个镜像指定元数据,键值对。(LABEL <key>=<value> <key>=<value>)
  • COPY:用于从docker宿主机复制文件到创建的新镜像文件。src支持使用通配符,dest如果是目录,末尾一定要写/,否则会被识别为文件;src路径使用相对路径,dest使用绝对路径;src是目录,则目录中的文件会被递归复制,但src目录自身不会被复制。(COPY <src> <dest>)
  • ADD:类似COPY,支持使用tar文件和URL路径。如果<src>是一个本地系统上的tar文件,将被自动展开为一个目录,其行为类似于tar -x,但通过URL获取到的tar文件不会被展开。(ADD <src> <dest>;ADD ["<src>",..., "<dest>"])
  • WORKDIR:指定工作目录,可以使用多次。(WORKDIR <dir>)
  • VOLUME:用于在image中创建一个挂载点目录,类似于命令中docker管理的挂载卷。(VOLUME <mountpoint>)
  • EXPOSE:用于为容器打开指定要监听的端口以实现与外部通信,可一次指定多个端口。指定暴露端口,但不会自动暴露到外部,run时-P才会动态绑定到宿主机的随机端口和所有地址。(EXPOSE <port>[/<protocol>] <port>[/<protocol>]),protocol指定传输层协议,tcp或udp,默认tcp。
  • ENV:用于为镜像定义所需的环境变量,可被用于Dockerfile中位于其后的其他指令调用,调用格式为$variable_name或${variable_name}。在创建容器时是能够重新配置环境变量的。(ENV <key> <value>;ENV <key>=<value>)
  • RUN:用于指定docker build过程中运行的程序,可以是任何命令,构建镜像过程中运行的命令,是基于基础镜像中的命令执行的,可运行多次。(RUN <command>或 RUN ["<executable>","<param1>","<param2>"])。第一种用法通常以“/bin/sh -c”来运行命令,在容器中的pid不为1,但会默认执行exec操作,将该进程号替换为1;第二种用法,不会以“/bin/sh -c”来发起,直接由内核创建,不支持shell操作符和使用shell环境变量,pid为1。
  • CMD:同RUN,但二者运行时间点不同。是在创建容器时没有指定运行命令时默认运行的命令,通常与ENTRYPOINT结合使用,存在多个CMD时,只有最后一个生效。CMD指定的命令可以被docker run的命令行选项覆盖。(CMD <command>或 CMD ["<executable>","<param1>","<param2>"]或CMD ["<param1>","<param2>")。第一种用法和第二种用法同RUN;第三种用法用于为ENTRYPOINT指令提供默认参数。
  • ENTRYPOINT:类似CMD的功能,为容器指定默认运行程序。不同的是,ENTRYPOINT启动的程序不会被docker run时的参数覆盖,并且这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序。--entrypoint可覆盖ENTRYPOINT指定的默认程序。可存在多个,仅有最后一个生效。(ENTRYPOINT <command>或 ENTRYPOINT ["<executable>","<param1>","<param2>"])   ---   注:json数据中,要使用双引号。
  • USER:用于指定运行指令(RUN,CMD,ENTRYPOINT)时的用户名或UID,需要是已存在的用户,默认使用root。(USER <UID>|<UserName>)
  • HEALTHCHECK:用于定义docker检测某个容器的健康状态的行为。(HEALTHCHECK [OPTIONS] CMD <command>或HEALTHCHECK NONE -- 拒绝任何的健康状态检测)
  • SHELL:用于指定运行指令默认要使用的shell程序,默认是linux下是[“/bin/sh,"-c”],windows是[“cmd”,"/S","/C"]。( SHELL ["<executable>","<parameters>"])
  • STOPSIGNAL:接收到什么信号容器才会退出,默认是-15,docker stop就是发送的-15的信号。(STOPSIGNAL signal)
  • ARG:构建过程中使用的变量,只在build中使用,可以在build中使用--build-arg传参数替换默认值。(ARG <name>[=<default_value>])
  • ONBUILD:用于在dockerfile中定义一个触发器,即此制作的镜像作为基础镜像被使用,其他人在build他们的镜像时会触发ONBUILD定义的指令。不能自动嵌套,不会触发FROM和MAINTAINER指令。(ONBUILD <INSTRUCTION>)

三、其他

注:直接在命令行启动一个进程,该子进程的父进程是当前shell,并且占用shell的终端输出;command & 运行一个进程,不占用当前shell的终端输出,但其父进程还是当前shell,shell退出进程也会退出;nohup command &,将当前进程送到后台,剥离与当前shell的父子关系,其父进程为init。

docker stop/kill 停止容器时,容器内接收信号的都是进程号为1的进程。

shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉。

6.dockerfile的更多相关文章

  1. 如何用Dockerfile创建镜像

    本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5181222.html 创建镜像的目的 首先说DockerHub或其它一些镜像仓库已经提供了够多的镜像,有 ...

  2. Dockerfile初探

    git上的asp.net samples工程已经写好了docker file,内容是如下   //任何dockersfile都要以FORM开头,约定是用大写. FROM microsoft/aspne ...

  3. ubuntu 16.04 Dockerfile 安装mysql

    默认上MariaDB的包并没有在Ubuntu仓库中.要安装MariaDB,我们首先要设置MariaDB仓库. 配置MariaDB 仓库 # apt-get install software-prope ...

  4. 分析Mysql 5.6的Dockerfile

    Docker官方的Mysql镜像的Dockerfile托管在Github上,地址如下: https://github.com/docker-library/mysql/tree/5836bc9af9d ...

  5. 利用Dockerfile构建一个基于centos 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像

    Dockerfile内容如下: FROM centos MAINTAINER Victor ivictor@foxmail.com WORKDIR /root RUN rm -f /etc/yum.r ...

  6. Docker dockerfile创建Eclipse镜像初试

    抽空初步阅读了Docker技术入门与实战 [Kindle电子书] http://www.cnblogs.com/2018/p/4600116.html 现在想首先在开发环境下引入统一的环境,由于开发中 ...

  7. 安装Nginx的Dockerfile实例

    #################################################Dockerfile to build Nginx Installed Containers##Bas ...

  8. 测试dockerfile

    测试dockerfile是否ok(比如我的Dockerfile在deploy目录下) docker build -t my_image -f deploy/Dockerfile . docker im ...

  9. 通过Dockerfile建立.NET Core mvc Image

    生成.NET core mvc code docker run -itd microsoft/dotnet:latestdocker psdocker attach containeridmkdir ...

  10. .Net Core+cenos7+Docker+Dockerfile 部署实践

    因为这段时间比较忙,同时也在抽时间将开发框架转移到 .net Core 上 所以写博客的时间就少了,这次我利用dockerfile成功将.net Core程序部署到了cenos7容器中,特抽时间把我的 ...

随机推荐

  1. 关于Java泛型实现原理的思考与一般用法示例总结

    面向对象的一个重要目标是对代码重用的支持.支持这个目标的一个重要机制就是泛型机制.在1.5版本之前,java并没有直接支持泛型实现,泛型编程的实现时通过使用继承的一些基本概念来完成的. 这种方式的局限 ...

  2. 错误 error: The following untracked working tree files would be overwritten by merge:README.md

    问题类型 相信很多小伙伴在创建新的git仓库后,会选上添加README.md文件,开始我也没太在意,应该也没有什么问题. 但是当我通过git添加远程仓库,给这个仓库上传代码时,出现了如下问题:erro ...

  3. SpringMVC学习01——HelloSpringMvc Demo

    HelloWorldController.java文件 package com.su.controller; import org.springframework.stereotype.Control ...

  4. 《好久不见》(Cover 陈奕迅)箫声远 洞箫

    Your browser does not support the audio element.

  5. 安装mysql8.0.17时候报错1251-Client does not support authentication protocol requested by server; consider upgrading MySQL client

    当mysql数据库安装时候选择的是加密密码时候,用navicat连接时候报错1521,这时候可以cmd之后登陆mysql执行下列代码就可以了 代码: mysql> alter user root ...

  6. 获取文件夹中前N个文件

    @echo off set input="list.txt" set srcDir="%1" set /a fileCount=10 set /a curInd ...

  7. oracle--权限的传递

    sys 用户 普通授权lisi grant alter any table to lisi; 将权限指定admin ,可以权限传递给其他用户 grant alter any table to lisi ...

  8. python字典-字典方法

    1.kyes() (1)取出字典的key In [32]: myCat Out[32]: {'colr': 'gray', 'size': 'fat'} In [33]: for i in myCat ...

  9. maven build失败 (Failure to find io.renren:renren-security:pom:3.2.0 in http://maven.aliyun.com/nexus/content/groups/public/ was cached in the local repository...)

      今天mvn clean package一个子工程(renren-admin)时报错: Failed to execute goal on project renren-admin: Could n ...

  10. JAVA Error:The project was not built since its build path is incomplete. Cannot find the class file for java.util.Map$Entry.....

    今天,学习Netty框架时遇到error:Description Resource Path Location Type:The project was not built since its bui ...