首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

无法在docker多阶段构建中使用ARG

在Docker的多阶段构建过程中,无法直接使用ARG指令来传递构建参数。ARG指令在Dockerfile中常用于在构建过程中传递变量,但在多阶段构建中存在一些限制。

多阶段构建是一种优化技术,可以减小生成的镜像大小并提高构建效率。它通过在多个构建阶段中执行不同的操作来实现。每个构建阶段都可以使用不同的基础镜像,并且可以选择性地复制前一个阶段生成的文件。

在多阶段构建中,每个构建阶段都有自己的上下文,并且在每个阶段中定义的ARG变量只在当前阶段有效。这意味着无法直接在后续阶段中访问之前阶段定义的ARG变量。

为了解决这个问题,可以使用ENV指令来传递参数。ENV指令在构建过程中设置环境变量,并且在后续构建阶段中仍然可见。

以下是一个示例,展示了如何在多阶段构建中传递参数:

代码语言:txt
复制
# 第一阶段:构建应用
FROM <基础镜像> as builder
ARG ARG_NAME
ENV ENV_NAME=$ARG_NAME
RUN <构建命令>

# 第二阶段:生成最终镜像
FROM <基础镜像>
COPY --from=builder /path/to/built/files /app
ENV ENV_NAME
CMD ["<启动命令>"]

在上述示例中,我们在第一阶段使用ARG指令定义了一个构建参数ARG_NAME,并且通过ENV指令将其赋值给环境变量ENV_NAME。在第二阶段中,我们可以通过COPY指令从第一阶段复制构建好的文件,并且通过ENV指令将环境变量ENV_NAME导入到最终的镜像中。

需要注意的是,ARG和ENV指令都是在构建时期执行的,而不是在容器运行时期执行的。因此,无法通过在运行容器时传递参数的方式来设置ARG或ENV变量。

希望这个回答对您有帮助。如有更多疑问,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用 Docker 开发 - 使用多阶段构建镜像

多阶段构建是一个新特性,需要 Docker 17.05 或更高版本的守护进程和客户端。对于那些努力优化 Dockerfiles 并使其易于阅读和维护的人来说,多阶段构建非常有用。...多阶段构建之前 构建镜像时最具挑战性的事情之一就是缩小镜像大小。Dockerfile 的每一条指令都会在镜像添加一个层,进入下一层之前,您需要记住清除所有不需要的工件。...多阶段构建极大地简化了这种情况! 使用多阶段构建 对于多阶段构建,可以 Dockerfile 中使用多个 FROM 语句。每个 FROM 指令都可以使用不同的基镜像,并且它们都开始了构建的新阶段。...您可以选择性地将工件从一个阶段复制到另一个阶段,舍弃最终镜像您不想要的所有内容。为了说明这是如何工作的,让我们使用多阶段构建调整前一节的 Dockerfile。...使用外部镜像作为“阶段” 当使用多阶段构建时,您不受限于从 Dockerfile 先前创建的阶段进行复制。

90500

Gitlab 构建 Docker 镜像

如何在以 Pod 形式运行的 Runner 构建镜像并完成推送。 跨 Runner 的文件共享 Gitlab 提供了两种方式的文件共享方式,用于不同 Runner 之间传递文件。...Cache:用于构建过程传递一些中间文件,无需长久保存,例如下载的依赖文件。 Artifact:构建过程生成的交付目标,需要保存一定时间,例如生成的 JAR、测试报告等交付文件。...这里我们准备使用 Artifact 的方式将 JAR 转发给 Docker 构建过程。...这里生成的 JAR 文件将在后续用来构建 Docker 镜像。 Pod 内构建 Docker 镜像 Docker 提供了一个 dind 镜像,意思就是“Docker in Docker”。...但它使用的是使用 EntryPoint 启动守护进程的方式来完成对 Docker 的支持,而 Runner 启动时,会被替换入口函数,因此这里决定采用 IMG 工具来进行构建

