【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"
相关推荐
sauTCc5 小时前
Docker初探
docker
c无序5 小时前
【Docker-7】Docker是什么+Docker版本+Docker架构+Docker生态
docker·容器·架构
FixBug_Nick5 小时前
使用Docker安装及使用最新版本的Jenkins
docker·容器·jenkins
Zero_to_zero12347 小时前
解决docker的ubuntu系统中文乱码问题
ubuntu·docker·容器
@郭小茶7 小时前
docker-compose方式部署docker项目
运维·docker·容器
程序员 小柴10 小时前
docker的与使用
java·docker·eureka
ghostwritten10 小时前
Docker Registry Clean
运维·docker·容器
宋冠巡11 小时前
Windows安装Docker(Docker Desktop)
windows·docker·容器
阿噜噜小栈12 小时前
最新国内可用的Docker镜像加速器地址收集
运维·笔记·docker·容器
海鸥8114 小时前
podman和与docker的比较 及podman使用
docker·容器·podman