Dockerfile 语法教程

news2025/10/21 3:47:42

Dockerfile 语法教程

文章目录

  • Dockerfile 语法教程
  • Dockerfile 语法教程
    • 基础概念
      • Dockerfile 简介
      • 镜像、容器、仓库的概念
    • Dockerfile 基本语法
  • Dockerfile 基本语法
    • Dockerfile 的基本结构
    • 注释的使用
    • 指令的格式
    • 指令的执行顺序
  • Dockerfile 常用指令
    • FROM 指令
    • RUN 指令
    • CMD 指令
    • ENTRYPOINT 指令
    • ENV 指令
    • ARG 指令
  • 构建镜像
    • 使用 Dockerfile 构建镜像
    • .dockerignore 文件的使用
    • 多阶段构建
  • Dockerfile 最佳实践
    • 1. 编写可复用的 Dockerfile
    • 2. 避免使用 root 用户
    • 3. 优化镜像大小

Dockerfile 语法教程

基础概念

Dockerfile 简介

Dockerfile 是一个文本文件,其内包含了一系列用户可以调用docker build命令自动构建 Docker 镜像的指令。每一条指令都会在镜像上创建一个新的层,因此每一条指令的内容,都会作为下一次创建新的层的基础。

镜像、容器、仓库的概念

  • 镜像:Docker 镜像是一个只读的模板,包含了创建 Docker 容器(可以运行应用程序)和 Docker 镜像(可以运行容器)所需的所有内容。例如,一个镜像可能包含已安装的应用程序、系统工具、库和配置文件。

  • 容器:Docker 容器是镜像的一个运行实例。您可以使用 Docker API 或 CLI 来创建、启动、停止、移动或删除容器。每个容器都是独立和安全的应用平台。

  • 仓库:Docker 仓库是用来存储和管理 Docker 镜像的地方。您可以通过 Docker Hub 或其他公开的仓库来获取别人共享的镜像,也可以将自己的镜像推送到公开或私有的仓库中供他人使用。

Dockerfile 基本语法

Dockerfile 由一系列的指令组成,每一条指令对应一条命令。下面是一些常用的 Dockerfile 指令:

  • FROM:指定基础镜像。
  • RUN:在镜像内部执行命令。
  • CMD:提供默认的命令,当容器启动时会自动执行。
  • ENTRYPOINT:配置容器启动时运行的命令,与 CMD 不同的是,使用 ENTRYPOINT 指定的命令不会被 shell 覆盖,而 CMD 指定的命令会被 shell 覆盖。
  • ENV:设置环境变量。
  • ADD/COPY:将本地文件添加到镜像中。
  • WORKDIR:设置工作目录。
  • EXPOSE:声明运行时容器提供服务端口。
  • VOLUME:创建一个可以从宿主主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据。

Dockerfile 基本语法

Dockerfile 的基本结构

Dockerfile 是一个文本文件,其内包含了一系列用户可以调用 docker 命令自动构建镜像的指令。一个基础的 Dockerfile 文件通常包括:一个基础镜像信息、维护者信息、镜像操作指令等。

# 基础镜像信息
FROM ubuntu:18.04
# 维护者信息
MAINTAINER Your Name <your.email@example.com>
# 镜像操作指令
RUN apt-get update && apt-get install -y python3

注释的使用

在 Dockerfile 中,可以使用 # 来添加注释。单行注释以 # 开头,直到该行的结束。多行注释使用 /**/ 包围起来。

# 这是一个单行注释
RUN echo "Hello, World!" > /tmp/hello.txt # 这是一行注释内容

/*
这是一个多行注释
可以跨越多行
*/

指令的格式

Dockerfile 的每一行都是一个指令,格式为 instruction argument。例如,RUN 指令用于执行命令,CMD 指令用于指定容器启动时要运行的命令。

RUN apt-get update && apt-get install -y python3 # 更新并安装 Python3
CMD ["python3", "app.py"] # 运行 app.py 脚本

指令的执行顺序

Dockerfile 中的指令按照从上到下的顺序执行。用户可以通过 docker build 命令来构建镜像,这个过程中,Docker会按照 Dockerfile 中指令的顺序来执行。

Dockerfile 常用指令

Dockerfile 是用于构建 Docker 镜像的文本文件,它包含了一系列的指令和参数。以下是一些常用的 Dockerfile 指令:

FROM 指令

FROM 指令用于指定基础镜像。例如,如果我们想要基于 ubuntu:18.04 镜像来构建我们的应用,我们可以这样写:

FROM ubuntu:18.04

