【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"
相关推荐
milk_yan2 小时前
Docker集成onlyoffice实现预览功能
前端·笔记·docker
encoding-console6 小时前
docker安装consul并启动的详细步骤
docker·容器·consul
m0_748229997 小时前
从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)
docker·容器·node.js
shelby_loo7 小时前
Azure学生订阅上手实操:快速搭建Docker+WordPress环境
microsoft·docker·azure
小诺大人8 小时前
Docker 安装 elk(elasticsearch、logstash、kibana)、ES安装ik分词器
elk·elasticsearch·docker
清风-云烟9 小时前
使用redis-cli命令实现redis crud操作
java·linux·数据库·redis·spring·缓存·1024程序员节
_Eden_11 小时前
Docker入门学习
学习·docker·容器
张3蜂11 小时前
.NET 8 项目 Docker 方式部署到 Linux 系统详细操作步骤
linux·docker·.net
Joeysoda13 小时前
Java数据结构 (链表反转(LinkedList----Leetcode206))
java·linux·开发语言·数据结构·链表·1024程序员节
比特在路上17 小时前
StackOrQueueOJ3:用栈实现队列
c语言·开发语言·数据结构·1024程序员节