Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像

Dockerfile由一行行命令语句组成,支持#开头的注释

Dockerfile分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行命令

Dockerfile中的关键字

FROM

格式 FROM <image> 或 FROM <image>:<tag>

第一条指令必须为FROM指令,并且如果同一个Dockerfile中创建多个镜像时,可以使用多个FROM,每个镜像一次

MAINTAINER

格式 MAINTAINER <name> 指定维护者信息

RUN

格式 RUN <command> 或 RUN ["executable", "param1", "param2"]

前者使用shell终端执行命令,即/bin/sh -c; 后者使用exec执行命令;指定其他终端使用第二种方式实现,例如 RUN ["/bin/bash" "-c", "echo hello"]

每条RUN指令将在当前镜像基础上面执行命令,并提交为新的镜像,当命令较长时可以使用 \ 换行

CMD

支持三种格式

CMD ["executable", "param1", "param2"] 使用exec执行,推荐

CMD command param1 param2 在/bin/sh中执行,提供给需要交换的应用

CMD ["param1", "param2"] 提供给ENTRYPOINT的默认参数

指定容器时执行的命令,每个Dockerfile只能有一条CMD命令,如果有多条,最后一条生效

如果用户启动容器指定了运行的命令,则CMD指令被覆盖

EXPOSE

格式 EXPOSE <port> ... 容器暴露的端口号,当启动容器时,如果指定了-P参数,则会随机指定端口映射到暴露的端口上

ENV

格式 ENV <key> <value> 指定环境变量,可以被后续的RUN指令使用

ADD

格式 ADD <src> <des> 该命令复制指定的src到容器中的des,启动src可以是一个相对路径,可以是一个url,也可以是一个tar文件(会自动解压为目录)

COPY

格式 COPY <src> <des> 复制本地文件到容器中,当本地文件时目录时,推荐使用COPY

ENTRYPOINT

两种格式

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2 (shell中执行)

配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖

每个Dockerfile只有一个ENTRYPOINT,多条时最后一个生效

CMD和ENTRYPOINT的区别

如果同时有CMD和ENTRYPOINT指令,ENTRYPOINT指令级别高

如果Dockerfile中有CMD指令,则CMD指令的参数会附加到ENTRYPOINT指令的后面

如果docker run命令携带参数,这个参数会覆盖掉CMD命令的参数,并且会附加到ENTRYPOINT这里后面

ENTRYPOINT指令不会被docker run提供的指令覆盖

VOLUME

格式 VOLUME ["/data1", "/data2"] 自动匿名挂载,自动生成挂载点---暂时不知道用途

USER

格式 USER daemon

指定容器运行时的用户名或UID,后续的RUN也会使用指定用户

WORKDIR

格式 WORKDIR /path/to/workdir

为后续的RUN, CMD, ENTRYPOINT指令配置工作目录

可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径

WORKDIR /a WORKDIR b WORKDIR c 最终路径为 /a/b/c

ONBUILD

格式 ONBUILD [INSTRUCTION]

配置当创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令

该命令的意思为:如果别的Dockerfile使用该文件创建的镜像时,会自动执行ONBUIDL后面的命令

创建镜像

目录使用当前目录查找,如果当前目录为空,则子目录查找

如果工作目录和Dockerfile是同一级, 使用./表示当前目录下查找

创建文件 Dockerfile,可以使用-f参数来指定使用的Dockerfile文件(默认配置文件名为Dockerfile)

# Dockerfile文件, 同时本地镜像中有一个镜像名为 centos:6.7, 基于该镜像创建一个新建镜像
# Dockerfile的原理是根据提供的镜像创建一个容器,执行完指定的命令后,再重新打包出一个新的镜像并删除运行的容器
FROM centos:6.7 MAINTAINER djoker EXPOSE RUN yum -y install epel-release
#RUN yum -y install supervisor openssh openssh-server openssh-clients
RUN yum -y install supervisor run sed -i 's/nodaemon=false/nodaemon=true/' /etc/supervisord.conf CMD ["/usr/bin/supervisord"]

执行命令创建新的镜像

# -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
# 后面是Dockerfile所在的目录, 当工作目录和Dockerfile在同一级时,使用./来表示从当前目录查找,
# 执行 docker build -t myrepo/myapp:laster ./
docker build -t myrepo/myapp /tmp/test1