RUN 指令

RUN 指令用于在镜像中执行命令。例如,我们可以使用 RUN 指令来安装一些必要的软件包:

RUN apt-get update && apt-get install -y curl

CMD 指令

CMD 指令用于指定容器启动时默认执行的命令。例如,我们可以使用 CMD 指令来启动一个 web 服务器:

CMD ["service", "nginx", "start"]

ENTRYPOINT 指令

ENTRYPOINT 指令用于指定容器启动时的入口点。与 CMD 不同的是,ENTRYPOINT 指定的命令不会被 docker run 命令后面的参数所覆盖。例如,我们可以使用 ENTRYPOINT 指令来启动一个 web 服务器:

ENTRYPOINT ["service", "nginx", "start"]

ENV 指令

ENV 指令用于设置环境变量。例如,我们可以使用 ENV 指令来设置数据库连接字符串:

ENV DB_CONNECTION_STRING="server=db;user id=myuser;password=mypassword;database=mydb"

ARG 指令

ARG 指令用于定义可以在构建过程中使用的变量。例如,我们可以使用 ARG 指令来定义版本号:

ARG VERSION=1.0.0

构建镜像

使用 Dockerfile 构建镜像

Dockerfile 是一个文本文件,其包含了一系列用户可以调用 docker build 命令自动执行的命令。以下是一个基本的 Dockerfile 示例:

# 使用官方 Python 运行时作为父镜像
FROM python:3.7-slim

# 设置工作目录
WORKDIR /app

# 将当前目录内容复制到容器的 /app 目录
ADD . /app

# 使用 pip 安装任何需要的包
RUN pip install --no-cache-dir -r requirements.txt

# 使端口 80 可用于此应用程序
EXPOSE 80

# 定义环境变量
ENV NAME World

# 在容器启动时运行 app.py
CMD ["python", "app.py"]

.dockerignore 文件的使用

.dockerignore 文件用于排除不需要的文件和目录。以下是一个 .dockerignore 文件的示例:

# 忽略所有 .pyc 文件和文件夹
*.pyc
__pycache__/

# 忽略所有 .log 文件和文件夹
*.log
logs/

多阶段构建

多阶段构建允许你将构建过程分为多个阶段,每个阶段都有自己的输出。以下是一个多阶段构建的示例:

# 第一阶段:获取依赖项并编译源代码
FROM node:14 as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 第二阶段:使用 Nginx 运行应用
FROM nginx:1.19-alpine as production
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Dockerfile 最佳实践

在编写 Dockerfile 时,遵循一些最佳实践可以帮助我们编写出更高效、可复用和安全的镜像。本教程将介绍以下三个最佳实践:编写可复用的 Dockerfile、避免使用 root 用户和优化镜像大小。

1. 编写可复用的 Dockerfile

为了提高开发效率,我们可以编写一个通用的 Dockerfile,然后在需要的时候继承它。这样可以避免重复编写相同的基础设置。例如,我们可以创建一个名为 base 的 Dockerfile,包含所有通用设置,然后在其他 Dockerfile 中通过 FROM base 指令继承它。

# base Dockerfile
FROM alpine:latest
RUN apk update && apk add --no-cache git
WORKDIR /app

在其他 Dockerfile 中,我们可以这样继承 base Dockerfile:

# app Dockerfile
FROM base
COPY . /app
RUN make build
CMD ["./app"]

2. 避免使用 root 用户

在容器中以 root 用户身份运行进程可能会导致安全风险。因此,建议在容器中以非 root 用户身份运行进程。可以通过以下方式实现:

  1. 在 Dockerfile 中使用 USER 指令切换到非 root 用户。
  2. 确保应用程序在运行时以非 root 用户身份运行。

例如,我们可以在 base Dockerfile 中添加以下内容:

USER nobody

然后,在需要使用非 root 用户的应用程序的 Dockerfile 中,确保应用程序以非 root 用户身份运行。例如:

# app Dockerfile
FROM base
COPY . /app
RUN chown -R nobody:nobody /app && make build
USER nobody
CMD ["./app"]

3. 优化镜像大小

为了减少镜像的大小,我们可以采取以下措施:

  1. 使用多阶段构建。多阶段构建可以将多个构建阶段合并到一个镜像中,从而减少层数和大小。例如:
# multi-stage build example
FROM node:14 as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM alpine:latest as production
WORKDIR /app
COPY --from=builder /app/build ./build
CMD ["./build"]
  1. 清理不必要的文件。在构建过程中,可能会生成一些临时文件或缓存文件。可以使用 RUN 指令删除这些文件,以减小镜像大小。例如:
