简介

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. 提升站点SEO的7个建议

    1.使用HTTPS 谷歌曾发公告表示,使用安全加密协议(HTTPS),是搜索引擎排名的一项参考因素. 所以,在域名相同情况下,HTTPS站点比HTTP站点,能获得更好的排名. 在网络渠道分发或合作上, ...

  2. C语言复习_01

    auto 存储类是所有局部变量默认的存储类,auto 只能用在函数内,即 auto 只能修饰局部变量. { int mount; auto int month; } register存储类用于定义存储 ...

  3. JavaSE_关键字 接口 代码块 枚举

    1 Java中的关键字 1.1 static关键字 static特点 : 静态成员被所在类的所有对象共享 随着类的加载而加载 , 优先于对象存在 可以通过对象调用 , 也可以通过类名调用 , 建议使用 ...

  4. 手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生产级系统(一) - 介绍

    项目简介 novel 是一套基于时下最新 Java 技术栈 Spring Boot 3 + Vue 3 开发的前后端分离的学习型小说项目,配备详细的项目教程手把手教你从零开始开发上线一个生产级别的 J ...

  5. 优秀开源平台,前后端分离快速开发平台,一站式多端开发(PC+APP)

    JNPF平台架构介绍 JNPF快速开发平台采用前后端分离技术.采用B/S架构开发,形成一站式开发多端(APP+PC)使用. PC端版本介绍 第一个当然是当下热门的.net core了,运行环境为Vis ...

  6. 一些有趣的B+树优化实验

    作为目前数据库引擎的两种主要数据结构,LSM-tree和B+-tree在业界已经有非常广泛的研究.相比B+-tree,LSM-tree牺牲一定的读性能以换取更小的写放大以及更低的存储成本,但这必须建立 ...

  7. JS:函数的形参与实参

    形参: 函数显式参数在函数定义时列出. 函数调用未传参时,参数会默认设置为: undefined. function fn(a,b,c){ //a,b,c为形参 //此时有一个隐式操作:var a,v ...

  8. 搭建uipath

    我对windows也不太熟,也是第一次安装Uipath Orchestrator,希望有问题指出一起交流,可以留言,Uipath中文qq交流群:4656303241. 下载镜像 windows ser ...

  9. sql-DCL用户及权限管理及其他常用命令-oracle

    DCL 用户管理 创建用户 create user 用户名 identified by 密码; 在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限 ...

  10. python做小游戏——做个马里奥分分钟解决

    一.前言 嗨喽,大家好呀!这里是小熊猫 在你的童年记忆里,是否有一个蹦跳.顶蘑菇的小人已经被遗忘? 马里奥是靠吃蘑菇成长,闻名世界的超级巨星.特征是大鼻子.头戴帽子.身穿背带工作服.还留着胡子.帽子加 ...