使用 Dockerfile 定制镜像

简介: 使用 Dockerfile 定制镜像

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。


Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。


1、FROM 指定基础镜像

定制镜像是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像,因此一个 DockerfileFROM 是必备的指令,并且必须是第一条指令。


2、RUN 执行命令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:

  • shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
  • exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。


mkdir /root/mynginx
cd mynginx
touch Dockerfile

Dockerfile内容设置:

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html



更多的信息:Dockerfile中配置:

FROM debian:stretch
COPY abc /etc/apt/sources.list
RUN set -x; buildDeps='gcc libc6-dev make wget' \
    && apt-get update \
    && apt-get install -y $buildDeps \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && mkdir -p /usr/src/redis \
    && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
    && make -C /usr/src/redis \
    && make -C /usr/src/redis install \
    && rm -rf /var/lib/apt/lists/* \
    && rm redis.tar.gz \
    && rm -r /usr/src/redis \
    && apt-get purge -y --auto-remove $buildDeps


执行命令:docker build -t nginx:v4 /root/mynginx/          (或者cd /root/mynginx/         docker build -t nginx:v4 .   )

几个根据nginx镜像生成一个nginx:v4 的镜像



COPY 复制文件

COPY [--chown=:] <源路径>... <目标路径>

Dockerfile所在的目录中文件或者目录,拷贝到容器目标路径下

1、COPY abc /etc/apt/sources.list              将abc上传容器上传容器/etc/apt/目标目录下并改名覆盖sources.list文件

2、COPY abc /etc/apt/                               将abc上传容器上传容器/etc/apt/目标目录下


ADD 更高级的复制文件

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。

ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /                 将压缩包上传容器并自动解压


CMD 容器启动命令

CMD 指令的格式和 RUN 相似,也是两种格式:

  • shell 格式:CMD <命令>
  • exec 格式:CMD ["可执行文件", "参数1", "参数2"...]

CMD echo $HOME


ENTRYPOINT 入口点

ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 --entrypoint 来指定。

场景一:让镜像变成像命令一样使用

需要一个得知自己当前公网 IP 的镜像,那么可以先用 CMD 来实现:

FROM ubuntu:18.04
RUN apt-get update \
    && apt-get install -y curl \
    && rm -rf /var/lib/apt/lists/*
CMD [ "curl", "-s", "http://myip.ipip.net" ]

使用 docker build -t myip . 来构建镜像的话,如果我们需要查询当前公网 IP,只需要执行:

复制

$ docker run myip
当前 IP:61.148.226.66 来自:北京市 联通

可以直接把镜像当做命令使用了,不过命令总有参数,如果我们希望加参数呢?比如从上面的 CMD 中可以看到实质的命令是 curl,那么如果我们希望显示 HTTP 头信息,就需要加上 -i 参数,但是执行会报错

docker run myip -i

image.png


使用 ENTRYPOINT 就可以解决这个问题。现在我们重新用 ENTRYPOINT 来实现这个镜像:

复制

FROM ubuntu:18.04
RUN apt-get update \
    && apt-get install -y curl \
    && rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://myip.ipip.net" ]

这次我们再来尝试直接使用 docker run myip -i

image.png


ENV 设置环境变量

设置环境变量而已,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。

复制

ENV VERSION=1.0 DEBUG=on \
    NAME="Happy Feet"

以下例子中演示了如何换行,以及对含有空格的值用双引号括起来的办法,这和 Shell 下的行为是一致的。

定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。比如在官方 node 镜像 Dockerfile 中,就有类似这样的代码:

复制

ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
  && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
  && grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
  && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
  && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \
  && ln -s /usr/local/bin/node /usr/local/bin/nodejs

在这里先定义了环境变量 NODE_VERSION,其后的 RUN 这层里,多次使用 $NODE_VERSION 来进行操作定制。可以看到,将来升级镜像构建版本的时候,只需要更新 7.2.0 即可,Dockerfile 构建维护变得更轻松了。

下列指令可以支持环境变量展开: ADDCOPYENVEXPOSEFROMLABELUSERWORKDIRVOLUMESTOPSIGNALONBUILDRUN

目录
相关文章
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
智能自动化全方位解读:定义、技术、市场、应用,一文解答所有
智能自动化融合AI与RPA技术,重塑企业效率。它可处理非结构化数据、跨系统协同、自主决策,广泛应用于财务、人力、制造等领域,助力降本增效、合规创新。2025年全球市场规模将达4200亿美元,中国超9500亿元,成为最大单一市场。实在Agent等标杆产品实现“一句话完成工作”,5000+企业已落地应用,部署快、回报高、无需改造系统,正推动人机协同的数字革命。
777 154
|
8月前
|
人工智能 弹性计算 JavaScript
Moltbot(Clawdbot)AI助手一键部署保姆级教程及2026年常见问题解答
Moltbot(原Clawdbot)作为开源AI助手,支持本地部署与云端部署,具备自动化任务处理、多渠道通信对接、大模型调用等核心能力,可满足个人与小型团队的智能辅助需求。2026年阿里云推出一键部署方案,大幅降低配置门槛,无需复杂环境搭建,新手也能快速上手。本文将详细拆解部署全流程,同时整理高频问题及解决方案,确保不改变原意且无营销表述,助力用户顺利启用AI助手。
1233 2
|
7月前
|
存储 人工智能 前端开发
OpenClaw阿里云+Windows本地部署多Agent实战教程:1个人=一个高效 AI 军团
在AI自动化时代,单一Agent的“全能模式”早已无法满足复杂任务需求——记忆臃肿导致响应迟缓、上下文污染引发逻辑冲突、无关信息加载造成Token浪费,这些痛点让OpenClaw的潜力大打折扣。而多Agent架构的出现,彻底改变了这一现状:通过“单Gateway+多分身”模式,让一个Bot在不同场景下切换独立“大脑”,如同组建一支分工明确的AI团队,实现创意、写作、编码、数据分析等任务的高效协同。
4909 2
|
8月前
|
人工智能 应用服务中间件 API
阿里云上线Clawdbot全套云服务,阿里云 Moltbot 全套云服务部署与使用指南
近期,阿里云正式上线 Moltbot(原名 Clawdbot)全套云服务,这套服务整合了 Agent 所需的算力、模型与消息应用能力,用户无需复杂配置,就能在轻量应用服务器或无影云电脑上快速启用 Moltbot,还能按需调用阿里云百炼平台的千问系列模型,同时支持 iMessage、钉钉等消息通道互动。相比传统本地部署方式,云服务方案不仅降低了硬件成本,还解决了网络依赖与多任务处理瓶颈,让普通用户也能轻松拥有专属 AI 助手。本文结合官方部署教程与全网实操经验,用通俗语言拆解从环境准备到功能使用的完整流程,同时说明核心组件的作用与注意事项,帮助用户顺利落地 Moltbot 云服务。
3103 0
阿里云上线Clawdbot全套云服务,阿里云 Moltbot 全套云服务部署与使用指南
|
人工智能 物联网 测试技术
智能化测试基础架构:软件质量保障的新纪元
本文介绍了智能化测试基础架构的核心构成与优势。该架构融合AI、领域工程与自动化技术,包含智能测试平台、测试智能体、赋能引擎和自动化工具链四部分,能自动生成用例、调度执行、分析结果,显著提升测试效率与覆盖率。其核心优势在于实现专家经验规模化、质量前移和快速适应业务变化,助力企业构建新一代质量保障体系。建议从构建知识图谱和试点关键领域智能体起步,逐步推进测试智能化转型。
|
Java 应用服务中间件 微服务
spring boot 中Feign调用提示Request header is too large 解决方案
spring boot 中Feign调用提示Request header is too large 解决方案
1405 1
|
Ubuntu Linux Docker
Ubuntu 18.04 安装Docker实战案例
关于如何在Ubuntu 18.04系统上安装Docker的实战案例,包括安装步骤、配置镜像加速以及下载和运行Docker镜像的过程。
2619 3
Ubuntu 18.04 安装Docker实战案例
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
springboot全局自定义异常
springboot全局自定义异常
|
JSON Java 数据格式
Springboot自定义全局异常处理
BasicErrorController是Spring Boot中默认提供的用于处理基本错误的控制器。它实现了ErrorController接口,用于处理在应用程序中发生的错误,例如404 Not Found等。此种方式是通过请求转发实现的,出现异常时,会转发到请求到/error,该接口对异常进行处理返回,是最符合全局异常处理的。
600 2

热门文章

最新文章