【Docker基础五】Dockerfile指令

Dockerfile 是一个文本文件,它包含了一系列的指令和参数,用来自动化构建 Docker 镜像的过程。每一个指令通常都会创建镜像的一层。下面是一些常用的 Dockerfile 指令。

1、FROM

语法FROM <image>[:<tag>] [AS <name>]
用法:设定基础镜像,所有后续的指令都基于这个基础镜像来构建。指定一个已存在的镜像作为新镜像的起点。

示例

# 使用官方的 Node.js 镜像作为基础镜像
FROM node:14# 为多阶段构建指定一个名称
FROM python:3.8 AS builder

多阶段示例:

# 第一阶段,使用 Node.js 镜像构建前端静态文件
FROM node:12 AS build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY ./ ./
RUN npm run build# 第二阶段,使用 Nginx 镜像来提供服务
FROM nginx:stable
COPY --from=build-stage /app/build /usr/share/nginx/html# 在这个多阶段构建的例子中,第一阶段使用了 node:12 镜像,
# 标记为 build-stage,用于构建前端静态文件。第二阶段则使用 nginx:stable 镜像,
# 从第一阶段复制构建好的静态文件到 Nginx 服务的相应目录中。这样做的好处是,
# 最终的镜像不包含构建前端所需的 Node.js 环境,从而降低了镜像的大小。

2、RUN

语法RUN <command> (shell 格式) 或 RUN ["executable", "param1", "param2"] (exec 格式)
用法:执行命令并创建新的镜像层。用于安装软件包、创建文件夹、下载文件等。

示例

# 使用 shell 形式安装软件包
RUN apt-get update && apt-get install -y git# 使用 exec 形式执行命令
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "nginx"]

3、CMD

语法CMD ["executable","param1","param2"] (exec 格式) 或 CMD command param1 param2 (shell 格式)
用法:提供容器默认的执行命令。设置容器启动后默认执行的命令和参数。

示例

# 为容器提供默认运行的命令
CMD ["node", "app.js"]# 使用 shell 形式提供默认命令
CMD echo "Hello, Docker!"# 当使用 ENTRYPOINT 定义了可执行程序时,CMD 指定所需的参数。
# 在这个例子中,如果你没有给 docker run 提供额外的命令行参数,
# 容器将会输出 "Hello, World!"。如果你提供了额外的参数,
# 比如 docker run <image> Hello, Docker!,
# 那么容器将会输出 "Hello, Docker!",因为 CMD 中的默认参数被覆盖了。
ENTRYPOINT ["/bin/echo"]
CMD ["Hello, World!"]

注意:CMD 只应该在 Dockerfile 中使用一次。如果定义了多个 CMD 指令,只有最后一个会生效。

4、LABEL

语法LABEL <key>=<value> <key>=<value> ...
用法:添加元数据。为镜像添加元数据,如维护者信息、版本信息等。

示例

# 添加单个标签
LABEL version="1.0"# 添加多个标签
LABEL maintainer="gusy@example.com" description="this is a description"

5、EXPOSE

语法EXPOSE <port> [<port>/<protocol>...]
用法:声明容器运行时监听的端口。用于指定容器在运行时监听的端口号,供外部连接使用。

示例

# 暴露 80 端口
EXPOSE 80# 暴露 80 端口和 443 端口
EXPOSE 80 443# 暴露 7000 端口使用 TCP 和 7001 使用 UDP
EXPOSE 7000/tcp 7001/udp

6、ENV

语法ENV <key>=<value> ...
用法:设置环境变量。为镜像构建过程和容器运行时设置环境变量。

示例

# 单个环境变量
ENV MY_NAME="John Doe"# 多个环境变量
ENV MY_NAME="John Doe" \MY_DOG="Rex" \MY_CAT="Whiskers"# 使用环境变量的好处是可以在不更改 Dockerfile 的情况下,
# 通过修改环境变量的值来调整容器的行为,这可以在运行容器时通过
# docker run 命令的 -e 或 --env 选项来实现、
docker run -e "MY_NAME=Jane Doe" -e "MY_CAT=Garfield" myimage

7、ADD

语法ADD <原路径> <目标路径> 

  • 原路径为:可以是构建上下文中的一个文件或目录,也可以是一个 URL。
  • 目标路径为:是容器内部的绝对路径,或相对于工作目录(WORKDIR)的相对路径。

