【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"
相关推荐
CoderYanger10 小时前
C.滑动窗口——1423. 可获得的最大点数
java·开发语言·算法·leetcode·1024程序员节
cui_win11 小时前
Docker Compose 部署一个完整的Prometheus监控告警系统
docker·容器·prometheus
ALex_zry15 小时前
Docker Compose运维技术实战分享:从安装到架构解析
运维·docker·架构
roman_日积跬步-终至千里20 小时前
【Docker】Docker Stop 后到底发生了什么?——从信号机制到优雅停机
运维·docker·容器
z***62621 小时前
Docker:基于自制openjdk8镜像 or 官方openjdk8镜像,制作tomcat镜像
docker·容器·tomcat
❀͜͡傀儡师1 天前
Docker部署视频下载器
docker·容器·音视频
热爱学习的小怪兽1 天前
docker的一些常用指令
运维·docker·容器
CoderYanger1 天前
优选算法-队列+宽搜(BFS):72.二叉树的最大宽度
java·开发语言·算法·leetcode·职场和发展·宽度优先·1024程序员节
w***76551 天前
用docker启动mysql步骤
mysql·docker·容器
p***q781 天前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构