Docker基本命令与使用 —— Dockerfile指令与构建(三)

时间:2022-09-21 11:23:52

一.Dockerfile指令上

1.指令格式

# Comment 注释, 以#开头

INSTRUCTION argument 以大写的指令+参数

#First Dockerfile 注释
FROM ubuntu:14.04
MAINTAINER dormancypress "dormancypress@outlook.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
 
  • From
  • MAINTAINER
  • RUN
  • EXPOSE

FROM指令

FROM <image> / FROM <image>:<tag>
  • 已经存在的镜像
  • 基础镜像
  • 必须是第一条非注释指令
 

MAINTAINER指令

MAINTAINER <name>
指定镜像的作者信息,包含镜像的所有者和联系信息
 

RUN指令

指定当前镜像中运行的命令,包含了两种命令模式
  • RUN<command> (shell模式)
是以 /bin/sh -c command 形式执行命令
eg. RUN echo hello
  • RUN ["executable", "param1", "param2" ] (exec模式)
RUN ["/bin/bash", "-c", "echo hello"]
镜像分层的概念,每一个run指令都会在当前镜像的上层创建一个新的镜像,来运行指定的命令
RUN apt-get update && apt-get install -y nginx 将两条run指令合并成一条,会比原来的构建过程少了一步
 

EXPOSE指令

EXPOSE <port>[<port>...]
指定运行该镜像的容器使用的端口,一个或多个,也可以在一个dockerfile中使用多个expose命令。但是在run一个容器时,还是必须指定容器的端口映射,如 docker run -p 80 -d test1 nginx。EXPOSE指令只是docker该容器内的应用程序会使用特定的端口,但出于安全的考虑,docker并不会自动的打开端口,而需要在使用时在run命令中添加对端口的映射。
 

二.Dockerfile指令下

  • CMD 在容器运行时运行的命令
  • ENTERYPOINT
  • ADD 设置镜像的目录和文件
  • COPY
  • VOLUME
  • WORKDIR 镜像在构建及容器运行时的环境设置
  • ENV
  • USER
  • ONBUILD 类似触发器的指令
 

CMD指令

CMD指令用来提供容器默认运行的命令,与RUN类似,但是RUN是在镜像构建时运行的,而CMD指定的命令是在容器运行时运行的。并且当我们用docker run 命令启动一个容器时,如果指定了容器运行时的命令,那么CMD命令中的指令会被覆盖,不会执行。CMD指令是用来指定容器运行时的默认行为。
  • CMD [ "executable", "param1", "param2"] (exec模式)
  • CMD command param1 param2 (shell模式)
  • CMD [ "param1", "param2"] (作为ENTRYPOINT指令的默认参数)
 

ENTRYPOINT指令

ENTRYPOINT指令和CMD指令很相似,唯一的区别就是不会被docker run 命令中的指令所覆盖(run中的指令无效)。如需覆盖,可以使用docker run --entrypoint。
  • ENTRYPOINT [ "executable", "param1", "param2"] (exec模式)
  • ENTRYPOINT command param1 param2 (shell模式)
 

ADD指令

将文件和目录复制到使用docker构建的镜像中。文件或者目录的来源可以是本地路径,也可以是远程的URL。如果是本地地址必须是构建目录中的相对地址,对于远程URL,Docker不推荐使用,更建议使用curl和wget命令来获取文件。目标路径需要指定镜像中的绝对路径。
  • ADD <src>...<dest>
  • ADD ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
 

COPY指令

类似ADD指令。区别在于ADD包含类似tar的解压功能,如果单纯复制文件,docker推荐使用COPY。
  • COPY <src>...<dest>
  • COPY ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
eg. COPY index.html /usr/share/nginx/html/
 

VOLUME指令

VOLUME指令用来向基于镜像创建的容器添加卷。这个目录可以绕过联合文件系统,并提供如共享数据或者对数据持久化的功能。
  • VOLUME ["/data"]
 

WORKDIR指令

用来在从镜像创建一个新容器时,在容器内部设置工作目录。ENTERYPOINT或者CMD指定的命令都会在这个目录下执行,我们也可以使用这个指令在构建中为后续的指令指定工作目录。
  • WORKDIR /path/to/workdir
需要注意的是WORKDIR通常需要指定绝对路径,如果使用了相对路径,那么工作路径会一直传递下去。如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
OUT: /a/b/c
 

ENV指令

用来设置环境变量,与WORKDIR指令类似。环境变量的指令可以作用在构建过程中,以及在运行过程中同样有效。
  • ENV <key> <value>
  • ENV <key> <Value> ...
 

USER指令

用来指定镜像会以什么样的用户运行。
  • USER daemon
eg. USER nginx 基于该镜像启用的容器,就会以nginx用户身份来运行。
USER user USER uid
USER user:group USER uid:gid
USER user:gid USER uid:group
如果不使用USER指令来指定用户,那么默认会使用root用户。
 