# remove unnecessary files example
RUN apk del gcc musl-dev && 
    rm -rf /var/cache/apk/* && 
    adduser -D user && 
    mkdir -p /home/user/app && 
    chown -R user:user /home/user/app && 
    mv /app/* /home/user/app/ && 
    rm -rf /app/* && 
    chown -R user:user /home/user/app && 
    mv /home/user/app/* /app/ && 
    rm -rf /home/user/app/* && 
    rm -rf /var/cache/apk/* && 
    rm -rf /tmp/* && 
    apk update && 
    apk add --no-cache libc6-compat && 
    apk add --no-cache libstdc++6 && 
    apk add --no-cache zlib && 
    apk add --no-cache libgcc-s.so.1 && 
    apk add --no-cache libssl1.1 && 
    apk add --no-cache libffi-dev && 
    apk add --no-cache openssl-dev && 
    apk add --no-cache python3 && 
    apk add --no-cache py3-pip && 
    pip3 install --upgrade pip setuptools wheel && 
    pip3 install uwsgi==2.0.19 && 
    pip3 install psutil==5.7.0 && 
    pip3 install requests==2.25.1 && 
    pip3 install httpie==1.0.3 && 
    pip3 install boto3==1.16.48 && 
    pip3 install botocore==1.19.48 && 
    pip3 install cryptography==3.4.7 && 
    pip3 install grpcio==1.34.0 && 
    pip3 install google-api-python-client==1.7.12 && 
    pip3 install google-auth==1.23.0 && 
    pip3 install google-auth-httplib2==0.0.4 && 
    pip3 install google-cloud-core==1.4.1 && 
    pip3 install google-resumable-media==0.5.2 && 
    pip3 install idna==2.10 && 
    pip3 install PyNaCl==1.4.0 && 
    pip3 install six==1.15.0 && 
    pip3 install twilio==6.64.0 && 
    pip3 install validate-email==2020.10.26 && 
    rm -rf /var/cache/apk/* && 
    apk del gcc musl-dev python3 py3-pip build-base && 
    adduser -D user && 
    mkdir -p /home/user/app && 
    chown -R user:user /home/user/app && 
    mv /app/* /home/user/app/ && 
    rm -rf /app/* && 
    chown -R user:user /home/user/app && 
    mv /home/user/app/* /app/ && 
    rm -rf /home/user/app/* && 
    apk update && 
    apk add --no-cache libc6-compat libstdc++6 zlib libgcc-s.so.1 libssl1.1 libffi-dev openssl-dev python3 py3-pip build-base uwsgi==2.0.19 psutil==5.7.0 requests==2.25.1 httpie==1.0.3 boto3==1.16.48 botocore==1.19.48 cryptography==3.4.7 grpcio==1.34.0 google-api-python-client==1.7.12 google-auth==1.23.0 google-auth-httplib2==0.0

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

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

相关文章

Julia语言中的位运算符、赋值运算符、算术运算符

算术运算符 # 使用基本的赋值运算符 a 10 println("a 的初始值是: $a") # 使用加法赋值运算符 a 5 println("a 加上 5 后的值是: $a") # 使用减法赋值运算符 - a - 3 println("a 减去 3 后的值是: $a") # 使用乘法赋值运算符…

【Python】进阶学习:pandas--isin()用法详解

【Python】进阶学习&#xff1a;pandas–isin()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅…

二叉树(Java)

目录 一、概念二、 两种特殊的二叉树三、 二叉树的性质四、二叉树的存储五、二叉树的基本操作1、二叉树的遍历&#xff08;1&#xff09;前中后序遍历&#xff08;2&#xff09;层序遍历 2、基本操作 六、总结 一、概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&…

java使用itex生成PDF

Text是著名的开放源码的站点sourceforge一个项目&#xff0c;是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档&#xff0c;而且可以将XML、Html文件转化为PDF文件。 项目要使用iText&#xff0c;必须引入jar包。才能使用&#xff0c;maven依赖如下&…

在线开源免费问卷调查系统

在线开源免费问卷调查系统 平台简介 本项目旨在提供一个简单易用的问卷调查平台&#xff0c;帮助用户创建、分享问卷&#xff0c;并收集、分析调查数据。我们希望能够为各行各业的调查需求提供一种高效、便捷的解决方案。 项目特点 用户友好&#xff1a;清晰直观的用户界面…

【SpringBoot】测试单元使用多线程

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot ⛺️稳重求进&#xff0c;晒太阳 问题产生 今天学习了乐观锁&#xff0c;但在测试单元执行多线程的时候出现了问题&#xff0c;多线程并没有直接结果 在控制台没有任何输出…

★【二叉搜索树(中序遍历特性)】【 ★递归+双指针】Leetcode 98. 验证二叉搜索树

★【二叉搜索树&#xff08;中序遍历特性&#xff09;】【 ★递归双指针】Leetcode 98. 验证二叉搜索树 二叉搜索树 98. 验证二叉搜索树解法1 笨 中序递归遍历为一个数组 然后判断数组是不是升序排列就可以★解法2 不使用数组 递归法 ---------------&#x1f388;&#x1f38…

电脑中msvcp140_CODECVT_IDS.dll丢失的解决方法分享

msvcp140_CODECVT_IDS.dll是Microsoft Visual C 2015 Redistributable Package的一个组成部分&#xff0c;它是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;包含了运行基于C编译的应用程序时所需的特定编码转换支持。这个dll文件特别与字符编码转换和本地化支持…

观察者模式 详解 设计模式

观察者模式 观察者模式是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;其相关依赖对象都会得到通知并自动更新&#xff0c;如同发布-订阅模式。常见的情况如&#xff1a;公众号更新内容&#xff0c;所有…

灯塔:CSS笔记

CSS&#xff1a;层叠样式表 所谓层叠 即叠加的意思&#xff0c;表示样式可以一层一层的层叠覆盖 css写在style标签中&#xff0c;style标签一般写在head标签里面&#xff0c;title标签下面 <!DOCTYPE html> <html lang"en"> <head><meta cha…

Docker_设置docker服务以及容器开机自启

本文目录 docker服务开机自启动查询docker服务开机自启动状态将docker服务设置为开机自启动取消docker服务开机自启动 容器开机自启动修改docker容器为自启动容器启动时设置自启动-docker版容器启动时设置自启动-docker-compose版 docker服务开机自启动 查询docker服务开机自启…

【airtest】自动化入门教程(三)Poco操作

目录 一、准备工作 1、创建一个pthon脚本 2、光标位置 2、选择Android 3、选择yes 二、定位元素 三、poco基于设备/屏幕 方式 1、poco.click( (x,y))基于屏幕点击相对坐标为x&#xff0c;y的位置 2、poco.get_screen_size() 3、poco.swipe(v1,v2)基于屏幕从v1位置滑到…

腾讯云学生服务器使用教程_申请腾讯云学生机详细流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

Linux篇: 进程控制

一、进程创建 1.1 fork函数初识 在Linux中&#xff0c;fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 返回值&#xff1a; 在子进程中返回0&#xff0c;父进程中返回子进程的PID&#xff0c;子进程创…

腾讯云-云+校园扶持-2核2G学生服务器套餐30元起

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

【风格迁移】URST:解决超高分辨率图像的风格迁移问题

URST&#xff1a;解决超高分辨率图像的风格迁移问题 提出背景URST框架的整体架构 提出背景 论文&#xff1a;https://arxiv.org/pdf/2103.11784.pdf 代码&#xff1a;https://github.com/czczup/URST?v1 有一张高分辨率的风景照片&#xff0c;分辨率为1000010000像素&#…

【分类讨论】【割点】1568. 使陆地分离的最少天数

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 分类讨论 割点 LeetCode1568. 使陆地分离的最少天数 给你一个大小为 m x n &#xff0c;由若干 0 和 1 组成的二维网格 grid &#xff0c;其中 1 表示陆地&#xff0c; 0 表示水。岛屿 由水平方向或竖直方向上相邻的 1 …

Bootstrap的使用

目录 js的引入&#xff1a; 1.行内式 2.嵌入式 3.外链式 Bootstrap:的引入 注意事项&#xff1a; 条件注释语句&#xff1a; 栅格系统&#xff1a; 列嵌套&#xff1a; 列偏移&#xff1a; 列排序&#xff1a; 响应式工具&#xff1a; Bootstrap的字体图标的使用&a…

【MATLAB源码-第147期】基于matlab的QPSK调制解调在AWGN信道,瑞利信道,莱斯信道理论与实际误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 四相位移键控&#xff08;QPSK&#xff0c;Quadrature Phase Shift Keying&#xff09;是一种重要的数字调制技术&#xff0c;它通过改变信号的相位来传输数据。与其他调制技术相比&#xff0c;QPSK在相同的带宽条件下能够传…

某象滑块js逆向(主要是声明拿过我代码的进来)

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018…