Dockerfile 详解

Dockerfile是自定义Docker镜像的一套规则,由多条指令构成,每条指令都会对应于Docker镜像中的每一层,因为Docker是分层存储的。以下是Dockerfile中各个参数的详解及演示解析:

1. FROM

  • 功能:指定待扩展的父级镜像(基础镜像)。除了注释以外,文件开头必须是一个FROM指令,接下来的指令便在这个父级镜像的环境中运行,直到遇到下一个FROM指令。通过添加多个FROM命令,可以在同一个Dockerfile文件中创建多个镜像。

  • 示例FROM centos:7

2. MAINTAINER(已废弃,建议使用LABEL)

  • 功能:声明创建的镜像的作者信息(用户名、邮箱)。非必须,但在某些情况下有助于了解镜像的来源和维护者。
  • 格式MAINTAINER <AUTHOR_NAME>
  • 示例MAINTAINER xiaoli
  • 注意:Docker官方推荐使用LABEL指令代替MAINTAINER来指定镜像的元数据。

3. LABEL

  • 功能:为镜像指定标签,可以包含多个键值对。
  • 格式LABEL <key>=<value> <key>=<value> ...
  • 示例
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"

4. RUN

  • 功能:用来修改镜像的命令,常用来安装库、程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来的指令会在新的镜像上继续执行。

  • 格式

    • RUN <command>(在/bin/sh环境中执行的指令)
    • RUN ["executable", "param1", "param2"](直接使用系统调用exec来执行)
  • 示例

RUN yum -y install httpd
RUN ["yum", "install", "nginx"]

5. EXPOSE

  • 功能:用来指明容器内进程对外开放的端口,多个端口之间使用空格隔开。运行容器时,通过参数-P(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,其他容器或主机就可以通过映射后的端口与此容器通信。
  • 格式EXPOSE <port> [<port>/<protocol>...]
  • 示例EXPOSE 80 443

6. ADD 与 COPY

  • ADD:向新镜像中添加文件,这个文件可以是一个主机文件、一个网络文件或一个文件夹。如果源文件是主机上zip或tar形式的压缩文件,Docker会先解压缩,然后将文件添加到镜像的指定位置。如果源文件是一个通过URL指定的网络压缩文件,则不会解压。

  • COPY:从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>。COPY指令不会解压压缩文件,但会保留原文件的基本信息(如读、写、执行权限、文件变更时间等)。

  • 格式

    • ADD <source> <destination>
    • COPY <source> <destination>
  • 示例

ADD httpd-2.4.tar.gz /usr/local/
COPY index.html /usr/share/nginx/html/

7. VOLUME

  • 功能:在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个容器可以来自主机或者其它容器。多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍然可以访问。
  • 格式VOLUME ["/data"]
  • 示例VOLUME /data

8. WORKDIR

  • 功能:为接下来执行的指令指定一个新的工作目录,这个目录可以是绝对目录,也可以是相对目录。根据需要,WORKDIR可以被多次指定。当启动一个容器时,最后一条WORKDIR指令所指的目录将作为容器运行的当前工作目录。
  • 格式WORKDIR <dirpath>
  • 示例
WORKDIR /opt

9. ENV

  • 功能:设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量。
  • 格式ENV <key> <value>ENV <key>=<value>
  • 示例
ENV MYSQL_USER docker_user
ENV MYSQL_PASS docker_password

10. CMD

  • 功能:用来设置启动容器时默认运行的命令。Dockerfile中可以写多个CMD指令,但只有最后一个生效。CMD会被docker run之后的参数替换。

  • 格式

    • CMD ["executable","param1","param2"](推荐使用)
    • CMD command param1 param2(在/bin/sh中执行)
    • CMD ["param1","param2"](提供给ENTRYPOINT的默认参数)
  • 示例

CMD ["python", "app.py"]

11. ENTRYPOINT

  • 功能:与CMD类似,也是用来指定容器启动时的默认运行的命令。区别在于,运行容器时添加在镜像之后的参数,对ENTRYPOINT是拼接,CMD是覆盖。
  • 格式ENTRYPOINT ["executable", "param1", "param2"]
  • 示例
ENTRYPOINT ["curl", "-s", "https://ip.cn"]

12. USER

  • 功能:为容器的运行及接下来RUN、CMD、ENTRYPOINT等指令的运行指定用户或UID。
  • 格式USER <username>USER <UID>
  • 示例USER xiaoli

13. ONBUILD

  • 功能:触发器指令。构建镜像时,Docker的镜像构建器会将所有的ONBUILD指令指定的命令保存到镜像的元数据中,这些命令在当前镜像的构建过程中并不会执行。只有新的镜像使用FROM指令指定父镜像为这个镜像时,便会触发执行。
  • 格式ONBUILD <INSTRUCTION>
  • 示例
ONBUILD ADD ./app/src /app/src

Dockerfile图解

在这里插入图片描述

演示解析

1.以下是一个简单的Dockerfile示例,用于构建一个包含httpd应用的Docker镜像:
# 使用官方的CentOS7作为基础镜像
FROM centos:7# 维护者信息
MAINTAINER xwey# 设置环境变量
ENV PATH="/usr/local/nginx/sbin:$PATH"# 将本地nginx的tar包复制到容器中,ADD模块会自动解压tar包
ADD nginx-1.16.1.tar.gz /usr/local/# 删除原有yum源,安装ali源,安装编译软件
RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo && yum install -y epel-release.noarch && yum install -y gcc gcc-c++ make openssl-devel pcre-devel && yum clean all# 创建nginx用户设置不可登录
RUN useradd -s /sbin/nologin -M nginx# 和cd一样,进入解压后的nginx目录
WORKDIR /usr/local/nginx-1.16.1# 编译nginx
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-pcre && make && make install && rm -rf /usr/local/nginx-1.16.1# 暴露nginx应用默认端口
EXPOSE 80# 启动nginx
CMD ["nginx","-g","daemon off;"]# 使用build -t 打标签 (定义版本)
[root@docker ~]# docker build -t nginx:v1 .
[root@docker ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED             SIZE
nginx           v1        188f961b7cf5   2 hours ago         367MB
centos          7         eeb6ee3f44bd   3 years ago         204MB
2.使用Dockerfile创建httpd镜像
# 文件清单
[root@docker ~]# tree apache_centos/
apache_centos/
├── Dockerfile
├── httpd-2.4.41.tar.gz
└── run.sh# 创建run.sh
[root@docker apache_centos]# cat run.sh 
#!/bin/bash
/usr/local/apache2/bin/httpd -D FOREGROUND# 准备Dockerfile
[root@docker apache_centos]# cat Dockerfile 
# 使用官方的CentOS7作为基础镜像
FROM centos:7# 维护者信息
MAINTAINER xwey# 删除原有yum源,配置ali源,安装编译软件
RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo && yum install -y gcc make apr-devel apr apr-util apr-util-devel pcre-devel && yum clean all# 将本地下载好的httpd的tar包传入镜像
ADD httpd-2.4.41.tar.gz /usr/local/src/# 将本地创建的启动脚本传入镜像
ADD run.sh /usr/local/sbin/run.sh# 和cd一样,进入解压后的目录
WORKDIR /usr/local/src/httpd-2.4.41# 开始编译,修改httpd配置文件,给启动文件加上执行权限
RUN ./configure --prefix=/usr/local/apache2 --enable-mods-shared=most --enable-so && make && make install && rm -rf /usr/local/src/* && sed -i 's/#ServerName www.example.com:80/ServerName localhost:80/g' /usr/local/apache2/conf/httpd.conf && /usr/local/apache2/bin/httpd && chmod 755 /usr/local/sbin/run.sh# 暴露httpd默认端口
EXPOSE 80# 启动上传的脚本
CMD ["/usr/local/sbin/run.sh"]# 使用build -t 打标签 (定义版本)
[root@docker ~]# docker build -t apache:v1 .
[root@docker ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED             SIZE
apache          v1        d6d9554494ab   About an hour ago   377MB
nginx           v1        188f961b7cf5   2 hours ago         367MB
centos          7         eeb6ee3f44bd   3 years ago         204MB# 启动测试
[root@docker ~]# docker run -d -p 8111:80 apache:v1 /usr/local/sbin/run.sh
[root@docker ~]# curl 192.168.73.128:8111
<html><body><h1>It works!</h1></body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sass学习笔记(1.0)

1.使用变量 sass可以像声明变量那样进行使用&#xff0c;这样同样的样式&#xff0c;就可以使用相同的变量来提高复用。 语法为&#xff1a;$ 变量名 在界面中也可以正常的显示 当然了&#xff0c;变量之间也可以相互引用&#xff0c;比如下面 div{$_color: #d45387;$BgColo…

用C++编写信息管理系统(歌单信息管理)

C语言是面向过程的编程语言&#xff0c;而C是面向对象的编程语言&#xff0c;在书写代码时风格有所不同&#xff08;也存在很多共性&#xff09;。 程序说明 本次系统程序使用的是C语言进行编写&#xff0c;主要考虑怎么实现面向对象的问题。 因为本次程序属于小型系统程序&…

多元线性回归:机器学习中的经典模型探讨

引言 多元线性回归是统计学和机器学习中广泛应用的一种回归分析方法。它通过分析多个自变量与因变量之间的关系&#xff0c;帮助我们理解和预测数据的行为。本文将深入探讨多元线性回归的理论背景、数学原理、模型构建、技术细节及其实际应用。 一、多元线性回归的背景与发展…

2024免费mac苹果电脑清理垃圾软件CleanMyMac X4.15.8

对于苹果电脑用户来说&#xff0c;设备上积累的垃圾文件可能会导致存储空间变得紧张&#xff0c;影响电脑的性能和使用体验。尤其是那些经常下载和安装新应用、编辑视频或处理大量照片的用户&#xff0c;更容易感受到存储空间的压力。面对这种情况&#xff0c;寻找一种有效的苹…

计组_中断响应的步骤

2024.10.13&#xff1a;计算机组成原理学习笔记 中断响应步骤 中断响应 &#xff08;中断响应的过程也称中断隐指令&#xff09;第一步&#xff1a;关中断第二步&#xff1a;保存断点第三步&#xff1a;引出中断服务程序中断源识别判优方法1&#xff1a;软件查询方法中断源识别…

74.【C语言】文件操作(1)

目录 1.进行文件操作的原因 销毁的示例 2.文件的类型 1.操作文件的步骤 2.文件名 3.查看文件路径的方法 方法1 方法2 方法3 4.数据文件的介绍 举例 ① ASCII码的形式(即字符形式)存储 ②二进制形式存储 理解"不加转换"的含义 1.进行文件操作的原因 为…

maven加载依赖成功但是引入import不了包,注解报错

突然就复现不出来了&#xff0c;奇了怪了&#xff0c;简单说一下吧&#xff0c;就是模块里引入了SpringBoot Test那个依赖然后&#xff0c; 这个地方是显示引入成功的&#xff0c;但是 这个包下没有&#xff0c;导致我SpringBootTest一直出不来&#xff0c;就找不到这个包下的注…

Qt事件——鼠标事件

通过label来显示各种事件 鼠标按下事件 //按下显示坐标 void MyLabel::mousePressEvent(QMouseEvent * ev) {int i ev->x();int j ev->y();//判断按下的鼠标键位if (ev->button() Qt::LeftButton) {qDebug() << "LeftButton";}else if (ev->bu…

Elasticsearch学习笔记(六)使用集群令牌将新加点加入集群

随着业务的增长&#xff0c;陆续会有新的节点需要加入集群。当我们在集群中的某个节点上使用命令生成令牌时会出现报错信息。 # 生成令牌 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node出现报错信息&#xff1a; Unable to create enrollment…

开源商城系统crmeb phpstudy安装配置

BOSS让我最快时间部署一套开源商场系统&#xff0c;今天就以crmeb为例。 快速部署在linux中我会首选docker&#xff0c;因为我要在windows中部署&#xff0c;本文就选用phpstudy集成环境做了。 什么是crmeb 我从官网摘点&#xff1a; CRMEB产品与服务 CRMEB通过将CRM&#x…

NFT Insider #151:The Sandbox 推出 Alpha 第4季;腾讯或将收购育碧

市场数据 加密艺术及收藏品新闻 Beeple 将于 11 月在南京德基美术馆举办个人首展 著名数字艺术家 Beeple 近日在X平台发布视频&#xff0c;宣布将于 2024 年 11 月 14 日在南京德基美术馆举办个人首次展览&#xff0c;名为《Beeple&#xff1a;来自合成未来的故事》。该展览将…

Django的请求与响应

Django的请求与响应 1、常见的请求2、常见的响应3、案例 1、常见的请求 函数的参数request是一个对象&#xff0c;封装了用户发送过来的所有请求相关数据。 get请求一般用来请求获取数据&#xff0c;get请求也可以传参到后台&#xff0c;但是传递的参数显示在地址栏。 post请求…

[自然语言处理]RNN

1 传统RNN模型与LSTM import torch import torch.nn as nntorch.manual_seed(6)# todo:基础RNN模型 def dem01():参数1&#xff1a;input_size 每个词的词向量维度&#xff08;输入层神经元的个数&#xff09;参数2&#xff1a;hidden_size 隐藏层神经元的个数参数3&#xff1a…

物联网:一种有能力重塑世界的技术

物联网&#xff08;IoT&#xff09;近年来对我们的日常生活产生了如此积极的影响&#xff0c;以至于即使是不懂技术的人也开始相信它所带来的便利以及敏锐的洞察力。 物联网是一场数字技术革命&#xff0c;其意义甚至比工业革命更为重大。物联网是仍处于起步阶段的第四次工业革…

前端开发笔记--html 黑马程序员2

文章目录 前端常用标签一、标题标签二、段落标签和换行标签和水平线标签三、文本格式化标签![请添加图片描述](https://i-blog.csdnimg.cn/direct/87583fa23fe04229b016912051f3fc45.png)四、盒子标签五、图像标签六、连接标签七、注释和特殊字符 八、表格标签的基本使用九、列…

自动化运维:提升效率、降低风险的利器

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

如何批量从sql语句中提取表名

简介 使用的卢易表 的提取表名功能&#xff0c;可以从sql语句中批量提取表名。采用纯文本sql语法分析&#xff0c;无需连接数据库&#xff0c;支持从含非sql语句的文件文件中提取&#xff0c;支持各类数据库sql语法。 特点 快&#xff1a;从成百个文件中提取上千个表名只需1…

离岗睡岗预警系统 值班室离岗识别系统Python 结合 OpenCV 库

在众多工作场景中&#xff0c;存在着一些特殊岗位&#xff0c;这些岗位对于人员的专注度和警觉性有着极高的要求。然而&#xff0c;离岗睡岗现象却时有发生&#xff0c;给工作的正常开展和安全保障带来了严重的威胁。本文将深入探讨特殊岗位离岗睡岗的危害&#xff0c;以及如何…

Ubuntu安装Apache教程

系统版本&#xff1a;Ubuntu版本 23.04 Ubuntu是一款功能强大且用户友好的操作系统&#xff0c;而Apache是一款广泛使用的Web服务器软件。在Ubuntu上安装Apache可以帮助用户搭建自己的网站或者进行Web开发。为大家介绍如何在Ubuntu上安装Apache&#xff0c;并提供详细的教程和操…