ONBUILD指令

ONBUILD指令能够为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像时,这个触发器会被执行。当子镜像在构建时,会触发触发器中的指令。
  • ONBUILD [INSTRUCTION]
 

三.Dockerfile构建过程

  • 从基础镜像运行一个容器
  • 执行一条指令,对容器做出修改
  • 执行类似docker commit的操作,提交一个新的镜像层
  • 再基于刚提交的镜像运行一个新容器
  • 执行Dockerfile中的下一条指令,直至所有指令执行完毕
 
使用中间层镜像进行调试 —— 查找错误
构建缓存
不使用缓存
  • docker build --no-cache
  • Dockerfile 中的 ENV REFRESH_DATE 2015-04-01 之后变不再使用缓存
查看镜像构建的过程
  • docker history [image]

Docker基本命令与使用 —— Dockerfile指令与构建(三)的更多相关文章

  1. docker(8)Dockerfile指令介绍

    前言 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. Dockerfile简介 Dockerfile是用来构建Docker镜像的构建文件,是由一系列 ...

  2. Docker容器学习梳理 - Dockerfile构建镜像

    在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其 ...

  3. Docker Dockerfile指令

    Docker 可以通过 Dockerfile 的内容来自动构建镜像.Dockerfile 是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据 Dockerfile 的内容构 ...

  4. Dockerfile指令学习 &lpar;转&rpar;

    原文地址:http://blog.csdn.net/we_shell/article/details/38445979 Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一 ...

  5. Docker系列(22)- DockerFile指令说明并构建自己的centos

    DockerFile常用指令 实战测试 DockerHub中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建 #创建一个自己的centos # 1.编写D ...

  6. docker学习笔记17:Dockerfile 指令 ONBUILD介绍

    ONBUILD指令可以为镜像添加触发器.其参数是任意一个Dockerfile 指令. 当我们在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A ...

  7. docker之Dockerfile指令介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...

  8. docker Dockerfile指令ADD和COPY的区别,添加目录方法

    docker Dockerfile指令ADD和COPY的区别,添加目录方法 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中.其格式是: ADD 源 ...

  9. Docker学习笔记三 Dockerfile 指令 定制镜像

    本文地址:https://www.cnblogs.com/veinyin/p/10412079.html  镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...

随机推荐

  1. 【leetcode】Factorial Trailing Zeroes

    题目描述: Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be ...

  2. dw添加emmet

    1.emmet下载Emmet.zxp 2.怎么在dw中设置(命令->emmet->Expand Abbreviation)中查看使用emmet的快捷键,如果跟别人快捷键重合了 3.编辑-& ...

  3. LightOj&lowbar;1364 Expected Cards

    题目链接 题意: 一副牌, 每个花色13张牌,加上大小王,共54张. 遇到大小王可以代替其中某种花色. 给定C, D, H, S. 每次抽一张牌, 问抽到C张梅花, D张方块, H张红桃, S张黑桃所 ...

  4. Lucene简介

    1 lucene简介1.1 什么是lucene    Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供 ...

  5. ACdream 1015 Double Kings

    假设第一个人选的点为P,并且当作根,那么第二个人选的最优情况必然是根p连着的那些点中的一个.然后枚举一下P即可. #pragma comment(linker, "/STACK:102400 ...

  6. 玩转SSH(五):Struts &plus; Spring &plus; MyBatis(注解版)

    本文将在 玩转SSH(四):Struts + Spring + MyBatis 的基础上进行一些小的改动,将原本是 xml 配置方式的项目,改成注解的配置方式. 要将项目改成注解方式,一般是将在 Sp ...

  7. 《java&period;util&period;concurrent 包源码阅读》10 线程池系列之AbstractExecutorService

    AbstractExecutorService对ExecutorService的执行任务类型的方法提供了一个默认实现.这些方法包括submit,invokeAny和InvokeAll. 注意的是来自E ...

  8. Visual Studio 2010多线程编程

    随着处理数据量的逐渐增大,串行单核的程序,犹如残灯缺月,无法满足运用需求.大规模集群的出现,解决了这一技术难题.本文旨在探讨如何使用多CPU并行编程,关于CUDA的并行前面文章已有讲述.本文结构分为三 ...

  9. 1049&period;(&ast;) Counting Ones

    题意:题目大意:给出一个数字n,求1~n的所有数字里面出现1的个数 思路:转自(柳婼 の blog)遍历数字的低位到高位,设now为当前位的数字,left为now左边的所有数字构成的数字,right是 ...

  10. Java集合之HashSet&sol;TreeSet原理

    Set集合 1.HashSet  只去重复, 没有顺序  HashSet的add方法会调用hashCode和equals, 所以存储在HashSet中的对象需要重写这两个方法. 2.TreeSet   ...