简介

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. 解读先电2.4版 iaas-install-mysql.sh 脚本

    #!/bin/bash #声明解释器路径 source /etc/xiandian/openrc.sh #生效环境变量 ping $HOST_IP -c 4 >> /dev/null 2& ...

  2. 【mq】从零开始实现 mq-10-消费者拉取消息回执 pull message ack

    前景回顾 [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]从零开始实现 mq-02-如何实现生产者调用消费者? [mq]从零开始实现 mq-03-引入 broker 中间人 [mq]从零 ...

  3. RabbitMQ 3.9( 续 )

    前言 基础篇链接:https://www.cnblogs.com/xiegongzi/p/16229678.html 3.9.延迟队列 - 重要 3.9.1.延迟队列概念 这个玩意儿要表达的意思其实已 ...

  4. 一个NIH综合症患者的自白

    一个NIH综合症患者的自白 欢迎关注我的博客,️点他即可. NIH: Not Invented Here 当人们看到一款产品或者任何涉及创意的东西时,常常会有一个想法--这是抄的.也就是说它并非原创, ...

  5. spring 配置文件 --bean

    bean标配的基本配置        id:Bean实例在Spring容器中的唯一标识        class Bean的全限定名        scope            1.当scope的 ...

  6. python常用标准库(时间模块 time和datetime)

    常用的标准库 time时间模块 import time time -- 获取本地时间戳 时间戳又被称之为是Unix时间戳,原本是在Unix系统中的计时工具. 它的含义是从1970年1月1日(UTC/G ...

  7. pycharm编辑器下载与安装

    pycharm编辑器下载与安装 首先是下载地址:https://www.jetbrains.com/pycharm/download/#section=windows   首先根据自己的电脑选择系统, ...

  8. c++ 关于二分的STL 详解

    一.解释 以前遇到二分的题目都是手动实现二分,不得不说错误比较多,关于返回值,关于区间的左闭右开等很容易出错,最近做题发现直接使用STL中的二分函数方便快捷还不会出错,不过对于没有接触过的同学,二分函 ...

  9. 【Redis】客观下线

    在sentinelHandleRedisInstance函数中,如果是主节点,需要做如下处理: void sentinelHandleRedisInstance(sentinelRedisInstan ...

  10. 前端学习 linux —— 第一篇

    前端学习 linux - 第一篇 本文主要介绍"linux 发行版本"."cpu 架构"."Linux 目录结构"."vi 和 v ...