用法:复制新文件、目录或远程文件URL到容器的文件系统中指定路径。用于将宿主机的文件添加到镜像中。

  • 如果 <源路径> 是一个本地压缩格式的归档文件(如 tar、gzip、bzip2 等),ADD 会自动解压缩这些文件到 <目标路径>
  • 如果 <源路径> 是一个 URL,ADD 会自动下载这个 URL 的内容到 <目标路径>
  • ADD 指令会保留源文件或目录的所有权限信息。

示例

# 添加本地的 test.txt 文件到容器的 /tmp 目录
ADD test.txt /tmp/# 添加一个目录到容器中的 /path/in/container
ADD my_directory /path/in/container# 从远程 URL 添加文件到容器中的 /path/in/container
ADD https://example.com/big.tar.xz /path/in/container# 添加本地的压缩文件 archive.tar.gz,并自动解压到 /path/in/container
ADD archive.tar.gz /path/in/container/

注意:虽然ADD 功能强大,但 Docker 官方文档推荐尽可能使用 COPY 指令,因为 COPY 更透明。COPY 只支持基本的复制文件和目录的功能,没有自动解压缩的功能,也不支持从 URL 添加文件。如果不需要 ADD 的特殊功能,使用 COPY 是更好的选择。

8、COPY

语法COPY [--chown=<user>:<group>] <src>... <dest>
用法:复制新文件或目录到容器的文件系统中指定路径。类似 ADD,但是不会自动解压缩文件或者支持 URL。

示例

# 复制当前目录下的 test.txt 到容器的 /tmp 目录
COPY test.txt /tmp/# 复制当前目录下的文件到容器中的 /tmp,保持原有的文件名
COPY . /tmp/# 使用多阶段构建时,可能会从一个阶段复制文件到另一个阶段
# 假设在之前的阶段中有一个名为 builder 的阶段
COPY --from=builder /app/output /app/

注意:

  • <源路径> 必须在构建上下文中,不能是构建上下文外部的文件或目录。
  • 如果 <源路径> 是目录,则复制目录内的所有内容(不包括目录本身)。
  • 如果 <目标路径> 不存在,它将被自动创建,包括任何必要的中间目录。

9、ENTRYPOINT

语法ENTRYPOINT ["executable", "param1", "param2"] (exec 格式) 或 ENTRYPOINT command param1 param2 (shell 格式)
用法: 配置容器启动时运行的命令,不会被 docker run 提供的参数覆盖。允许容器像命令一样运行,并且可以向容器传递额外的参数。

示例

# 使用 exec 形式设置入口点
ENTRYPOINT ["node", "app.js"]# 使用 shell 形式设置入口点
ENTRYPOINT exec java -jar /usr/share/tag/app.jar# 结合 CMD 使用,CMD 提供了默认参数
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]

10、VOLUME

语法VOLUME ["/data"]
用法:创建一个可以从本地主机或其他容器挂载的挂载点。用于指定挂载点来持久化数据。

示例

# 创建一个挂载点目录
VOLUME /data# 创建多个挂载点
VOLUME ["/data", "/var/log"]

使用:如果你想要启动一个容器,并将本地目录 /path/on/host 挂载到容器的 /myvol 目录,你可以使用以下命令:

# 以下例子中,/path/on/host 是你主机上的目录,/myvol 是容器内的挂载点。
# 使用这种方式,你可以在容器之间共享和重用数据。
docker run -v /path/on/host:/myvol myimage
# 或者新的 --mount 语法
docker run --mount type=bind,source=/path/on/host,target=/myvol myimage

注:

  • 数据持久化:卷是用来持久化数据的,即使容器被删除,卷中的数据也会保留。

  • 数据共享与重用:卷可以在容器之间共享和重用。例如,数据库的数据可以存储在卷中,供其他容器访问。

  • 容器间解耦:卷可以帮助解耦容器与数据,使得容器的迁移和备份更加容易。

  • 性能:卷通常可以提供比容器层更好的性能,特别是对于有大量写入操作的应用。

  • 管理:卷的生命周期独立于容器,可以使用 Docker 的卷管理命令来管理。

  • 匿名卷与命名卷:在 Dockerfile 中声明的卷是匿名的,但是用户在使用 docker run 命令时可以通过 -v 或 --mount 标志来创建命名卷或绑定挂载

11、USER

语法USER <username>[:<group>]
用法:指定运行容器时的用户名或 UID(和可选的用户组或 GID)。确保容器以特定的用户权限运行。

示例

# 切换到已存在的用户
USER john# 切换到 UID
USER 1000

12、WORKDIR

语法WORKDIR /path/to/workdir
用法:为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录。

示例

# 设置工作目录
WORKDIR /app# 在前一个 WORKDIR 的基础上,设置相对路径的工作目录
WORKDIR /app/build

13、ARG

语法ARG <name>[=<default value>]
用法: 定义构建时的变量。

示例:

# 定义了一个名为 VERSION 的变量,默认值为 latest
ARG VERSION=latest# 使用 ARG 定义的变量来指定基础镜像的版本
FROM alpine:$VERSION# 构建过程使用 alpine:3.12 作为基础镜像。
docker build --build-arg VERSION=3.12

14、ONBUILD

语法ONBUILD <INSTRUCTION>
用法: 添加触发器指令,当镜像作为基础镜像时,触发器指令将被执行。

示例:

# 当构建一个继承了此镜像的 Dockerfile 时,运行 npm install
ONBUILD RUN npm install# 添加触发器拷贝文件
ONBUILD ADD . /app/src

15、STOPSIGNAL

语法STOPSIGNAL signal
用法: 设置停止容器时发送给容器的系统调用信号。

示例:

# 设置 STOPSIGNAL 为 SIGTERM
STOPSIGNAL SIGTERM

16、HEALTHCHECK

语法HEALTHCHECK [OPTIONS] CMD command 或 HEALTHCHECK NONE
用法: 告诉 Docker 如何测试容器以检查它是否仍在运行。

示例:

# 设置健康检查命令
HEALTHCHECK CMD curl --fail http://localhost:8080/ || exit 1# 设置带有选项的健康检查
HEALTHCHECK --interval=5m --timeout=3s \CMD curl -f http://localhost/ || exit 1# 禁用健康检查
HEALTHCHECK NONE

17、SHELL

语法SHELL ["executable", "parameters"]
用法: 设置运行命令时使用的默认 shell。

示例:

# 更改默认 shell 到 powershell
SHELL ["powershell", "-command"]

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

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

相关文章

大数据容器化

记录 知乎容器平台演进及与大数据融合实践 http://www.sykv.cn/cat/bigdata/4140.html Building online HBase cluster of Zhihu based on Kubernetes https://blog.csdn.net/mtj66/article/details/78803242

Golang 网络编程

TCP TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议 如何保证连接的可靠性&#xff1f; 三次握手四次挥手 三次握手 TCP 三次握手&#xff08;Three-way Handshake&#xff09;…

Spring MVC中的方法的返回值!!!

参考入门案例的工程代码&#xff1a;Spring MVC入门案例&#xff01;&#xff01;&#xff01;-CSDN博客 1.使用ModelAndView对象并返回 &#xff1a;这里我们在方法内部new了一个ModelAndView对象&#xff0c;通过这个对象&#xff0c;设置你想向jsp页面传达的信息。 modelA…

QT笔记 - 加载带有提升为自定义部件类的“.ui“文件 - 重写QUiLoader::createWidget()函数

说明 如果ui设计中有提升过小部件&#xff0c;则无法直接使用QUiLoader加载。完成加载需要重新实现UiLoader::createWidget()函数。 函数 virtual QWidget * QUiLoader::createWidget(const QString & className, QWidget * parent Q_NULLPTR, const QString & name…

RibbonGroup添加QCheckBox

RibbonGroup添加 QCheckBox&#xff1a; QCheckBox* pCheck new QCheckBox(tr("Check")); pCheck->setToolTip(tr("Check")); groupClipboard->addWidget(pCheck); connect(pCheck, SIGNAL(stateChanged(int)), this, SLOT(checkClick(int))); …

[学习笔记]刘知远团队大模型技术与交叉应用-汇总

参考资料&#xff1a; 视频&#xff1a;【清华NLP】刘知远团队大模型公开课全网首发&#xff5c;带你从入门到实战 课程计划 L1-NLP&Big Model Basics [学习笔记]刘知远团队大模型技术与交叉应用L1-NLP&Big Model Basics L2-Neural Network Basics [学习笔记]刘知…

微调深度学习模型:初级指南

引言 在深度学习领域&#xff0c;微调&#xff08;Fine-tuning&#xff09;是一种常见的实践&#xff0c;旨在优化预训练模型以适应特定任务或数据集。这对于那些希望利用已有模型来解决类似问题的初学者而言&#xff0c;是一个非常有用的技巧。 预训练模型的选择 微调开始于选…

计算机二级Python基本排序题-序号42(补充)

请在屏幕上输出以下杨辉三角形&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 a [] for i in range(8) :a.append([])for j in range(8) :a[i].append(0) for i in range(8) :a[i][0] 1a[i][i] 1 for i in range(2, 8) :f…