Docker系列三:Dockerfile的更多相关文章

  1. Docker系列07—Dockerfile 详解

    本文收录在容器技术学习系列文章总目录 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Docker系列 ...

  2. Docker系列(三)常用命令

    命令说明 docker pull 格式: docke pull [OPTIONS] NAME[:TAG] 作用:下载名称为 name 的镜像 例子: sudo docker pull dl.docke ...

  3. Docker系列(四)Dockerfile

    基本语法 使用 #来注释 FROM 指令告诉Docker使用哪个镜像作为基础 接着是维护者信息 RUN 开头的指令会在创建中运行,比如安装软件包 FROM 格式: FROM<image>或 ...

  4. Docker 系列三(容器管理).

    一.运行容器 1.基于镜像新建一个容器并启动 : tomcat:8.0 -i:交互式操作 -t:终端 -rm:容器退出后随之将其删除,可以避免浪费空间 -p :端口映射 -d :容器在后台运行 指明了 ...

  5. Docker应用三:Dockerfile使用介绍(以安装redis为例)

    Dockerfile使用介绍 一.Dockerfile介绍 Dockerfile用于自定义创建docker镜像,是由一行行命令组成的文件. Docker file中的命令根据作用分为四类: 1.1.指 ...

  6. docker系列三之docker的安装

    docker的安装 读者只需按照以下的命令一步步执行即可实现安装,笔者也只是将官网的步骤复制出来(笔者的环境为Centos7),详细请参考:https://docs.docker.com/instal ...

  7. Docker系列三:Docker容器管理

    Docker容器管理 1. 单一容器管理 1) 容器的启动 $ docker run --name gitlab-redis -d --volume /srv/docker/gitlab/redis: ...

  8. Docker系列(三):Docker自定义容器镜像

    将容器编程镜像: docker commit [repo:tag] 网上有这句话:当我们在制作自己的镜像的时候,会在container中安装一些工具.修改配置,如果不做commit保存 起来,那么co ...

  9. windows下部署.netcore+docker系列三 (unbuntu 18.4 下安装ftp)

    // 先更新下系统sudo apt-get update//安装ftpsudo apt-get install vsftpd// 启动 服务sudo service vsftpd start//ftp ...

随机推荐

  1. redis(六)---- 简单延迟队列

    延迟队列的应用场景也很常见,例如:session的超时过期.自动取消未付款订单等等.redis中有一种数据结构叫做zset,即有序集合.元素类型为String类型,且元素具有唯一性不能重复,每个元素可 ...

  2. trove database功能总结

    我曾经以为trove只负责数据库(datastore)的部署,最近才发现trove可以进行数据库(database)的创建. 首先是列出某个实例上(instance)数据库(datastrore)上的 ...

  3. nginx如何一个域名多个端口?

    方法一 写三个 listen server { listen 80; listen 81; listen 82; server_name www.sifou.com; ... 方法二 写三个serve ...

  4. android studio使用JDBC访问mysql数据库(Kotlin方法)

    工具:mysql-connector-java-5.1.48.jar,mysql version 5.6.19,android studio内置模拟器 1.connection import java ...

  5. Redhat7 开机启动服务

    #!/bin/sh ### BEGIN INIT INFO # Provides: jboss # Required-Start: $local_fs $remote_fs $network $sys ...

  6. Spring DATA Neo4J(一)

    Spring DATA Neo4J——简介 Spring Framework提供了一下模块来处理基于Java的应用程序的DAO层 Spring JDBC Spring ORM Spring DATA ...

  7. 加速软件源更新和安装 ubuntu 软件中心

    Linux mint 12 修改加速软件源更新和安装 ubuntu 软件中心 由于 linux mint 12 是基于 ubuntu 的,可以使用 ubuntu 的源(Ubuntu 11.10 代号 ...

  8. Mybatis学习——初始MyBatis

    什么是MyBatis框架? MyBatis框架是一种ORM(既对象关系映射)框架. 什么是ORM框架? 是一种为了解决面向对象与关系数据库之间数据不匹配的技术,它通过描述Java对象和关系数据库表之间 ...

  9. c#学习笔记04——ADO.NET

    ADO.NET结构:ADO.NET建立在几个核心类之上,这些类可以分为两组 包含和管理数据的类:DataSet DataTable DataRow DataRelation... 链接数据源的类:Co ...

  10. ZJNU 2204 - dzj的数学作业

    我猜这个数列可以直接从大到小凑…… 推出帕多瓦数列每一项,从大到小循环 遇到小于等于x的项就减掉这一项 全部循环完毕后判断x是否为0即可 #include<stdio.h> typedef ...