学习 Dockerfile 常用指令

学习 Dockerfile 常用指令

在构建 Docker 镜像时,Dockerfile 文件是一份至关重要的配置文件,它定义了构建镜像的所有步骤。通过在 Dockerfile 中使用不同的指令(命令),我们可以控制镜像的构建过程、设置环境、指定执行命令等。本文将为你详细介绍 Dockerfile 中常用的指令及其用途,帮助你更好地理解和使用 Docker。

1. FROM

FROM 是 Dockerfile 中最基本的指令,它指定了基础镜像,所有的 Docker 镜像都需要从某个基础镜像开始构建。

  • 作用:指定基础镜像。
  • 语法
    FROM <image-name>:<tag>
    
  • 示例
    FROM node:20-slim
    
    解释:这个指令表示使用 node:20-slim 作为基础镜像。

2. RUN

RUN 指令用于在镜像构建时执行命令。它可以用来安装软件包、运行脚本等,常用于配置和安装依赖。

  • 作用:在镜像构建时执行命令。
  • 语法
    RUN <command>
    
  • 示例
    RUN apt-get update && apt-get install -y curl
    
    解释:该指令更新包管理器并安装 curl

3. CMD

CMD 指令指定容器启动时执行的默认命令。如果用户没有在运行容器时指定其他命令,Docker 将执行 CMD 中定义的命令。

  • 作用:指定容器启动时的默认命令。
  • 语法
    CMD ["executable", "param1", "param2"]
    
    或者
    CMD command param1 param2
    
  • 示例
    CMD ["node", "server.js"]
    
    解释:如果用户未指定其他命令,容器启动时将执行 node server.js

4. ENTRYPOINT

ENTRYPOINTCMD 类似,但具有更强的控制力。无论你传递什么命令给 docker runENTRYPOINT 定义的命令都会被执行。CMD 可以用来提供默认参数。

  • 作用:指定容器启动时始终执行的命令。
  • 语法
    ENTRYPOINT ["executable", "param1", "param2"]
    
  • 示例
    ENTRYPOINT ["node", "server.js"]
    
    解释:容器启动时始终执行 node server.js,无论传入什么命令行参数。

5. WORKDIR

WORKDIR 指令用于设置容器中的工作目录,所有后续的命令(如 RUNCMD)都将在该目录下执行。

  • 作用:设置工作目录。
  • 语法
    WORKDIR <path>
    
  • 示例
    WORKDIR /app
    
    解释:将工作目录设置为 /app,后续的操作会在此目录下进行。

6. COPY

COPY 指令用于将文件或目录从主机复制到容器的指定位置。

  • 作用:复制本地文件或目录到容器中。
  • 语法
    COPY <source> <destination>
    
  • 示例
    COPY . /app
    
    解释:将当前目录(主机中的 . )复制到容器中的 /app 目录。

7. ADD

ADD 指令类似于 COPY,但功能更强大,支持从 URL 下载文件并自动解压文件。

  • 作用:将本地文件或远程文件复制到容器,并且支持解压。
  • 语法
    ADD <source> <destination>
    
  • 示例
    ADD ./config.tar.gz /app/config/
    
    解释:该指令将压缩包 config.tar.gz 解压到容器中的 /app/config/ 目录。

8. ENV

ENV 指令用于设置环境变量,这些变量会在容器的整个生命周期中可用。

  • 作用:设置环境变量。
  • 语法
    ENV <key>=<value>
    
  • 示例
    ENV NODE_ENV production
    
    解释:设置环境变量 NODE_ENVproduction,后续的命令或运行时都能访问到这个环境变量。

9. EXPOSE

EXPOSE 指令用于声明容器监听的端口,通常用于文档说明,告诉其他开发者容器会监听哪些端口。它不会实际打开端口。

  • 作用:声明容器暴露的端口。
  • 语法
    EXPOSE <port>
    
  • 示例
    EXPOSE 3000
    
    解释:声明容器会监听端口 3000,容器在运行时,可以通过 docker run -p 映射到主机端口。

10. VOLUME

VOLUME 指令用于创建一个挂载点,可以将宿主机的目录或 Docker 卷挂载到容器中,以便数据持久化。

  • 作用:定义容器挂载点,持久化数据。
  • 语法
    VOLUME ["/path"]
    
  • 示例
    VOLUME ["/data"]
    
    解释:创建一个名为 /data 的挂载点,可以将容器中的数据持久化。

11. USER

USER 指令用于指定在容器中运行后续命令的用户,通常为了安全考虑,避免以 root 用户运行容器。

  • 作用:指定容器内运行命令的用户。
  • 语法
    USER <username>
    
  • 示例
    USER node
    
    解释:后续命令将以 node 用户身份执行。

12. HEALTHCHECK

