简介

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

上下文路径

如下是一个简单的基于dockerfile创建镜像的命令,我们注意到启动处理镜像名和tag之外,还有一个点,点就是代表上下文路径。

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

默认情况下,Dockerfile所在路径就是上下文路径

注意:上下文路径下不要存放无用文件,会导致过程缓慢

docker build -t nginx:v3 .

常用参数及含义

MAINTAINER

维护者信息,作者信息

FROM

创建的镜像都是基于FROM后面的镜像

RUN

执行后面的命令;相当于在shell中执行命令

对于多个指令不建议使用如下方法:

RUN command1
RUN command2
RUN command3

建议使用如下:

RUN command1 \
&& command2 \
&& command3

COPY

从上下文的对应路径拷贝文件到镜像中的对应路径

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

ADD

使用与COPY类似,官方推荐COPY,ADD有如下优缺点

ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

CMD

功能与RUN类似,但是时间点不一致

RUN:docker build时候执行
CMD:docker run时候执行

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖(COMMAND)。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

如果有多行CMD, 则只有最后一行生效

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

ENTRYPOINT

类似于CMD与RUN,不过不会被docker run所覆盖,只有在docker run指定--entrypoint时覆盖,此标签类似与开机自启动某些程序,当出现多个ENTRYPOINT时,只有最后一个生效,格式如下

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

可以搭配CMD使用,作为变参

FROM nginx
RUN echo 'test' > /home/test.text \
&& cd /home
COPY readme.md /home/readme.md
ENTRYPOINT [ "nginx",'-c']
CMD ["/etc/nginx/nginx.conf"]

如上,dockerfile在编译时会自动调用nginx -c /etc/nginx/nginx.conf启动nginx

当进行传参时COMMNAD,--endpoint时则会被指令中的参数覆盖

ENV

设置环境变量,可以在后续的操作中使用:$PARAM,格式如下:

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

ARG

与ENV类似,不过只在docker build的时候生效,

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

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

VOLUME

创建数据卷,用于挂在本地数据(不断改变或者变大的数据),例如数据库等,防止因容器异常导致数据丢失,减少容器的容量,格式如下:

VOLUME [“/data”]
VOLUME ["<路径1>", "<路径2>"...]

EXPOSE

对外暴露端口,方便互联,在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

EXPOSE <端口1> [<端口2>...]

WORKDIR

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

格式如下:

WORKDIR <工作目录路径>

可以多个WORKDIR,路径则为拼接,例如

WORKDIR a
WORKDIR b
WORKDIR c
# 工作目录为/a/b/c

USER

切换后续动作的用户、用户组,需保证当前存在用户或者用户组,格式如下:

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

ONBUILD

延迟执行,在其他dockcerfile FROM此镜像时会触发,格式如下:

ONBUILD <其它指令>

LABEL

添加元数据,以键值对形式展示

LABEL <key>=<value> <key>=<value> <key>=<value> ...

注意事项

1.当使用Dockerfile创建镜像后,创建新容器无法持续运行时,需要注意是否添加了ENDPOINT,并且执行的指令是否是阻塞的,可以使用如下方式实现阻塞

tail -f 执行的文件

2.当容器创建或者运行出现问题时,可以使用docker inspect 容器id 查看Logpath中的log位置查看log

总结

FROM:基于哪个镜像进行创建
RUN:docker build时执行命令,每调用一次则新建一层
COPY:从上下文路径拷贝对应文件到镜像中
ADD:与COPY类似都是拷贝文件,对于tar压缩包会自动解压
CMD:docker run时执行的命令,会被docker run的COMMAND参数所覆盖
ENTRYPOINT:创建镜像后进入容器执行相关指令,可以将CMD中的参数作为变参
ENV:设置环境变量值,方便后续直接取
ARG:设置值,但只在docker build时候生效
VOLUME:挂载磁盘卷,防止数据丢失,例如数据库等
EXPOSE:对外暴露端口,方便互联
WORKDIR:设置工作目录,会影响到后续操作
USER:切换用户组,会影响到后续操作
ONBUILD:当其他镜像FROM时执行指令

