简介

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. Django学习——分页器基本使用、分页器终极用法、forms组件之校验字段、forms组件之渲染标签、forms组件全局钩子,局部钩子

    内容 1 分页器基本使用 2 分页器终极用法 3 forms组件之校验字段 1 前端 <!DOCTYPE html> <html lang="en"> &l ...

  2. mysql allow remote host

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEG ...

  3. spring-boot rest controller 使用枚举作为参数,重写反序列化实现任意值转枚举类型

    目录 BaseEnum MyEnum StringToEnumConverterFactory FormatterConfig DTO RestController 参考 BaseEnum packa ...

  4. [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用

    ​使用Docker容器方案可以快速安全地将项目部署到客户的服务器上,作为公司项目,需要解决两个问题: 1. 需要搭建一个私有的Docker仓库,以便安全的存储镜像 2. 需要一套自动化发布方案,实现代 ...

  5. Java开发学习(三)----Bean基础配置及其作用范围

    一.bean基础配置 对于bean的基础配置如下 <bean id="" class=""/> 其中,bean标签的功能.使用方式以及id和clas ...

  6. 谷歌浏览器Chrome官方下载地址

    经常看到朋友的电脑上安装是魔改的谷歌浏览器.这里将谷歌浏览器官方的下载地址放在这里.有需要的朋友可以自己去下载. 下载地址 Chrome最新稳定在线安装版:https://www.google.cn/ ...

  7. 编程技巧│浏览器 Notification 桌面推送通知

    目录 一.什么是 Notification 二.弹窗授权 三.弹窗使用 四.浏览器支持检测 五.授权回调 六.3秒后关闭弹窗 一.什么是 Notification Notification 是浏览器最 ...

  8. Hexo + VSCode 插入 Markdown 图片解决办法

    最近打开 typora 时发现弹窗强更,不让用 beta 版了 想到自己并不是非常需要 WYSIWYG,而且也不是经常使用 typora,于是直接退回到 VSCode 了,而且在 VSCode 里可以 ...

  9. ThreadLocal的简单理解

    目录 一.背景 二.ThreadLocal解决的问题 三.如何创建一个ThreadLocal实例 四.ThreadLocal如何做到线程变量隔离 1.理解3个类 2.看下set方法是如何实现的 3.看 ...

  10. CesiumJS 2022^ 源码解读[6] - 三维模型(ModelExperimental)新架构

    目录 1. ModelExperimental 的缓存机制 1.1. 缓存池 ResourceCache 1.2. 缓存对象的键设计 ResourceCacheKey 2. 三维模型的加载与解析 2. ...