HEALTHCHECK 指令定义容器的健康检查命令。Docker 会周期性地执行这个命令来检查容器是否运行正常。

  • 作用:定义健康检查命令。
  • 语法
    HEALTHCHECK CMD <command>
    
  • 示例
    HEALTHCHECK CMD curl --fail http://localhost:3000/health || exit 1
    
    解释:容器会定期执行 curl 命令来检查应用是否可用。

13. STOPSIGNAL

STOPSIGNAL 指令用于定义容器停止时发送的信号,默认情况下是 SIGTERM

  • 作用:定义停止容器时的信号。
  • 语法
    STOPSIGNAL <signal>
    
  • 示例
    STOPSIGNAL SIGKILL
    
    解释:当容器停止时,Docker 将发送 SIGKILL 信号,而不是默认的 SIGTERM

14. ARG

ARG 指令用于定义构建时的变量,它的作用范围仅限于构建阶段。

  • 作用:定义构建时的变量。
  • 语法
    ARG <name>[=<default value>]
    
  • 示例
    ARG NODE_VERSION=20
    FROM node:${NODE_VERSION}-slim
    
    解释:定义 NODE_VERSION 变量,并在 FROM 中使用该变量。

总结

指令作用执行时机
FROM指定镜像基础构建时
RUN执行命令,生成中间镜像构建时
CMD容器启动时的默认命令容器运行时
ENTRYPOINT容器启动时强制执行的命令容器运行时
WORKDIR指定工作目录构建+运行时
COPY复制本地文件构建时
ADD复制或解压本地/URL 文件构建时
ENV设置环境变量构建+运行时
EXPOSE指定要暴露的端口仅用于文档
VOLUME定义可挂载的存储路径容器运行时
USER指定运行命令的用户构建+运行时
HEALTHCHECK健康检查容器运行时

掌握这些常用指令,可以帮助你更加高效地编写和管理 Dockerfile,构建出高质量的 Docker 镜像。希望本文能对你有所帮助,欢迎留言交流!

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

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

相关文章

D95【python 接口自动化学习】- pytest进阶之fixture用法

day95 pytest的fixture详解&#xff08;二&#xff09; 学习日期&#xff1a;20241210 学习目标&#xff1a;pytest基础用法 -- pytest的fixture详解&#xff08;二&#xff09; 学习笔记&#xff1a; fixture(autouseTrue) func的autouse是TRUE时&#xff0c;所有函数方法…

C语言 字符串输入输出函数、scanf(“%[^\n]“,)可输入空格 、fgets删除换行符

字符串输入函数&#xff1a; scanf&#xff08;"%s"&#xff0c;数组名&#xff09; gets&#xff08;数组名&#xff09; fgets&#xff08;&#xff09; --- 文件流输入函数 函数原型&#xff1a; int scanf( const char *format, ...…

深度学习camp-第J4周:ResNet与DenseNet结合探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本周任务&#xff1a; 探索ResNet和DenseNet的结合可能性本周任务较难&#xff0c;我们在chatGPT的帮助下完成 一、网络的构建 设计一种结合 ResNet 和 Den…

「iOS」通过CoreLocation Framework深入了解MVC架构

「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构 文章目录 「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构前言CoreLocation了解根据需求建模设计属性方法设计协议传值Block传值KVONotification通知方式 总结参考文章 前言 在这个学期的前…

Debezium系列之:使用Debezium采集oceanbase数据库

Debezium系列之:使用Debezium采集oceanbase数据库 一、oceanbase数据库二、安装OceanBase三、安装oblogproxy四、基于Docker的简单采集案例五、生产实际应用案例Debezium 是一个开源的分布式平台,用于监控数据库变化和捕捉数据变动事件,并以事件流的形式导出到各种消费者。D…

线程sleep的时候会释放锁吗

来看一段代码&#xff1a; void task1(mutex &m) {cout << "thread 1 init..." << endl;{std::unique_lock<mutex> lock(m);cout << "thread 1 getLock" << endl;sleep(5);}cout << "thread 1 freeLock&quo…

wordpress建站--如何用Let‘s Encrypt给网站添加免费ssl证书,支持https访问

本文首发网站&#xff1a;https://www.click234.com 默认情况下我们的网站是http访问&#xff0c;为了增加访问安全性&#xff0c;我们需要添加ssl证书&#xff0c;支持采用https方式访问&#xff0c;今天我们来看下怎么创建免费的ssl证书--Lets Encrypt 使用 Certbot 自动化工…

青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理

青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理 课题摘要:一、项目结构各目录说明&#xff1a; 二、依赖项三、依赖管理任务四、依赖管理步骤1. 初始化Go Modules项目2. 添加依赖3. 指定依赖版本4. 更新依赖5. 清理未使用的依赖6. 离线工作7. 模块隔离8. 可重现构建 …

