ubuntu-docker入门到放弃(七)Dockerfile简介
一、dockerfile基本结构
最简单的理解就是dockerfile实际上是一些命令的堆叠,有点像最基础的shell脚本,没有if 没有for,就是串行的一堆命令。
一般而言,dockerfile分为四个部分:基础镜像信息、维护者信息、镜像操作指令和启动时执行指令,例如:
#基础镜像信息
FROM ubuntu #维护者信息
MAINTAINER slim_liu slim_liu@.com #镜像操作指令 RUN apt-get update && apt-get install -u nginx #启动容器时执行的指令 CMD /usr/sbin/nginx
二、镜像操作指令
指令分为很多种,下面一一列举:
指令一般格式为 INSTRUCTION arguments ,指令包括FROM、MAINTAINER、RUN 等。
2.1 FROM
格式:
FROM <image>或FROM <image>:<tag>
Dockerfile 的开头,必须是FROM,如果在同一个dockerfile中创建多个镜像,可以使用多个from,每个镜像一次。
2.2 MAINTAINER
格式:
MANINTAINER <name>,指定维护者信息
2.3 RUN
格式:
RUN <command>或RUN ["executable", "param1", "param2"]
前者将在shell终端中执行命令,即 /bin/sh -c。后者则使用exec执行,指定终端,可以使用第二种,RUN ["/bin/bash", "-c" , "echo hello!"]
2.4 CMD
CMD支持三种格式:
CMD ["executable", "param1", "param2"]#使用exec执行,推荐方式。
CMD command param1 param2 #在/bin/sh 中执行,提供给需要交互的应用。
CMD ["param1", "param2"] #提供给ENTRYPOINT 的默认参数。
每个dockerfile只能指定一条CMD指令,如果有多条,则只会执行最后一条,并且如果启动容器时,指定了运行的命令,则会覆盖掉CMD指定的命令。
2.5 EXPOSE
格式:
EXPOSE <port> <port> ...
例:
EXPOSE 80 443 3306
告诉docker容器暴露的端口号,供互联系统使用。在启动容器时,需要通过-P,docker主机会自动分配一个端口转发到指定的端口,如果使用-p,则可以具体的指定端口映射关系。
2.6 ENV
格式:
ENV <key> <value> #指定一个环境变量,会被后续的RUN变量使用,并且会在容器中保持。
例:
ENV A
RUN curl -SL http://test.com/temp-$A.tar.gz
2.7 ADD
格式:
ADD <src> <dest>
复制指定的src到容器中的dest,src可以是dockerfile相对路径的目录、url、tar文件(将自动解压成目录)等
2.8 COPY
格式:
COPY <src> <dest>
复制本地主机的src(为dockerfile所在目录的相对路径,文件或目录)为容器中的dest,目标路径不存在时,会自动创建,当使用本地目录为源目录时,推荐使用COPY。
2.9 ENTRYPOINT
格式1:
ENTRYPOINT ["executable", "param1", "param2"]
格式2:
ENTRYPOINT command param1 param2 (#shell中执行)
配置容器启动时执行的命令,并且不能被docker run 提供的参数覆盖。
每个dockerfile只能有一个此参数,多个时候,只有最后一个生效。
2.10 VOLUME
格式:
VOLUME <"/data">
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
2.11 USER
格式:
USER daemon
指定运行容器时的用户名或UID,后续的RUN命令也会使用指定用户。
当容器不需要管理员权限时,建议添加USER参数,例如:
RUN groupadd -r postgres && useradd -r -g postgres postgres #需要临时获取管理员权限,可以使用gosu,不推荐sudo。
2.12 WORKERDIR
格式:
WORKERDIR /path/workerdir
为后续的RUN CMD ENTRYPOINT等指令配置工作目录。
可以使用多个WORKERDIR,如果后续的参数是相对路径,将基于之前的WORKERDIR
例:
WORKERDIR /a
WORKERDIR b
WORKERDIR c RUN pwd /a/b/c
2.13 ONBUILD
格式:
ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。
例:
我们首先创建了image-a,并在其中使用了ONBUILD
[...]
ONBUILD ADD . /src/ ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
接着我们from image-a创建image-b,就会自动执行上面的两句。
如果使用ONBUILD指令的镜像,推荐在标签中注明,例如,ruby:1.9-onbuild
ubuntu-docker入门到放弃(七)Dockerfile简介的更多相关文章
- Docker入门教程(七)Docker API
Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...
- Docker入门(一):简介
这个<Docker入门>系列文档,是我根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家 ...
- docker入门到放弃
1.容器简介 Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroup,namespace,Union FS等技术,对应用进程进行封装隔离,并且独立于宿主机与其他进程, ...
- Docker入门与实践之 Dockerfile 语法详解
一.Dockerfile 概述 Dockerfile是docker程序的解释脚本文件,Dockerfile 是一条一条的指令,Docker程序将dockerfile中的一条条指令编译成Linux可执行 ...
- MyBatis从入门到放弃七:二级缓存原理分析
前言 说起mybatis的一级缓存和二级缓存我特意问了几个身边的朋友他们平时会不会用,结果没有一个人平时业务场景中用. 好吧,那我暂且用来学习源码吧.一级缓存我个人认为也确实有些鸡肋,mybatis默 ...
- Docker入门
-----------------------------------------Docker入门教程(一)介绍Docker入门教程(二)命令Docker入门教程(三)DockerFileDocker ...
- Docker入门教程(三)Dockerfile
Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...
- Docker入门之七Dockerfile
Dockerfile是一个文本格式的配置文本,可以使用它来创建自定义的镜像.首先我们可以先看一个dockerfile是什么样子.这里可以有一个网站不错:http://dockerfile.github ...
- Docker入门(七):部署app
这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...
- 【实战】Docker 入门实战一:ubuntu 和 centos 安装Docker
Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...
随机推荐
- composer修改成国内镜像
因为composer安装包数据是从github.com上下载的,安装包的元数据从packagist.org上下载 作为两个国外的网站,连接速度会很慢,而且很有可能网站被墙. 所以composer中国全 ...
- mongodump and mongorestore
mongoexport和mongoimport只能导出/导入某个特定集合 1 mongoexport bin目录下 ./mongoexport <hostname><:port> ...
- net基础运算符
1.Convert类型转换 总结: 类型如果相兼容的两个变量,可以使用自动类型转换或者强制类型转换. 但是,如果两个类型的变量不兼容,比如string与int或者string 与doub ...
- 『TensorFlow』流程控制之tf.identity
一个详细介绍 下面程序要做的是,5次循环,每次循环给x加1,赋值给y,然后打印出来, x = tf.Variable(0.0) #返回一个op,表示给变量x加1的操作 x_plus_1 = tf.as ...
- css绘制内扣圆角
纯静态的一种效果绘制,避免使用图标浪费内存.效果如下 废话不多说,代码如下: <!DOCTYPE html> <html lang="en"> <he ...
- Wincc用户登录VBS脚本
在Wincc中为防止未知用户的误操作,在操作性按钮以及图符等设备操作面板,在组流程图时,需设置用户权限,只有符合权限的用户才可以进行操作.所以在流程图界面需设置系统用户登录界面.登录操作可以选择按钮或 ...
- git创建分支提交到远程分支步骤
git创建分支提交到远程分支步骤 step1,在本地新建分支() git branch newbranch step2:把本地分支push到远程 git push origin newbranch s ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer 一.前言 关于第一节的 ...
- 除了Udacity,全球最聪明的那群人还上哪些网站?
01. ***,与世界相连 WikiWand——打开维基百科的新方式 http://www.wikiwand.com/ InsightfulQuestions(subreddit)——跨越界限的智力讨 ...
- 企业面试题:Buffer与cache的区别?
buffer缓冲 cache是缓存. 写缓冲,读缓存.简单点说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的.缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行 ...