简介

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. 字符编码,存储引擎,MySQL字段类型,MySQL字段约束条件

    字符编码 查看MySQL默认编码命令:\s """ 如果是5.X系列 显示的编码有多种 latin1 gbk 如果是8.X系列 显示的统一是utf8mb4 utf8mb4 ...

  2. Sharding JDBC案例实战

    基础分库 以下实例基于shardingsphere 4.1.0 + SpringBoot 2.2.5.RELEASE版本 依赖导入: <properties> <project.bu ...

  3. 交互式 .Net 容器版

    背景介绍 在之前的文章 - 交互式 .Net 中已经介绍了什么是交互式 .Net,文中是通过 Visual Studio Code 插件的方式实现交互式 .Net 的.现在,我们将使用容器的方式实现交 ...

  4. 【算法】插入排序(Insertion Sort)(三)

    插入排序(Insertion Sort) 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相 ...

  5. 记 iTextSharp 提取中文的问题

    原文 问题 下面的代码中 currentText 能提取到大部分汉字 但是字体为 Non-Embedded Font: AdobeSongStd-Light(Horizontal) 的汉字提取不到 P ...

  6. veeambackup通过虚拟机还原系统文件操作说明

    如何从 VeeamBackup Replication 从备份中提取文件恢复到本地.当我们的服务器中误操作删除了一些文件特别是共享文件,文件被删除后往往都是几个小时或者几天后才被发现.特别是文件服务器 ...

  7. MongoDB 分片集群

    每日一句 Medalist don't grow on trees, you have to nurture them with love, with hard work, with dedicati ...

  8. 一些实验中用过的python函数/方法(持续更新)

    衡量运行时间 很多时候你需要计算某段代码执行所需的时间,可以使用 time 模块来实现这个功能. import time startTime = time.time() # write your co ...

  9. php判断客户端浏览器类型

    /** * 判断浏览器名称和版本 */ function get_user_browser() { if (empty($_SERVER['HTTP_USER_AGENT'])) { return ' ...

  10. Apache ShardingSphere 5.1.2 发布|全新驱动 API + 云原生部署,打造高性能数据网关

    在 Apache ShardingSphere 5.1.1 发布后,ShardingSphere 合并了来自全球的团队或个人的累计 1028 个 PR,为大家带来 5.1.2 新版本.该版本在功能.性 ...