Debezium OracleConnection 分析

Debezium OracleConnection 分析 目录 1. 概述2. 核心功能3. 实现分析4. 使用场景5. 示例分析6. 最佳实践7. 总结1. 概述 OracleConnection 是 Debezium Oracle 连接器中的数据库连接管理组件,主要负责: 数据库连接的建立和管理事务控制查询执行元数据操作LogMiner 会话管理…

【每日一练 基础题】[蓝桥杯 2022 省 A] 求和

[蓝桥杯 2022 省 A] 求和 暴力破解会超时,用因式分解的平方差公式 a2 2abb2(a)2 a-2abb2(a-b)2 输出整数((a1a2a3…an)-a1-a2-a3-…-an)/2 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);l…

ArrayList源码分析、扩容机制面试题,数组和List的相互转换,ArrayList与LinkedList的区别

目录 1.java集合框架体系 2. 前置知识-数组 2.1 数组 2.1.1 定义&#xff1a; 2.1.2 数组如何获取其他元素的地址值&#xff1f;&#xff08;寻址公式&#xff09; 2.1.3 为什么数组索引从0开始呢&#xff1f;从1开始不行吗&#xff1f; 3. ArrayList 3.1 ArrayList和和…

【C++】- 掌握STL List类:带你探索双向链表的魅力

文章目录 前言&#xff1a;一.list的介绍及使用1. list的介绍2. list的使用2.1 list的构造2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers2.6 list的迭代器失效 二.list的模拟实现1. list的节点2. list的成员变量3.list迭代器相关问题3.1…

Docker--Docker Container(容器) 之容器实战

对docker容器的前两篇文章 Docker–Docker Container(容器) 之 操作实例 Docker–Docker Container(容器&#xff09; Mysql容器化安装 我们可以先在Docker Hub上查看对应的Mysql镜像,拉取对应的镜像&#xff1a; 拉取mysql5.7版本的镜像&#xff1a; docker pull mysql:5.7…

ModuleNotFoundError: No module named ‘torchvision.transforms.functional_tensor‘

问题&#xff1a; 运行代码时&#xff0c;报错&#xff1a; … File “/home/xzy/anaconda3/envs/groundinggpt/lib/python3.10/site-packages/pytorchvideo/transforms/augmix.py”, line 6, in from pytorchvideo.transforms.augmentations import ( File “/home/xzy/anac…

【汇编语言】内中断(二) —— 安装自己的中断处理程序:你也能控制0号中断

文章目录 前言1. 编程处理0号中断1.1 效果演示1.2 分析所要编写的中断处理程序1.2.1 引发中断1.2.2 中断处理程序1.2.3 中断处理程序do0应该存放的位置1.2.4 中断向量表的修改1.2.5 总结 1.3 程序框架1.4 注意事项1.5 从CPU的角度看中断处理程序1.6 一些问题的思考与解答 2. 安…

华为OD E卷(100分)23-连续字母长度

前言 工作了十几年&#xff0c;从普通的研发工程师一路成长为研发经理、研发总监。临近40岁&#xff0c;本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作&#xff0c;愁肠百结。为了让自己有点事情做&#xff0c;也算提高一下自己的编程能力…

VS2019中无法跳转定义_其中之一情况

我习惯了使用VS2019看stm的代码&#xff1b; 遇到的问题&#xff0c;在导入代码后&#xff0c;发现有些函数调用不能跳转到定义&#xff1b; 问题描述步骤 1、导入代码 2、跳转&#xff0c;无法跳转 1、中文路径 2、删除.vs文件 和网上查的都没办法解决 最后发现是VS不支持 …

让 Win10 上网本 Debug 模式 QUDPSocket 信号槽 收发不丢包的方法总结

在前两篇文章里&#xff0c;我们探讨了不少UDP丢包的解决方案。经过几年的摸索测试&#xff0c;其实方法非常简单, 无需修改代码。 1. Windows 下设置UDP缓存 这个方法可以一劳永逸解决UDP的收发丢包问题&#xff0c;只要添加注册表项目并重启即可。即使用Qt的信号与槽&#…

【设计模式】观察者模式深度讲解

文章目录 概览一、定义与特点二、角色与职责三、实现方式四、应用场景五、优缺点 Java实现Python实现 概览 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题…

Elasticsearch:ES|QL 中的全文搜索 - 8.17

细心的开发者如果已经阅读我前两天发布的文章 “Elastic 8.17&#xff1a;Elasticsearch logsdb 索引模式、Elastic Rerank 等”&#xff0c;你就会发现在 8.17 的发布版中&#xff0c;有一个重要的功能发布。那就是 ES|QL 开始支持全文搜索了。在今天的文章中我们来尝试一下。…