参考

菜鸟教程

docker教程

dockerfile操作的更多相关文章

  1. k8s版jenkins--master/slave模式实现CI/CD---带solo开源博客项目--带maven、djk、git工具

    k8s环境: 192.168.0.91 master 192.168.0.92 node 192.168.0.96 gitlab 192.168.0.98 harbor k8s集群安装请参照:http ...

  2. docker容器数据管理

    Docker容器数据卷 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume). 数据卷可以用来存储Docker应用的数据,也可以用来在Docke ...

  3. 创建Python数据分析的Docker镜像+Docker自定义镜像commit,Dockerfile方式解析+pull,push,rmi操作

    实例解析Docker如何通过commit,Dockerfile两种方式自定义Dcoker镜像,对自定义镜像的pull,push,rmi等常用操作,通过实例创建一个Python数据分析开发环境的Dock ...

  4. 9. Dockerfile 实际操作 (把 python app 打包成 image 并运行)

    1. 创建并进入 flask-hello-world mkdir flask-hello-world && cd flask-hello-world 2. 编写 python 文件 a ...

  5. blade-boot操作之Idea使用Mave和Dockerfile文件推送到harbor仓库

    mvn clean package docker:build 错误提示: Failed to execute goal com.spotify:docker-maven-plugin:1.1.0:bu ...

  6. 如何用Dockerfile创建镜像

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

  7. 分析Mysql 5.6的Dockerfile

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

  8. Docker dockerfile创建Eclipse镜像初试

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

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

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

随机推荐

  1. 溢出属性,定位,z-index,JS

    溢出属性 1.visible(默认值):使溢出内容展示 2.hidden:隐藏溢出内容且不出现滚动条 3.scroll:隐藏溢出容器的内容,溢出的内容可以通过滚动呈现 4.auto:与scroll没啥 ...

  2. 一条Sql的执行过程

    一条sql内部是如何执行的: 学习MySQL实战45专栏 sql中的内部执行图: 可以分为两部分:server和存储引擎 server层包含: 连接器.分析器.优化器.执行器,涵盖了MySQL大多数核 ...

  3. kernel 劫持seq_operations && 利用pt_regs

    kernel 劫持seq_operations && 利用pt_regs 劫持seq_operations进行栈迁移 seq_operations是一个大小为0x20的结构体,在打开/ ...

  4. python工具--获取盛科交换机端口模块类型,波长,传输距离等信息

    交换机端口模块信息对应的OID节点为各厂商私有节点,获取其他厂商信息需要把OID进行替换 1 #! /usr/bin/env python 2 #-*-coding:utf-8-*- 3 import ...

  5. CentOS下安装与配置Maven

    安装Maven 当前系统 [root@141 ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 下载 http://ma ...

  6. MySql笔记Ⅱ

    MySql笔记2: part3:(table相关的操作) 数据的增删改 create table t1( id int primary key auto_increment, username cha ...

  7. android系统中有哪些日志

    日志目录 android系统中还有很多常用的日志目录.我们可以通过adb命令把这些日志信息提取出来. data/system/dropbox data/system/usagestats data/s ...

  8. 技术分享 | app自动化测试(Android)--高级定位技巧

    原文链接 XPath高级定位技巧 XPath 简介 XPath 的英文全称为:XML Path Language,意旨对 XML 中的元素进行路径定位的一种语言,它可适用 XML 标记语言,Html ...

  9. NHibernte 4.0.3版本中,使用Queryover().Where().OrderBy().Skip().Take()方法分页获取数据失败

    问题代码如下: var result=repository.QueryOver<modal>() .Where(p=>p.Code==Code) .OrderBy(p=>p.I ...

  10. 论文解读(SR-GNN)《Shift-Robust GNNs: Overcoming the Limitations of Localized Graph Training Data》

    论文信息 论文标题:Shift-Robust GNNs: Overcoming the Limitations of Localized Graph Training Data论文作者:Qi Zhu, ...