Dockerfile 如何设置变量

在 Dockerfile 中,我们可以使用 ARG 和 ENV 指令来设置变量。这些变量可以在构建镜像的过程中使用,并且可以传递给容器中运行的应用程序。

ARG 指令

ARG 指令用于定义构建时的变量。定义的 ARG 变量可以在 Dockerfile 中使用,但是无法在容器中运行的应用程序中使用。ARG 变量的值可以在构建镜像的命令行中通过 --build-arg 参数传递。

下面是一个设置和使用 ARG 变量的例子:

# 设置 ARG 变量
ARG VERSION=latest

# 使用 ARG 变量
FROM ubuntu:${VERSION}

在上面的例子中,我们定义了一个名为 VERSION 的 ARG 变量,并将其默认值设置为 latest。然后在 FROM 指令中使用了这个变量来指定要使用的基础镜像的版本。在构建镜像时,我们可以通过以下命令来传递一个新的值给 VERSION 变量:

docker build --build-arg VERSION=18.04 .

通过上面的命令,我们将 VERSION 变量的值改为 18.04,并将其传递给构建镜像的过程。

ENV 指令

ENV 指令用于设置环境变量,这些环境变量可以在容器中运行的应用程序中使用。和 ARG 不同,ENV 设置的环境变量可以在容器中使用,并且可以通过容器运行命令来访问和修改。

下面是一个设置和使用 ENV 变量的例子:

# 设置 ENV 变量
ENV PATH="/usr/local/bin:${PATH}"

# 使用 ENV 变量
CMD echo $PATH

在上面的例子中,我们定义了一个名为 PATH 的 ENV 变量,并将其值设置为 "/usr/local/bin:${PATH}"。然后在 CMD 指令中使用了这个变量来输出当前的 PATH 值。

需要注意的是,在 Dockerfile 中使用 ENV 设置的环境变量,会被继承给容器中运行的应用程序。这意味着应用程序可以通过读取环境变量来获取容器中的一些配置信息。

示例应用:使用变量设置应用程序的端口

假设我们有一个使用 Node.js 编写的 Web 应用程序,我们希望能够在构建镜像时通过变量来设置应用程序监听的端口。下面是一个使用 ARG 和 ENV 来设置应用程序端口的例子:

# 设置 ARG 变量
ARG PORT=3000

# 设置 ENV 变量
ENV PORT=${PORT}

# 安装 Node.js
RUN curl -sL  | bash -
RUN apt-get install -y nodejs

# 拷贝应用程序代码到容器中
COPY . /app

# 设置工作目录
WORKDIR /app

# 安装依赖
RUN npm install

# 暴露端口
EXPOSE ${PORT}

# 启动应用程序
CMD ["npm", "start"]

在上面的例子中,我们首先使用 ARG 定义了一个名为 PORT 的变量,并将其默认值设置为 3000。然后使用 ENV 将这个变量的值设置为容器中的环境变量。接着使用 curl 和 apt-get 安装了 Node.js,然后拷贝了应用程序代码到容器中,并设置了工作目录。然后运行了 npm install 安装了应用程序的依赖。最后使用 EXPOSE 指令将应用程序监听的端口暴露出来,并使用 CMD 启动了应用程序。

在构建镜像时,我们可以通过以下命令来传递一个新的值给 PORT 变量:

docker build --build-arg PORT=8080 .

通过上面的命令,我们将 PORT 变量的值改为 8080,并将其传递给构建镜像的过程。最终构建的镜像中的应用程序将监听 8080 端口。

总结

在 Dockerfile 中,我们可以使用 ARG 和 ENV 指令来设置变量。