『中级篇』Dockerfile详解(17)
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
####官网学习
https://docs.docker.com/engine/reference/builder/#usage
####FROM
必须为第一个命令,指定基础镜像
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
FROM scratch #制作base Image
FROM centos #使用base Image
FROM centos:7.9
FROM mysql:5.6
尽量使用官方的image作为base image!那是经得起考验的!
####LABEL
给镜像添加信息。使用docker inspect可查看镜像的相关信息
LABEL maintainer="394498036@qq.com"
LABEL version="1.0"
LABEL description="This is description \
欢迎关注:编程坑太多,我在等你."
其实就类似咱们写代码的注释,很多人写代码不愿意写注释,其实写注释对自己的负责,过段时间翻坑的时候,想想当初的意思,容易很快的解决,所以一定要写LABEL
####RUN
构建镜像时执行的命令
RUN yum update && yum install -y vim \ python-dev #反斜线换行
RUN apt-get update && apt-get install -y perl \pwgen --no-install-recommends && rm -rf \/var/lib/apt/lists/* #注意清理cache
RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'
为了美观,复杂的RUN请用反斜线换行,避免无用分层,合并多条命令成一行!
####WORKDIR
工作目录
WORKDIR /test #如果没有会自动创建test目录 WORKDIR jianshu RUN pwd #输出结果应该是/test/jianshu
用WORKDIR,不要用RUN cd 尽量使用绝对目录!
####ADD and COPY
- 将本地文件添加到容器中,identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压
- 同ADD,只是不会解压文件。
ADD <src>... <dest> ADD ["<src>",... "<dest>"] 用于支持包含空格的路径 COPY <src>... <dest> COPY ["<src>",... "<dest>"] 用于支持包含空格的路径
ADD hello / ADD test.tar.gz / #添加到根目录并解压 WORKDIR /root ADD hello test/ # /root/test/hello
WORKDIR /root
COPY hello test/ # /root/test/hello
大部分情况,COPY优于ADD,ADD除了COPY还有额外功能(解压缩)!添加远程文件/目录请使用curl 或者wget
####ENV
设置环境变量
ENV <key> <value>
ENV <key>=<value> ...
ENV MYSQL_VERSION 5.6
E-NV apt-get install -y mysql-server = "${MYSQL_VERSION}" \
&& rm -rf /var/lib/apt/lists/* #引用常亮
尽量多使用,减少维护成本!
学习下面的先了解下
Shell 和Exec 格式
- Shell格式
RUN apt-get install -y vim CMD echo "hello docker 微信公众号:编程坑太多" ENTRYPOINT echo "hello docker 微信公众号:编程坑太多"
- Exec格式
RUN ["apt-get", "install", " -y", "vim"] CMD ["/bin/echo","hello docker 微信公众号:编程坑太多"] ENTRYPOINT ["/bin/echo","hello docker 微信公众号:编程坑太多"]
- Dockerfile1
FROM centos ENV name Docker ENTRYPOINT echo "hello $name"
- Dockerfile2
FROM centos ENV name Docker ENTRYPOINT ["/bin/echo", "hello $name"]
通过实际的例子查看区别。
mkdir cmd-entrrypoint cd cmd-entrrypoint/ vi Dockerfile
- 先执行Dockerfile1
more Dockerfile
docker build -t liming/centos-entrypoint-shell .
docker run liming/centos-entrypoint-shell
- 先执行Dockerfile2
more Dockerfile
docker build -t liming/centos-entrypoint-exec .
docker run liming/centos-entrypoint-exec
我们通过shell格式运行的话,它会通过默认的bash里面通过shell执行命令,它会通过shell替换这边变量,通过exec格式运行的话,只是单纯的执行echo,没办法帮我们替换到$name。如何解决不一样的问题呢?请开始我的表演!修改Dockerfile2
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash","-c", "echo hello $name"]
docker build -t liming/centos-entrypoint-exec-new .
docker run liming/centos-entrypoint-exec-new
是不是很nice!
####CMD
设置容器启动后默认执行的命令和参数
- 容器启动时默认执行的命令
- 如果docker run 指定了其他命令,CMD命令被忽略
- 如何定义了多个CMD,只有最后一个会执行
FROM centos
ENV name Docker
CMD echo "hello $name"
docker build -t liming/centos-cmd-shell .
docker run liming/centos-cmd-shell
docker run -it liming/centos-cmd-shell /bin/bash
####ENTRTYPOINT
设置容器启动时运行的命令
- 让容器以应用程序或者服务的形式运行
- 不会被忽略,一定会执行
FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"
docker build -t liming/centos-entrypoint-shell .
docker run liming/centos-entrypoint-shell
docker run -it liming/centos-entrypoint-shell /bin/bash
个人网站:IT人故事会 idig8.com
PS:Dockerfile详解基本就介绍这么多,可能还有很多命令没有讲解,以后用到了在说吧。一定要CMD和ENTRTYPOINT因为很多官方的都常用这两个命令。
往期精彩
- docker导学(一)
- 容器的技术概述(二)
- docker的魅力初体验-5分钟安装wordpress不走弯路(三)
- docker官网介绍(四)
- 如何在mac上安装docker(五)
- 如何在window上安装docker(六)
- 如何在mac上通过vagrant安装虚拟机(七)
- 如何在window上通过vagrant安装虚拟机(八)
- docker-Machine的本地使用(九)
- docker-Machine的本地使用(十)
- 在linux/mac下通过Docker-Machine在阿里云上的使用(11)
- docker架构和底层技术(12)
- docker Image概述(13)
- 手动建立一个base Image(14)
- 什么是Container(15)
- 构建自己的Docker镜像(16)
转载于:https://blog.51cto.com/12040702/2154833
『中级篇』Dockerfile详解(17)相关推荐
- linux网络命名空间详解,『中级篇』 Linux网络命名空间(25)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』 Linux网络命名空间(25) docker底层技术,非常重要的关于namespace,network的names ...
- 『中级篇』docker-swarm创建一个多节点集群(43)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker-swarm创建一个多节点集群(43) docker Swarm是Docker官方提供的一款集群管理工具 ...
- 『中级篇』docker企业版本地安装之UCP(57)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker企业版本地安装之UCP(57) 安装虚拟机,准备安装docker ee,源码:https://githu ...
- 『中级篇』docker之CI/CD持续集成-项目生成镜像(76)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之CI/CD持续集成-项目生成镜像(76) 开始想用docker registry做私有镜像库,后来放弃 ...
- 『中级篇』Docker Cloud自动构建 Docker image(55)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』Docker Cloud自动构建 Docker image(55) 一步一步的接近下面这个图,来通过时间的方式git ...
- 『中级篇』docker Image概述(13)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker Image概述(13) 什么是镜像,镜像是怎么产生的,通过这节的学习的Docker container ...
- 『中级篇』docker容器安装wordpress(37)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker容器安装wordpress(37) 第一节的时候我就部署过wordpress,可能很多老铁一头雾水不知道 ...
- 『中级篇』k8s基础网络Cluster Network(66)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』k8s基础网络Cluster Network(66) 通过国人大神的一键安装k8s集群安装了3个master节点和3 ...
- 『中级篇』Minikube快速搭建K8S单节点环境(61)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』Minikube快速搭建K8S单节点环境(61) 去介绍k8s的集群安装,本地搭建一个k8s的集群. 不会科学上网的 ...
最新文章
- IOS开发笔记3-C语言基础复习
- 值得向IOS学习的15个APP设计技巧!
- 在CesiumVR基础上实现3D左右立体视觉
- 五十、opencv调用USB摄像头并保存图片
- uva 10692——Huge Mods
- 1119. Pre- and Post-order Traversals (30)
- java 蓝桥杯算法训练 求完数(题解)
- python怎么背景实现循环_在Python的一段程序中如何使用多次事件循环详解
- log4c移植到android,使用Android Studio调用C++ 代码-log4cplus
- 有关vi(vim)的常用命令
- Moss 2007 升级到 Moss2010 成功但界面仍然保持07?
- windows10应用商店加速方法
- vue 读取 txt
- PostgreSQL12.2_cn.chm 中文手册 最新版
- NtripShare OpenSource/NtripShare GNSS共享计划 -- JT808终端模拟器源码(四)
- 在Python中如何方便的制作个性化的词云图
- pycharm 如何配置主题背景色 墨绿色
- 安卓自定义view之——可滑动时间轴(时间刻度尺)
- Html主要内容总结
- 100美元哪里去了?
热门文章
- 数据库---分组查询
- 黑客宣言_情感设计宣言
- 若川的2018年度总结,平淡无奇
- 面试官问:能否模拟实现JS的new操作符(高频考点)
- URLScan工具配置方法第1/2页
- ORA-01400: 无法将 NULL 插入 (CHARGE_WQRL.SF_JMQTFY_T.BH)
- 【jQuery系列之插件】jQuery插件---exselect实现联动
- 一键安装lamp脚本--初级版
- C/C++ 读取16进制文件
- python下载安装搭建