【Docker】Dockerfile 用于组装镜像的指令都有啥?

背景

  1. Dockerfile 是一个文本文件,其中包含了一系列的指令和参数,用于组装镜像。
  2. Dockerfile 支持多种指令,以下是主要的 Dockerfile 指令及其解释!

FROM

  1. 指定基础镜像。
  2. AS <name> 是可选的,用于给基础镜像设置一个别名,以便在后续的 COPYFROM 指令中引用。
dockerfile 复制代码
# FROM <image> [AS <name>]
FROM node as node

RUN

在镜像构建过程中执行命令

dockerfile 复制代码
# RUN <command>
RUN ls /opt/web

RUN echo "*** hello world ***"

RUN apk add --no-cache nodejs=20.15.1-r0
RUN apk add --no-cache npm

WORKDIR

设置工作目录,对后续的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令生效。

dockerfile 复制代码
WORKDIR /path/to/workdir

COPY

  1. 将构建上下文中的文件或目录复制到镜像中。
  2. 可选:--from 用于从另一个阶段或镜像中复制文件。
dockerfile 复制代码
FROM node as node

# COPY <源路径> <目标路径>
COPY --from=node /opt/web/dist/ /dist/
COPY ./deploy/nginx.conf /etc/nginx/conf.d/default.conf

ADD

  1. ADD 指令用于将文件、目录或远程 URL 的内容添加到镜像中。

  2. 它还可以自动解压压缩文件(如 .tar.tar.gz.tgz.bzip2.xz 等)。

  3. 然而,需要注意的是,ADD 指令主要用于添加本地文件到镜像中,并且如果添加的是压缩文件,它会自动解压。

  4. 如果仅仅是为了复制文件,通常推荐使用 COPY 指令,因为它更加直观且性能更好。

dockerfile 复制代码
# 将本地文件 myfile.txt 添加到镜像的 /app/ 目录下
ADD myfile.txt /app/

# 或者,从远程 URL 下载一个压缩包并解压到镜像的 /app/ 目录下:
ADD https://example.com/myapp.tar.gz /app/

CMD

  1. CMD 指令用于指定容器启动时运行的默认命令。
  2. 如果有多个 CMD 指令,只有最后一个会生效。
  3. CMD 可以包含参数,这些参数可以在运行 docker run 命令时被覆盖。
CMD ["nginx", "-g", "daemon off;"]

ENTRYPOINT

  1. 配置容器启动时运行的命令。
  2. 与 CMD 不同,ENTRYPOINT 指定的命令不会被 docker run 命令行参数覆盖,而是将这些参数传递给 ENTRYPOINT 指定的命令。
dockerfile 复制代码
ENTRYPOINT sh /bin/modify.sh

/bin/modify.sh

bash 复制代码
#!/bin/bash
node -v

# nginx 重启
/usr/sbin/nginx -s reload
nginx -g 'daemon off;'

CMD 与 ENTRYPOINT 的区别

  1. CMD 主要用于定义容器启动时的默认命令,并允许通过 docker run 命令的参数来覆盖;
  2. 而 ENTRYPOINT 则用于定义容器的主执行程序,并确保该程序始终被执行。

EXPOSE

  1. 声明容器运行时监听的端口,但并不会实际发布端口。
  2. 要与 -p--publish 标志一起使用 docker run 命令来发布端口。
dockerfile 复制代码
# 暴露 8081 端口  
EXPOSE 8081

ENV

设置环境变量。

dockerfile 复制代码
# ENV <key1>=<value1> <key2>=<value2> ...

ENV NODE_VERSION 14.17.0

# 可以设置多个环境变量 
ENV RAILS_ENV=production \  
    SECRET_KEY=your-secret-key

LABEL

为镜像添加元数据标签。

dockerfile 复制代码
# LABEL <key>=<value> <key>=<value> ...

# 可以增加多个元数据标签
LABEL maintainer="<name> <email>" \  
      description="This is a description of the image" \  
      version="1.0"
相关推荐
亲持红叶1 小时前
open-webui安装
docker·open-webui
伪装成塔的小兵1 小时前
Windows使用docker部署fastgpt出现的一些问题
windows·docker·容器·oneapi·fastgpt
转身後 默落5 小时前
11.Docker 之分布式仓库 Harbor
分布式·docker·容器
菩提云5 小时前
Deepseek存算分离安全部署手册
人工智能·深度学习·安全·docker·容器
c无序12 小时前
Docker-技术架构演进之路
docker
努力的小T16 小时前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
东风微鸣17 小时前
TTRSS 迁移实战
docker·云原生·kubernetes·可观察性
转身後 默落19 小时前
04.Docker 镜像命令
docker·容器·eureka
IT_张三19 小时前
Docker+Kubernetes_第一章_Docker入门
java·docker·kubernetes
jessezappy19 小时前
记录:Docker 安装记录
docker·安装·ollama·软链接