CodeGym /课程 /Docker SELF /Dockerfile 基本指令

Dockerfile 基本指令

Docker SELF
第 13 级 , 课程 2
可用

3.1 指令 FROM

那么,提醒一下,Dockerfile 是一个包含构建 Docker 镜像指令的文本文件。Dockerfile 中的每条指令都执行特定任务并在镜像中创建一个新层。 在这节讲座中,我们将更深入地了解 Dockerfile 的主要指令:FROMRUNCOPYCMD,它们是创建功能性和高效 Docker 镜像的关键。

指令 FROM 定义了将用来创建新镜像的基础镜像。这是任何 Dockerfile 中的第一条指令,它定义了构建镜像的起点。

语法


FROM <image>[:<tag>] [AS <name>]

其中:

  • <image>: 基础镜像的名称。
  • <tag>: (可选)基础镜像的版本。默认使用 latest
  • AS <name>: (可选)为此构建阶段指定的名称(用于多阶段构建)。

示例

使用基础镜像 Ubuntu:

dockerfile


FROM ubuntu:20.04

使用官方镜像 Node.js:

dockerfile


FROM node:14

使用 多阶段构建进行优化:

dockerfile


FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
        
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html

在这个例子中,使用了两个基础镜像。第一个 (node:14) 用于构建应用程序,第二个 (nginx:alpine) — 用于创建一个轻量级服务器来提供静态文件服务。

通过使用多阶段构建,最终镜像只包含最小的文件和程序集(在这个例子中是 Nginx 和构建后的静态文件),使其更轻量化并且部署速度更快。

3.2 指令 RUN

指令 RUN 在容器内部执行命令并在镜像中创建一个新层。这个指令用来安装包、设置环境和执行其他为准备镜像而需要的命令。

语法:


RUN <command>

其中:

  • <command>: 在容器内执行的命令。

示例:

Ubuntu 镜像里安装包:

dockerfile


RUN apt-get update && apt-get install -y curl git

代码编译:

dockerfile


RUN gcc -o myapp myapp.c

合并多条命令

为了减少层的数量、降低 image 的大小并加快构建速度,推荐将多条命令合并到一个 RUN 指令中。

dockerfile


RUN apt-get update \
    && apt-get install -y curl git \
    && rm -rf /var/lib/apt/lists/*

3.3 指令 COPY

指令 COPY 会将文件和目录从构建的上下文复制到容器的文件系统中。这个很方便用来把源代码、配置文件以及其他资源放进容器。

语法:


COPY <src> <dest>

这里:

  • <src>: 构建上下文中文件或者目录的路径。
  • <dest>: 容器中的目标路径。

例子:

将当前目录的所有内容复制到容器的工作目录:

dockerfile


COPY . /app

复制单个文件:

dockerfile


COPY package.json /app/package.json
COPY server.js /app/server.js

使用 .dockerignore

要在复制过程中排除不需要的文件,可以使用 .dockerignore 文件,它的工作方式与 .gitignore 类似。

Text


node_modules
dist
*.log

3.4 指令 CMD

指令 CMD 设置了在容器启动时执行的命令。不同于 RUN 在构建阶段执行,CMD 是在从已创建的镜像启动容器时执行。

语法:


CMD ["executable","param1","param2"]

或者


CMD command param1 param2

其中:

  • ["executable","param1","param2"]: exec 格式,更推荐用于确保信号处理的正确性。
  • command param1 param2: shell 格式,在 shell 中执行命令。

示例:

运行 Node.js 应用:

dockerfile


CMD ["node", "app.js"]

运行 shell 脚本:

dockerfile


CMD /usr/bin/myscript.sh

CMDENTRYPOINT 的区别

CMD 设置了默认命令,在容器启动时可以被覆盖。而 ENTRYPOINT 设置了固定命令,容器启动时总会执行。

使用 ENTRYPOINT 的示例:

dockerfile


ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]

在这个例子中,ENTRYPOINT 启动 Python 脚本,而 CMD 传递可以在容器启动时更改的参数。

包含主要指令的 Dockerfile 示例

dockerfile

        
# 使用 Node.js 基础镜像
FROM node:14
        
# 设置工作目录
WORKDIR /app
        
# 复制 package.json 和 package-lock.json 文件
COPY package*.json ./
        
# 安装依赖
RUN npm install
        
# 复制应用源码
COPY . .
        
# 指定应用使用的端口
EXPOSE 3000
        
# 定义应用启动命令
CMD ["node", "app.js"]
3
任务
Docker SELF, 第 13 级, 课程 2
已锁定
使用 FROM 指令
使用 FROM 指令
3
任务
Docker SELF, 第 13 级, 课程 2
已锁定
使用 RUN 指令
使用 RUN 指令
3
任务
Docker SELF, 第 13 级, 课程 2
已锁定
使用 COPY 指令
使用 COPY 指令
3
任务
Docker SELF, 第 13 级, 课程 2
已锁定
使用多阶段构建与 FROM 和 COPY
使用多阶段构建与 FROM 和 COPY
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION