【Docker系列】Dockerfile 中指令作用介绍

news2024/12/23 5:28:58

前言

当今容器技术已经成为了现代应用程序开发和部署的重要工具,Docker 作为当前最受欢迎的容器平台之一,提供了高效、轻量级的容器解决方案。而 Dockerfile,则是定义 Docker 容器镜像构建过程的文件,它包含了所有构建该镜像所需的指令及其参数。在本文中,我们将详细介绍 Dockerfile 中所有常见指令,以 centos7.9 镜像为例,并给出了相应的操作案例。

在这里插入图片描述

文章目录

  • 前言
  • 一、配置指令
    • 1.1、ARG
    • 1.2、FROM
    • 1.3、LABEL
    • 1.4、EXPOSE
    • 1.5、ENV
    • 1.6、ENTRYPOINT
    • 1.7、VOLUME
    • 1.8、USER
    • 1.9、WORKDIR
    • 1.10、ONBUILD
    • 1.11、STOPSIGNAL
    • 1.12、HEALTHCHECK
    • 1.13、SHELL
  • 二、操作指令
    • 2.1、RUN
    • 2.2、CMD
    • 2.3、ADD
    • 2.4、COPY
  • 三、整体Dockerfile介绍
  • 总结


指令说明
FROM指明当前的镜像基于哪个镜像构建
ARG定义构建镜像过程中使用的变量
LABEL标记镜像信息,添加元数据
EXPOSE通知 Docker 容器在运行时监听指定的网络端口
ENV指定环境变量
ENTRYPOINT指定镜像的默认入口命令
VOLUME创建一个数据卷挂载点
USER指定运行容器时的用户名或 UID
WORKDIR配置工作目录
RUN运行指定命令
CMD启动容器时指定默认执行的命令
ADD添加内容到镜像
COPY复制内容到镜像
ONBUILD创建子镜像时指定自动执行的操作指令
STOPSIGNAL指定退出的信号值
HEALTHCHECK配置启动容器如何进行健康检查
SHELL指定默认 shell 类型

一、配置指令

1.1、ARG

ARG 指令用于设置构建参数,在构建时可以通过 --build-arg 参数传递值。例如:

ARG VERSION=7.9.2009
FROM centos:${VERSION}

1.2、FROM

FROM 指令指定了所需要用到的基础镜像,指定构建该镜像所依赖的运行环境。例如:

FROM centos:7.9.2009

此指令需要在 Dockerfile 的开始处进行定义,并且只能被定义一次

1.3、LABEL

LABEL 指令用于设置镜像的作者和相关说明信息。其中,Maintainer 是一个特殊的标签,用于设置镜像的维护者信息(已废弃)。
例如:

LABEL maintainer="John Doe <john@doe.com>"
LABEL version="1.0"
LABEL description="This is a CentOS 7.9.2009 base image."

1.4、EXPOSE

EXPOSE 指令用于指定容器监听的网络端口号(一个或多个端口),但并不会将该端口暴露到宿主机环境,不能用于容器端口的绑定和映射。
例如:

EXPOSE 80/tcp
EXPOSE 443/tcp

1.5、ENV

ENV 指令用于定义环境变量(也可以直接通过 --env 参数在运行容器时传递环境变量)。环境变量可在容器内部通过 $VARIABLE_NAME 使用。
例如:

ENV HTTP_PROXY=http://proxy.example.com:8080/
ENV HTTPS_PROXY=https://proxy.example.com:

1.6、ENTRYPOINT

ENTRYPOINT 指令指定容器启动时要执行的命令。与CMD类似,但是 CMD 会在 ENTRYPOINT 声明的命令之后执行。
例如:

ENTRYPOINT ["/usr/sbin/nginx"]

1.7、VOLUME

VOLUME 指令声明了数据卷需要挂载到容器中,与宿主机上的一个目录相对应。
例如:

VOLUME ["/data", "/var/lib/mysql"]

1.8、USER

USER 指令设置运行容器时的用户账户信息。
例如:

USER appuser

1.9、WORKDIR

WORKDIR 指令设置了工作目录,即 RUN, CMD, ENTRYPOINT, COPY, ADD等指令执行时的默认路径。
例如:

WORKDIR /home/app/

1.10、ONBUILD

ONBUILD:定义触发器指令,在当前镜像被用于构建下一级镜像时被触发执行。
例如:

ONBUILD COPY conf/ /usr/local/nginx/conf/
ONBUILD RUN chown -R nginx.nginx /usr/local/nginx/conf/

1.11、STOPSIGNAL

STOPSIGNAL:设置容器停止信号。默认为 SIGTERM。
例如:

STOPSIGNAL SIGINT

1.12、HEALTHCHECK

HEALTHCHECK:健康检查指令,用于确定容器是否在正常工作。
例如:

HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1

1.13、SHELL

SHELL指定 SHELL 程序的路径或类型。
例如:

SHELL ["/bin/bash", "-c"]

二、操作指令

2.1、RUN

RUN 指令用于在容器内执行命令,这些命令将在构建期间被执行。
例如:

RUN yum -y update && \
    yum install -y nginx

2.2、CMD

CMD 指令指定容器启动后默认执行的命令。如果在 docker run 启动时提供了命令,则会覆盖 CMD 中的命令。
该指令定义了默认的命令或参数,当以交互方式启动容器时运行。Dockerfile 中只能有一个 CMD
例如:

CMD ["/usr/sbin/nginx","-g","daemon off;"]

2.3、ADD

ADD 指令与 COPY 相似,但它比 COPY 更强大。除了支持将本地文件复制到 Docker 镜像外,它还可以解压缩 tar 文件、下载远程 URL 并自动解压缩等多种操作。
例如:

ADD http://example.com/big.tar.xz /usr/src/things/
ADD test.tar.gz /tmp

2.4、COPY

该指令允许将文件从主机复制到容器内部。
例如:

COPY src /app/src
COPY my.cnf /etc/mysql/my.cnf
COPY target/*.jar /app.jar 

其中,src 是我们要复制的主机源目录,/app/src 指容器内的目标路径,my.cnf 和 *.jar 同理。
在第一个例子中,我们使用 ADD 下载并提取了一份压缩过的文件。在第二个例子中,我们添加了另一个本地存档文件。

三、整体Dockerfile介绍

其中,每个指令都有对应的语法和用法。下面我们通过一个基于 CentOS 7.9 镜像的示例来介绍各个指令的具体操作方法。

我们首先来构建一个简单的 HTTP 服务的镜像:

# 使用 Centos 7.9 作为基础镜像
FROM centos:7.9.2009

# 指定作者和相关镜像说明信息
LABEL maintainer="John Doe <john@doe.com>"
LABEL description="A basic HTTP service image"

# 定义构建参数APP_ROOT,并设置其值为 /app
ARG APP_ROOT=/app

# 设置环境变量,分别设置环境变量 APP_ROOT、LANG 和 PATH,以便后续操作可以访问到这些环境变量
ENV APP_ROOT ${APP_ROOT}
ENV LANG zh_CN.utf8
ENV PATH $APP_ROOT/bin:$PATH

# 创建工作目录,将工作目录切换到 APP_ROOT 环境变量所指定的路径,即 /app
WORKDIR $APP_ROOT

# 暴露端口 80
EXPOSE 80/tcp

# 添加文件到容器中,将当前目录下的 index.html 文件添加到容器中的 APP_ROOT 目录下
ADD index.html $APP_ROOT/

# 运行脚本文件,定义容器启动时默认运行的命令为以后台方式运行 python 内置的 HTTP 服务器,监听在容器的 80 端口上
CMD ["sh", "-c", "python -m http.server 80"]

总结

  • FROM:指定使用的基础镜像,格式为 FROM [:]。
  • RUN:在当前镜像中执行命令(例如安装软件包),格式为 RUN 。
  • CMD:定义默认的容器启动命令,格式为 CMD [“executable”, “param1”, “param2”]或者CMD command param1 param2。
  • ENTRYPOINT:与 CMD 相似,但会将参数传递给 ENTRYPOINT 而不是运行时才调用命令。
  • ADD/COPY:将本地文件添加到镜像中,格式为 ADD/COPY … 。其中 ADD 支持 url 解压缩等操作。
  • ENV:设置环境变量,格式为 ENV 。
  • ARG:定义构建参数,格式为 ARG [=]。
  • EXPOSE:声明容器打算监听的端口,格式为 EXPOSE [ …]。
  • WORKDIR:设置工作目录路径,格式为 WORKDIR /path/to/workdir。
  • VOLUME:在容器中创建一个挂载点,方便在宿主机上保存数据,格式为 VOLUME /path/to/volume。

以上是常用的一些 Dockerfile 指令,可以根据需要选取使用。总体而言,Dockerfile 的编写灵活性较高,能够满足不同场景的需求。

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

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

相关文章

python大作业——学生管理系统制作,另赠福利:GUI学生管理系统源码

目录 前言环境使用:代码展示尾语 &#x1f49d; 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 环境使用: Python 3.8 解释器 Pycharm 编辑器 可领取福利: GUI学生管理系统源码 python资料、源码、教程\福利皆: 点击此处跳转文末名片获取 代码展示 从学生信息数据库…

python+django植物园性毒源成分管理系统

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括植物性毒源成分管理系统的网络应用&#xff0c;在外国植物性毒源成分管理系统已经是很普遍的方式&#xff0c;不过国内的植物性毒源成分管理可能还处于起步阶段。植物性毒源成…

实验4—OpenGL的鼠标交互绘制

一、实验目的 1.掌握OpenGL的鼠标按钮响应函数。 2.掌握OpenGL的鼠标移动响应函数。 3.进一步巩固OpenGL的基本图元绘制基础 二、实验内容 1.鼠标画草图——实现鼠标点到哪&#xff0c;线就画到哪。 思路&#xff1a; 1 )在主程序注册鼠标响应和鼠标移动子函数: glutMouseF…

ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时之网络安全新防御

ChatGPT&#xff1a;你真的了解网络安全吗&#xff1f;浅谈网络安全攻击防御进行时 网络安全新防御1. 针对人工智能2. 针对5G和物联网3. 针对云安全4.针对社交工程5. 针对加密技术6. 针对多层次的安全控制 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Tra…

针对Rokcetmq引入的缺点提供相应解决方案

1.针对Rokcermq引入可用性降低问题 Rocketmq实现高可用模式&#xff0c;Rocketmq有三种模式&#xff1a;单机模式、主从模式、分片集群模式。 单机模式 单机模式&#xff0c;就是 Demo 级别的&#xff0c;一般就是你本地启动了玩玩儿的&#xff0c;没人生产用单机模式。 docker…

Postman传递@requestbody标注的List集合的传参遇到的问题

Postman传递requestbody标注的List集合的传参遇到的问题 引子如何测试以及遇到的问题参考文献 引子 我们想测试如下接口 RequestMapping(value "saveMessageRecover", method RequestMethod.POST) ResponseBody public AjaxMessage saveMessageRecover(RequestBod…

聚观早报 |必应成为中国第一大桌面搜索引擎;快手上市后首次盈利

今日要闻&#xff1a;必应成为中国第一大桌面搜索引擎&#xff1b;快手上市后集团层面首次盈利&#xff1b;ChatGPT相关诈骗攻击与日俱增&#xff1b;比亚迪回应法国建厂传闻&#xff1b;薇娅夫妇半年收获两家上市公司 必应成为中国第一大桌面搜索引擎 5 月 22 日消息&#xf…

媒体专访|美创胡大海:国内数据安全市场正处于战略机遇期

引言 &#xff1a;我国在《“十四五”数字经济发展规划》中强调深化应用、规范发展、普惠共享&#xff0c;更多强调了数据资源为关键要素的重要性&#xff0c;并呼应了数据要素正式被纳入生产要素的政策&#xff0c;着重提出了数字经济具有“融合应用”和“全要素数字化转型”的…

断言无忧!接口自动化框架封装,Mysql数据库断言

目录 前言&#xff1a; 一、项目背景 二、框架封装 1. Mysql数据库连接 2. 查询功能 3. 断言功能 4. 使用示例 三、总结 前言&#xff1a; 随着互联网行业的迅猛发展&#xff0c;接口自动化测试在软件开发过程中扮演着越来越重要的角色。而在进行接口测试的过程中&…

初学UE5,UE4的教程适用UE5吗?

在UE5出版后&#xff0c;很多人问UE4还要不要学、UE4适不适用于UE5等问题。 UE5是最近推出的一款游戏引擎&#xff0c;相较于UE4而言&#xff0c;它有着更好的性能和灵活的工作流程&#xff0c;同时也引入了一些新的功能。对于一些游戏开发初学者来说&#xff0c;他们可能会想…

Flask restful分页接口实现

1.先定义一个工作信息表: 指定一些相关的字段:工作名称、年限、级别等 class Work(db.Model):__tablename__ = workid = db.Column(db.Integer, primary_key=True)workName = db.Column(db.String(5),nullable=False)year = db.Column(db.String(20), nullable=False)level = …

加密与解密 调试篇 动态调试技术 (二)

我们在 (一)中调试了一个程序 接着我们开始继续学习 常见的断点 这里有 INT 3断点 硬件断点 内存断点 消息断点等 1.INT 3 断点 我们在OllyDbg中 可以使用 命令 bp 或者 F12进行断点 INT3断点 就是在程序中 对该位置的代码 进行替换 替换为INT3 INT3 是一个软中断指令…

ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时之网络安全新定义

ChatGPT&#xff1a;你真的了解网络安全吗&#xff1f;浅谈网络安全攻击防御进行时 网络安全新定义 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI 研发的聊天机器人程序&#xff0c;是人工智能技术驱动的自…

如何利用ChatGPT在工作中提高生产力?

[请微信搜索“云智AI助手”、“云智博瑞”关注我们 │ 谢谢支持 ] Cloud wisdom, AI assistant 每次人工智能成为头条新闻&#xff0c;都会引发对它是否会让人类失业的讨论。尽管某些工作可能会变得多余&#xff0c;我们应该学会与人工智能共同工作&#xff0c;将其作为增强自…

Python统计学13——回归的多重共线性、异方差、自相关的检验

在基础统计学&#xff0c;或者是计量经济学里面&#xff0c;需要对回归问题进行一些违背经典假设的检验&#xff0c;例如多重共线性、异方差、自相关的检验。这些检验用stata&#xff0c;r&#xff0c;Eviews什么都很简单&#xff0c;但是用python很多人都不会。下面就带大家实…

2023.5.14Ubuntu忘记MySQL密码

如果您忘记了MySQL的密码&#xff0c;可以按照以下步骤重置MySQL的密码&#xff1a; 停止MySQL服务&#xff1a; sudo service mysql stop启动MySQL服务&#xff0c;并跳过授权表&#xff1a; sudo mysqld_safe --skip-grant-tables &使用MySQL客户端连接到MySQL&#x…

【搭建轻量级图床】本地搭建LightPicture开源图床管理系统 - 异地远程访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…

吃鸡史:傻鸡是怎么进化并“称霸”世界的?

鸡&#xff0c;给我们的印象是温顺的&#xff1a;温顺地长大&#xff0c;温顺地下蛋&#xff0c;温顺地进油锅… 若是鸡祖宗们知道&#xff0c;有一天它们的鸡子鸡孙会进化成一群不会飞、只知道吃的傻鸡&#xff0c;几千年前的红原鸡骨怕是都要惊得飞出土了&#xff01; 毕竟…

day17 回话跟踪技术Cookie与Session

会话跟踪技术 问题:一次会话中的多次请求不会共享数据,不能显示.若通过传参数在路径上来解决该问题,不安全. 作用:解决HTTP无状态 http,cookie,session使用的区别 如果使用http中的request.setAttribute(),只能一次共享一个 若使用cookie,cookie存在浏览器中,每一次请求都…

JAVA——类间双向关联关系的实现-Contact与Phone类(电话簿管理系统)

首先&#xff1a;确定代码雏形框架&#xff08;原始代码&#xff09; 先根据以往经验写出一般的电话簿管理系统&#xff0c;先把代码雏形框架确定好。 原始代码运行结果&#xff1a; 原始代码源码&#xff1a; package bidirectionalDome;import java.util.ArrayList;public…