【Java JVM】栈帧

执行引擎是 Java 虚拟机核心的组成部分之一。 在《Java虚拟机规范》中制定了 Java 虚拟机字节码执行引擎的概念模型, 这个概念模型成为各大发行商的 Java 虚拟机执行引擎的统一外观 (Facade)。 不同的虚拟机的实现中, 通常会有 解释执行 (通过解释器执行)编译执行 (通过即时编…

Github Copilot最全的安装与使用教程:一款非常好用的AI编程工具

Github Copilot最全的安装与使用教程 第一章 安装1.安装 GitHub Copilot2.获取资格第二章 使用1.产生建议1.1 键入你想要完成的操作的注释1.2 CtrlI 2. 接受建议3.查看下一个建议3.接受部分建议4.在新选项卡接受建议5.完成多项功能6.聊天 GitHub Copilot 供经过验证的学生、教师…

C++中的23种设计模式精讲

目录 1 单例模式2 工厂方法模式3 抽象工厂模式4参考 1 单例模式 题目链接为&#xff1a;小明的购物车 C代码如下&#xff0c; #include <iostream> #include <string> #include <vector>using namespace std;class ShoppingCart { public:static Shopping…

C语言经典算法之直接排序算法

目录 前言 一、代码实现 二、时空复杂度 时间复杂度&#xff1a; 空间复杂度&#xff1a; 前言 建议&#xff1a;1.学习算法最重要的是理解算法的每一步&#xff0c;而不是记住算法。 2.建议读者学习算法的时候&#xff0c;自己手动一步一步地运行算法。 tips:希尔排序算…

利用反射获取websocket,session字段的值

首先利用反射获取方法字段&#xff0c;然后取得字段的值 private static ConcurrentHashMap<String, Session> map new ConcurrentHashMap<>();OnOpenpublic void onOpen(Session session) throws IllegalAccessException {log.info(session.getId() "开始连…

Flask架构--路由和蓝图

学习视频&#xff1a;第二章&#xff1a;路由和蓝图 1 Flask查询路由的方式_哔哩哔哩_bilibili 参考&#xff1a;Flask框架之路由与蓝图的使用_flask 路由和蓝图-CSDN博客 1.路由的概念&#xff1a; 用于将http请求与特定的python函数相匹配。定义路由后&#xff0c;flask程…

模型索引:QModelIndex

一、为什么要使用模型索引&#xff1f; 从名字可以看出&#xff0c;他是模型的索引&#xff0c;只要对模型实体&#xff08;各种xxxModel的实体&#xff09;施加这个索引&#xff0c;model就会返回数据集中对应的值&#xff0c;或者通过这个索引修改对应数据集中的值。 类比数…

Java内容

目录 1.命名规范 1.命名规范 2.变量

懒得玩游戏--帮我做数独

目录 简介自动解数独思路核心思路输入解析打印 完整代码 简介 最近玩上了一款类似于数独的微信小程序游戏&#xff0c;名字叫数独趣味闯关&#xff0c;过了数独的关卡之后会给拼图&#xff0c;玩了几关之后摸清套路了就有点累了&#xff0c;但是还想集齐拼图&#xff0c;所以就…

【AUTOSAR】--01 AUTOSAR网络管理基础

AUTOSAR网络管理做了几个项目了&#xff0c;但发现还是有些理解不够深入的地方&#xff0c;最近趁着有个新项目也要做AUTOSAR网络管理&#xff0c;再从头梳理一下AUTOSAR网络管理&#xff0c;预计用2-3篇文章&#xff0c;把AUTOSAR网络重新梳理完成。 这是第一篇&#xff0c;主…

C //练习 4-13 编写一个递归版本的reverse(s)函数,以将字符串s倒置。

C程序设计语言 &#xff08;第二版&#xff09; 练习 4-13 练习 4-13 编写一个递归版本的reverse(s)函数&#xff0c;以将字符串s倒置。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&#xff0c;有部分可能需要变更。 IDE工具&#xff1a;Visual S…

Element-Puls Form表单内嵌套el-table表格,根据表格复选框多选或单选动态设置行的验证规则

需求 根据 Table 表格内的复选框来控制当前选中行是否添加必填校验规则 效果图 实现思想 我们需要设置一个 flag 来标识已勾选的行&#xff0c;el-table渲染数据结构是数组对象形式&#xff0c;我们可以在每个对象中手动加如一个标识&#xff0c;例如默认&#xff1a;selected …