2.3K40
  • 【前端部署第四篇】使用 Docker 构建缓存及多阶段构建优化单页应用

    以下,便是 cra 获得静态资源的命令。...构建时间优化: 构建缓存 我们注意到,一个前端项目的耗时时间主要集中两个命令: npm install (yarn) npm run build 本地环境,如果没有新的 npm package 需要下载...「那 Docker 是不也可以做到这一点?」 Dockerfile ,对于 ADD 指令来讲,如果「添加文件内容的 checksum 没有发生变化,则可以利用构建缓存」。...构建体积优化: 多阶段构建 我们的目标静态资源,完全不需要依赖于 node.js 环境进行服务化,而 node.js 环境将造成极大的资源浪费。...我们可以使用多阶段构建进行优化,最终使用 nginx 进行服务化。

    1.6K20

    如何使用一个 Dockerfile 文件描述多个镜像

    我们知道 Docker v17.05 版本后就开始支持多阶段构建 (multistage builds)了,使用多阶段构建我们可以加速我们的镜像构建一个 Dockerfile 文件中分不同的阶段来处理镜像...除此之外,Docker 多阶段构建还可以只构建某一阶段的镜像,比如我们一个项目中由于需求可能会最终打包成多个 Docker 镜像,我们当然可以为每一个镜像单独编写一个 Dockerfile,但是这样还是比较麻烦...遇到这种需求我们就可以直接使用多阶段构建来解决。...USER root:root ENTRYPOINT ["/restore-agent"] 我们可以看到在这一个 Dockerfile 我们使用多阶段构建定义了很多个 Targets,当我们构建镜像的时候就可以通过...--target 参数来明确指定要构建的 Targets 即可,比如我们要构建 controller 这个目标镜像,则直接使用下面的命令构建即可: $ docker build --target controller

    7.6K20

    Dockerfile(15) - ARG 指令详解

    ARG 作用:定义创建镜像过程中使用的变量 格式: ARG [=] 详解 执行 docker build 时,可以通过 来为声明的变量赋值 --build-arg...、HTTPS_PROXY、FTP_PROXY、NO_PROXY ARG 和 ENV 的区别 ARG 定义的变量只会存在于镜像构建过程,启动容器后并不保留这些变量 ENV 定义的变量启动容器后仍然保留...注意 不要通过 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的 ARG 指令有生效范围 如果在 FROM 指令之前指定,那么只能用于 FROM 指令 ARG...会发现无法输出 ${DOCKER_USERNAME} 变量的值 要想正常输出,必须在 FROM 之后再次指定 ARG # 只 FROM 中生效 ARG DOCKER_USERNAME=library...${DOCKER_USERNAME} 多阶段构建的时候,ARG 定义的变量,每个 FROM 都能用 # 这个变量每个 FROM 中都生效 ARG DOCKER_USERNAME=library FROM

    4.5K40

    Dockerfile 的 multi-stage 特性,Vue 项目多阶段构建实战

    但是之前镜像构建之前是需要使用 npm 进行项目打包生产 dist 文件之后才能进行镜像构建,不过最近我使用 Jenkins pipeline 的时候突然想到了 Dockerfile 的多阶段构建,...多阶段构建场景 所谓的多阶段构建,就是当有的服务是需要编译环境进行编译或者打包,然后才能将构建产物移到运行环境的多个阶段的构建形式。...说的简单一点,就是当一个项目从项目代码到构建Docker 镜像的过程需要在不同的环境中进行的场景,那就属于多阶段构建。...可以看到,上面的两个步骤,使用了不同的环境,打包静态资源的时候是 node 环境,而最终的运行环境是 nginx 基础镜像,所以这很符合多阶段构建的场景。...多阶段构建步骤 Dockerfile 的 multi-stage 特性允许一个 Dockerfile 引用多个基础镜像,可以对每个引用的镜像进行单独的操作,然后可以将每个镜像的文件等内容进行传递。

    95220

    你不知道的 Dockerfile 增强新语法

    Dockerfile 是使用 Docker 的相关开发人员的基本工具,用来充当构建 Docker 镜像的模板,在这个文件包含用户可以命令行上调用来构建镜像的所有命令。...新版本,我们向 Docker Hub 发布了两个此类镜像:docker/dockerfile:1.7.0 和 docker/dockerfile:1.7.0-labs。...# VERSION is now 1.2.3 又比如下面的这个示例同一个 VERSION 变量我们可以不同的地方多次使用ARG VERSION=v1.7.13 ADD https://github.com...以前,使用单个命令无法实现这种复制。您可能需要单个文件的多个副本,或者使用 RUN --mount 指令的一些解决方法。...新的 --parents 标志不仅适用于构建上下文中的 COPY 指令,当使用 COPY --from 多阶段之间复制文件时,还可以多阶段构建使用它们。

    18410

    走进向量计算:制作 OpenBLAS Docker构建产物镜像

    即使Docker Buildx 只能模拟 CPU 架构来进行 Multi-ARCH 构建,但是却无法模拟 CPU 类型,无法满足不同指令集的硬件产物构建。...然后再将构建完毕的内容,复制到一个崭新的空白容器里,来简化容器复杂度,以及方便后续 Milvus 或其他软件的构建过程使用。 或许有小伙伴好奇,为什么一定要使用多阶段构建呢。...GitHub Release 的源码包存在网络问题,可以考虑构建参数中使用 --build-arg=https_proxy=YOUR_PROXY_ADDR ,强制内容获取走你的指定网络来解决问题。...准备好 Dockerfile 之后,我们使用下面的命令进行 ARMv8 环境下的镜像构建docker build \ --build-arg=LTS=22.04 \ --build-arg...如何使用 镜像的使用本为两部分,第一部分是获取镜像,你既可以使用我制作好的镜像,也可以进行自行构建。第二部分,则是容器中使用多阶段构建,完成“软件安装”(跨镜像文件 COPY)。

    57510

    走进向量计算:制作 OpenBLAS Docker构建产物镜像

    即使Docker Buildx 只能模拟 CPU 架构来进行 Multi-ARCH 构建,但是却无法模拟 CPU 类型,无法满足不同指令集的硬件产物构建。...然后再将构建完毕的内容,复制到一个崭新的空白容器里,来简化容器复杂度,以及方便后续 Milvus 或其他软件的构建过程使用。 或许有小伙伴好奇,为什么一定要使用多阶段构建呢。...GitHub Release 的源码包存在网络问题,可以考虑构建参数中使用 --build-arg=https_proxy=YOUR_PROXY_ADDR ,强制内容获取走你的指定网络来解决问题。...准备好 Dockerfile 之后,我们使用下面的命令进行 ARMv8 环境下的镜像构建docker build \ --build-arg=LTS=22.04 \ --build-arg...如何使用 镜像的使用本为两部分,第一部分是获取镜像,你既可以使用我制作好的镜像,也可以进行自行构建。第二部分,则是容器中使用多阶段构建,完成“软件安装”(跨镜像文件 COPY)。

    57320

    【Spring Boot 升级系列】第二篇:微服务容器化实践

    前言 我之前的文章 我们学习了如何创建一个简单的 Spring Boot 应用程序,我们还学习了如何将其打包为 jar 文件并在本地运行。但是,目前在生产环境docker 被广泛采用。...第二阶段,我们运行打包的应用程序。一旦我们有了打包的应用程序,我们就不再需要 mvn 和 JDK 了。我们所需要的只是一个 JRE。 多阶段 docker 构建的想法来了。...多阶段 docker 构建中,我们可以从前几个阶段挑选工件,并丢弃所有前几个阶段的任何内容。 以下是我们如何做到这一点。...CMD ["java","-jar","app.jar"] 在上面的 docker 文件,我们有两个阶段。第一阶段构建构建阶段。构建阶段,我们下载 maven 并编译我们的 java 源代码。...第二阶段生产中,我们运行打包的应用程序。了解有关多阶段 docker 构建的更多信息 Multi-stage builds | Docker Docs 。

    13310

    Dockerfile语法概要

    、bzip2、xz格式的压缩包,ADD指令将会自动解压缩这个压缩文件到目标路径去 2.5 ARG ARG设置的是构建时的参数,也可以理解为构建时的环境变量,与ENV的不同是只构建时生效,生成的镜像是不存在的...可以ARG同时声明参数名和参数值 也可以只声明参数名,构建时通过–build-arg=的形式来赋值,赋值的前提是Dockerfile中进行了声明,否则会出现警告 语法为 ARG...前面提到可以RUN指令添加--no-cache不使用缓存,同样也可以执行docker build命令时添加该指令以镜像构建时不使用缓存 3.2 忽略构建 和git忽略文件.gitignore一样的道理...如果需要从源码编译构建应用,最好的方式就是使用多阶段构建 简单来说,多阶段构建就是允许一个Dockerfile中出现多条FROM指令,只有最后一条FROM指令中指定的基础镜像作为本次构建镜像的基础镜像,...其它的阶段都可以认为是只为中间步骤 每一条FROM指令都表示着多阶段构建过程的一个构建阶段,后面的构建阶段可以拷贝利用前面构建阶段的产物 这里我列举一个编译构建npm项目,利用多阶段构建最终把静态资源制作成

    69010

    Dockerfile 之最小化 Java 镜像的常用技巧

    多阶段构建 Java 程序的运行只依赖 JRE,并不需要 maven 或者 JDK 众多用于编译、调试、运行的工具,因此一个明显的优化方法是将用于编译构建 java 源码的镜像和用于运行 java 应用的镜像分开...为了达到这一目的, docker 17.05 版本之前需要用户维护 2 个 dockerfile 文件,这无疑增加了构建的复杂性。...好在自 17.05 开始,docker 引入了多阶段构建的概念,它允许用户一个 dockerfile 中使用多个 From 语句。...使用 distroless 作为基础镜像 虽然通过多阶段构建能减小最终生成的镜像的大小,但 459MB 的体积仍相对过大。...使用 distroless 的唯一不便是您无法 attach 到一个正在运行的容器上排查问题,因为镜像不包含 shell。

    5.8K40
    领券