Dockerfile 语法与常用命令
转发请注明出处:
一、Dockerfile 核心语法规则
- 指令大写:所有指令必须大写(如
FROM
,RUN
) - 顺序执行:指令按顺序从上到下执行
- 分层构建:每条指令生成一个镜像层,修改上层不会影响下层
- 注释支持:使用
#
符号添加注释 - 基础镜像:必须包含
FROM
指令作为第一条指令
二、常用指令详解
指令 | 作用 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM ubuntu:20.04 |
RUN | 执行命令并提交结果 | RUN apt-get update && apt-get install -y curl |
COPY | 复制本地文件到镜像 | COPY ./app /app |
ADD | 复制文件并支持自动解压(推荐优先使用 COPY) | ADD https://example.com/file.tar.gz /tmp |
CMD | 定义容器启动默认命令(可被覆盖) | CMD ["python", "app.py"] |
ENTRYPOINT | 定义容器启动主命令(不可被覆盖,可组合使用) | ENTRYPOINT ["python"] |
WORKDIR | 设置工作目录 | WORKDIR /app |
EXPOSE | 声明容器监听端口 | EXPOSE 80 |
ENV | 设置环境变量 | ENV NODE_ENV=production |
VOLUME | 创建挂载点 | VOLUME /data |
ARG | 定义构建参数(仅在构建时有效) | ARG USER_ID=1000 |
USER | 指定运行用户 | USER root |
LABEL | 添加元数据 | LABEL maintainer="your@email.com" |
ONBUILD | 定义镜像作为其他镜像基础时执行的指令(较少使用) | ONBUILD RUN echo "Building child image" |
三、典型使用场景示例
示例1:构建 Node.js 应用镜像
# 使用官方 Node.js 镜像作为基础
FROM node:18-alpine # 设置工作目录
WORKDIR /app # 复制 package.json 并安装依赖
COPY package*.json ./
RUN npm install --production # 复制应用代码
COPY . . # 暴露应用端口
EXPOSE 3000 # 定义启动命令
CMD ["npm", "start"]
构建命令:
docker build -t my-node-app .
运行命令:
docker run -p 3000:3000 my-node-app
示例2:Python Web 服务镜像
# 使用 Python 官方镜像
FROM python:3.11-slim # 设置环境变量
ENV PYTHONUNBUFFERED=1 # 创建工作目录
WORKDIR /code # 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
python3-dev \
&& rm -rf /var/lib/apt/lists/* # 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码
COPY . . # 启动命令
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myapp.wsgi"]
2.构建优化技巧:
- 使用
.dockerignore
文件排除无关文件 - 合并 RUN 指令减少层数:
RUN apt-get update \
&& apt-get install -y package \
&& rm -rf /var/lib/apt/lists/*
3.多阶段构建(减小最终镜像体积):
# 构建阶段
FROM golang:1.21 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp # 最终阶段
FROM alpine:latest
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
四、关键注意事项
- 层缓存机制:Dockerfile 修改后,只有修改后的指令及其后续指令会重新执行
- 安全最佳实践:
- 避免以 root 用户运行最终容器
- 使用最小基础镜像(如 alpine)
- 定期更新基础镜像
- 多阶段构建:适用于需要编译环境但运行时不需要的情况(如 Go/C++ 应用)
- 健康检查:
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
五、调试技巧
- 进入容器调试:
docker run -it my-image /bin/bash
- 查看构建历史:
docker history my-image
查看镜像详细信息:
docker inspect my-image
参考链接:
https://docs.docker.com/reference/dockerfile/
Dockerfile 语法与常用命令的更多相关文章
- Dockerfile 中对常用命令详解
说明 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 在Dockerfile 中命令书写对先后顺序及表示其执行对顺序,在书写时需注意. 约定 命令不 ...
- Windows PowerShell基本语法及常用命令
PowerShell常用命令: 一 Get类 1.Get-Command : 得到所有PowerShell命令,获取有关 cmdlet 以及有关 Windows PowerShell 命令的其他元素的 ...
- Java基础—基础语法与常用命令
一.基础语法 1.case不加break会有穿透效果 根据阿里规范,严禁省略default语句,即使它一句话也没有 2.for循环执行顺序: for(初始化1;条件2;迭代运算3){ 循环体4: } ...
- docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。
一.docker常用命令? 1. 常用帮助命令 1.1 docker的信息以及版本号 /* docker info 查看docker的信息 images2 docker本身就是一个镜像. docker ...
- Docker常用命令和Dockerfile语法
Linux安装Docker: sudo wget -qO- https://get.docker.com/ | sh 安装后只能用root管理,要给其他用户权限,使用命令: sudo usermod ...
- docker命令、简单创建镜像、dockerfile实战、Dockerfile语法、镜像分层、Volume介绍
docker的常用命令: docker pull 获取imagedocker build 创建imagedocker images 列出imagedocker run 运行containerdocke ...
- sqlite3常用命令&语法
sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常不错的嵌入式数据库,SQLite大量的被用于手机,PDA,MP3播放器以及机顶盒设备. Mozilla Firefox使用SQLit ...
- grep,awk和sed的常用命令和语法
Grep的常用命令语法 1. 双引号引用和单引号引用在g r e p命令中输入字符串参数时,最好将其用双引号括起来.例如:“m y s t r i n g”.这样做有两个原因,一是以防被误解为 s h ...
- linux基本语法和常用运维命令
linux上的操作一般是命令行操作,看起来很高大上,让人畏而远之. Help!Help! 忽然间闯入的linux黑黑的世界,怎么办,不要慌.赶紧敲出一个help命令,然后回车,黑色的窗口就会展示一些常 ...
- Linux常用命令语法+示例
原文出自:https://blog.csdn.net/seesun2012 Linux常用命令:Linux查看日志命令总结:Tomcat相关:Linux配置网卡,连接外网:Linux下安装JDK:Li ...
随机推荐
- Qt编写安防视频监控系统19-日志查询
一.前言 日志查询功能是基础功能,主要分两块,一个是本地日志查询,包括运行日志.报警日志.操作日志:一个是设备日志查询,就是通过SDK去拉去NVR设备的日志信息,包括系统操作.配置操作.报警操作.录像 ...
- 基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.0版已发布
关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级.高度提炼,一套API优雅支持 UDP .TCP .WebSocket 三种协议,支持 iOS ...
- uniapp请求封装-token无感刷新
当前是vue3+ts版本的封装 vue3+js版本请求封装可参考 https://www.cnblogs.com/lovejielive/p/14343619.html token无感刷新,可自行删除 ...
- PaperAssistant:使用Microsoft.Extensions.AI实现
前言 上篇文章介绍了使用Semantic Kernel Chat Completion Agent实现的版本. 使用C#构建一个论文总结AI Agent 今天来介绍一下使用Microsoft.Exte ...
- .NetCore依赖注入(DI)之生命周期
在 .NET Core 中,依赖注入(Dependency Injection,DI)是一种实现控制反转(Inversion of Control,IoC)的技术,它通过将依赖对象注入到需要它们的对象 ...
- 时间序列数据库TSDB InfluxDB介绍
背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工智能.物联网.机器学习.商业智能.智能预警啊等等. 以前的系统,做数据可视化,信息管理,流程控制.现在业务已经不仅仅满足于这 ...
- 第一个shell脚本(bash脚本)
首先它是一个脚本,并不能作为正式的编程语言.因为是跑在linux的shell中,所以叫shell脚本.说白了,shell脚本就是一些命令的集合.运维工作中把常用的一系列的操作都记录到一个文档中,然后去 ...
- 某教育网站疑似删库。。。没备份。。。数据全没了。。。Sealos 带你一分钟满血复活
2025 年 1 月 15 日,微信群里有人爆料,某教育网站疑似删库,导致网站无法访问.具体的问题是数据库被格式化了,而且也没有备份,连数据库表结构都没有,不仅业务瘫痪,也无法拉起新的应用,实在是有点 ...
- java中属性和变量的区别与final和抽象类
属性和变量的区别 变量必须要有初始值: 属性可以没有初始值: 变量的范围只在当前大括号内有效: 属性是对象在哪里使用就在哪里有效: 属性的作用范围要比变量的大一些 属性和变量 public class ...
- 设置npm、yarn和pnpm的国内镜像地址和yarn命令相关问题
1.npm 全局设置: 输入如下命令查看镜像地址: npm config get registry 输入如下命令设置镜像地址为淘宝: // 推荐地址 npm config set registry h ...