Dockerfile 详解

news2024/12/28 21:47:39

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.coloradmin.cn/o/2212449.html

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

相关文章

JavaScript 访问者模式:打造高扩展性的对象结构

一. 前言 在面向对象编程中&#xff0c;访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为设计模式&#xff0c;它允许我们向现有的类结构添加新的操作&#xff0c;而无需修改这些类。这对于需要对类层次结构中的元素进行复杂算法处理的场景非常有用。 本文将详细…

【硬件模块】HC-08蓝牙模块

蓝牙模块型号 HC-08蓝牙模块实物图 HC-08蓝牙模块引脚介绍 STATE&#xff1a;状态输出引脚。未连接时&#xff0c;则为低电平。连接成功时&#xff0c;则为高电平。可以在程序中作指示引脚使用&#xff1b; RXD&#xff1a;串口接收引脚。接单片机的 TX 引脚&#xff08;如…

多线程(三):线程等待获取线程引用线程休眠线程状态

目录 1、等待一个线程&#xff1a;join 1.1 join() 1.2 join(long millis)——"超时时间" 1.3 join(long millis&#xff0c;int nanos) 2、获取当前线程的引用&#xff1a;currentThread 3、休眠当前进程&#xff1a;sleep 3.1 实际休眠时间 3.2 sleep的特殊…

Canvas:AI协作的新维度

在人工智能的浪潮中&#xff0c;OpenAI的最新力作Canvas&#xff0c;不仅是一款新工具&#xff0c;它标志着人工智能协作方式的一次革命性飞跃。Canvas为写作和编程提供了一个全新的交互界面&#xff0c;让用户能够与ChatGPT进行更紧密、更直观的协作。 ​​​​​​​ Canvas的…

LeetCode 面试经典150题 Z字形变换

题目&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你…

无人机无线电侦测核心技术详解

无人机无线电侦测核心技术主要涉及频谱分析、信号处理、定位技术以及智能化识别等多个方面。以下是对这些核心技术的详细解析&#xff1a; 1. 频谱分析技术 频谱探测技术&#xff1a;通过分析信号在频域上的分布和特性&#xff0c;来识别、测量和定位无线电信号。在无人机侦测…

leetcode 491.非递减子序列

1.题目要求: 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情况。 …

Python | Leetcode Python题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; class Solution:def totalHammingDistance(self, nums: List[int]) -> int:n len(nums)ans 0for i in range(30):c sum(((val >> i) & 1) for val in nums)ans c * (n - c)return ans

BUUCTF-Business Planning Group1

下载是一张PNG图片&#xff0c; 使用010editor打开发现尾部有隐藏文件 把这段16进制字符串复制到新文件并改名为1.bpg 使用bpgviewer软件查看 Release Simple BPG Image viewer asimba/pybpgviewer GitHub Notes: large images will be scaled to fit screen areabasic s…

[单master节点k8s部署]40.安装harbor

harbor 是私有镜像仓库&#xff0c;用来存储和分发镜像的 。docker 还有一个官方的镜像仓库 docker hub&#xff0c;免费用户只能简单的使用&#xff0c;创建一个私有镜像仓库&#xff0c;存储镜像&#xff0c;付费用户才可以拥有更多权限&#xff0c;默认 docker pull 拉取镜像…

nginx搭建视频下载站

目录 1.前言与介绍 2.atuoindex模块介绍 3.主要的功能 4.下载站基本要求 5.具体配置 6.做完如上的配置重载服务 7.创建密码文件 8.在windows主机上做域名解析 9.查看统计结果 1.前言与介绍 前面的学习中根据nginx的简单的配置实现了根据 IP 端口 和 域名 实现虚…

MySQL-三范式 视图

文章目录 三范式三范式简介第一范式第二范式第三范式 表设计一对一一对多多对多最终的设计 视图 三范式 三范式简介 所谓三范式, 其实是表设计的三大原则, 目的都是为了节省空间, 但是三范式是必须要遵守的吗? 答案是否定的(但是第一范式必须遵守) 因为有时候严格遵守三范式…

AI开发-三方库-Hugging Face-Tokenizer

1 需求 需求1&#xff1a;from transformers import AutoTokenizer 需求2&#xff1a;from transformers import BertTokenizer 2 接口 关键参数 textpaddingtruncationreturn_tensors 3 示例 BertTokenizer.from_pretrained() PreTrainedTokenizer PreTrainedTokenizerBa…

医疗图像之基于Unet++的息肉分割

第一步&#xff1a;准备数据 息肉分割数据&#xff0c;总共有1000张 第二步&#xff1a;搭建模型 UNet&#xff0c;这是一种旨在克服以上限制的新型通用图像分割体系结构。如下图所示&#xff0c;UNet由不同深度的U-Net组成&#xff0c;其解码器通过重新设计的跳接以相同的分…

CountUp.js 实现数字增长动画 Vue

效果&#xff1a; 官网介绍 1. 安装 npm install --save countup.js2. 基本使用 // template <span ref"number1Ref"></span>// script const number1Ref ref<HTMLElement>() onMounted(() > {new CountUp(number1Ref.value!, 9999999).sta…

C语言 | Leetcode C语言题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; int totalHammingDistance(int* nums, int numsSize) {int ans 0;for (int i 0; i < 30; i) {int c 0;for (int j 0; j < numsSize; j) {c (nums[j] >> i) & 1;}ans c * (numsSize - c);}return ans; }

超GPT3.5性能,无限长文本,超强RAG三件套,MiniCPM3-4B模型分享

MiniCPM3-4B是由面壁智能与清华大学自然语言处理实验室合作开发的一款高性能端侧AI模型&#xff0c;它是MiniCPM系列的第三代产品&#xff0c;具有4亿参数量。 MiniCPM3-4B模型在性能上超过了Phi-3.5-mini-Instruct和GPT-3.5-Turbo-0125&#xff0c;并且与多款70亿至90亿参数的…

元组与列表嵌套用法

1.可以对列表中的元素修改&#xff0c;不能对元组中的元素修改&#xff1b;当元组与列表嵌套时遵循上述原则. 下图为元组与列表的嵌套案例&#xff08;学生信息的完善&#xff09;&#xff1a;

QQ快捷键冲突解决方法

注意&#xff1a;快捷键被占用&#xff0c;更改快捷键后使用不了&#xff0c;是因为有其他系统快捷键被占用&#xff0c;多尝试几个就可以了

计算机是如何输入存储输出汉字、图片、音频、视频的

计算机是如何输入存储输出汉字、图片、音频、视频的 为了便于理解&#xff0c;先了解一下计算机的组成。 冯诺依曼计算机的五大组成部分。分别是运算器、控制器、存储器、输入设备和输出设备。参见下图&#xff1a; 一、运算器 运算器又称“算术逻辑单元”&#xff0c;是计算…