Leonurus-free

Dockerflie的编写

Docker 是一个开源平台,旨在自动化应用程序的构建、交付和运行。通过 Dockerfile,您可以定义镜像的构建过程。Dockerfile 是由一系列指令组成的文件,Docker 根据这些指令构建镜像。本文将介绍常用的 Dockerfile 指令、格式、解析器指令以及环境变量替换的用法,帮助开发者编写高效、规范的 Dockerfile。

Dockerfile 常用指令

指令 描述
ADD 添加本地或远程文件和目录。
ARG 使用构建时变量。
CMD 指定默认命令。
COPY 复制文件和目录。
ENTRYPOINT 指定默认可执行文件。
ENV 设置环境变量。
EXPOSE 描述您的应用程序正在监听的端口。
FROM 从基础镜像创建新的构建阶段。
HEALTHCHECK 启动时检查容器的健康状况。
LABEL 向镜像添加元数据。
MAINTAINER 指定镜像的作者。
ONBUILD 指定在构建中使用镜像时的说明。
RUN 执行构建命令。
SHELL 设置镜像的默认 shell。
STOPSIGNAL 指定退出容器的系统调用信号。
USER 设置用户和组 ID。
VOLUME 创建卷挂载。
WORKDIR 更改工作目录。

Dockerfile 格式

Dockerfile 的基本格式如下:

INSTRUCTION arguments

解析器指令

解析器指令是影响 Dockerfile 处理方式的可选指令,它们以特殊注释格式# directive=value 编写,并不会添加构建层,也不会显示为构建步骤。

规则

支持的指令

无效示例

由于这些规则,以下示例都是无效的:

解析器指令允许使用非换行符空格。因此,以下行都被视为相同

#directive=value
# directive =value
# directive= value
# directive = value
#   dIrEcTiVe=value

环境变量替换

Dockerfile 中的环境变量通过ENV 指令进行定义,可以在多个指令中作为变量进行替换。环境变量在 Dockerfile 中通常使用$variable_name${variable_name} 的形式进行引用,它们是等效的。大括号语法(${})一般用于处理没有空格的变量名问题,例如${foo}_bar

变量替换语法

转义环境变量

如果需要在 Dockerfile 中转义整个变量名,可以在变量名前添加\。例如:

示例(解析后的表示形式显示在# 之后)

FROM busybox
ENV FOO=/bar
WORKDIR ${FOO}   # WORKDIR /bar
ADD . $FOO       # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux

支持环境变量的指令

以下是支持环境变量替换的 Dockerfile 指令列表:

RUNCMDENTRYPOINT 中的环境变量

您还可以将环境变量与RUNCMDENTRYPOINT 指令一起使用。但在这些指令中,变量替换是由命令 shell 处理的,而不是由构建器处理的。

环境变量的作用范围

在 Dockerfile 中,环境变量的替换在整个指令中使用相同的值。修改环境变量的值仅对后续的指令生效。

ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc

在这个例子中:

总结

Dockerfile 是构建 Docker 镜像的核心工具,理解和掌握常用指令及解析器指令的使用,能够帮助您高效地构建镜像并简化 DevOps 流程。通过合理设置环境变量和优化构建过程,您可以提升应用程序的可移植性和可维护性。

# 基础镜像
FROM nvidia/cuda:12.2.0-base-ubuntu22.04

# 设置工作目录
WORKDIR /CODE

# 安装基础依赖
# 更新系统并安装必要的软件包
RUN apt-get update \
    && apt-get install -y python3.11 python3.11-venv python3.11-dev \
	&& apt-get install -y nginx \
	&& apt-get install -y redis \
	&& apt-get install -y vim \
    && apt-get clean

# 设置 python3 和 pip3 指向 Python 3.11
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 \
    && update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1

# 安装 pip
RUN apt-get install -y python3-pip

# 复制项目文件到容器
COPY . /CODE

# 安装项目依赖
RUN pip install --no-cache-dir -r /CODE/requirements.txt

# 暴露端口
EXPOSE 80
EXPOSE 7001

# 设置默认命令
CMD ["/bin/bash"]

构建Docker镜像

docker build -t corrective_image .