当前位置: 首页 > 面试题库 >

docker-compose构建args没有传递给Dockerfile

万俟光临
2023-03-14
问题内容

docker-compose.yml:

version: "3"

services:
  ei:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        NODE_VERSION: 8
        HELLO: 5

Dockerfile:

ARG NODE_VERSION
ARG HELLO

FROM node:$NODE_VERSION

RUN echo "-> $HELLO"
RUN echo "-> $NODE_VERSION"

结果是:

km@Karls-MBP ~/dev/ve (km/ref) $ docker-compose -f docker-compose.yml build --no-cache
vertica uses an image, skipping
Building ei
Step 1/14 : ARG NODE_VERSION
Step 2/14 : ARG HELLO
Step 3/14 : FROM node:$NODE_VERSION
 ---> e63de54eee16
Step 4/14 : RUN echo "-> $HELLO"
 ---> Running in e93d89e15913
-> 
Removing intermediate container e93d89e15913
 ---> c305b277291c
Step 5/14 : RUN echo "-> $NODE_VERSION"
 ---> Running in 39e8e656c0bd
-> 8

我ing不休,为什么这不起作用。如果更改节点版本号,则该数字也会更改。


问题答案:

在compose文件上定义的参数在Dockerfile上可用,但仅在之前和之上可用FROM。在FROM参数不可用之后:

ARG在a之前的声明FROM位于构建阶段之外,因此不能在以后的任何指令中使用它FROM。- 来自docker
docs

为什么论点NODE_VERSION起作用?
NODE_VERSION之后的说法无效FROM。该参数仅用于FROMFROM node:8)。之后FROM是具有相同名称的图像的环境变量。因此,您回显图像的环境变量,而不是撰写文件的参数。

但是,您可以在以下位置使用参数的默认值FROM

ARG在第一次FROM使用声明之前使用默认值,请在ARG构建阶段使用不带值的指令。- 来自docker
docs

ARG NODE_VERSION

FROM node:$NODE_VERSION

ARG HELLO

RUN echo "-> $HELLO"
RUN echo "-> $NODE_VERSION"

要使用并显示参数中定义的节点版本,您需要重命名此参数。因此,您可以使用以下命令显示图像的所有参数和环境变量:

Dockerfile:

ARG CUSTOM_NODE_VERSION

FROM node:$CUSTOM_NODE_VERSION

ARG CUSTOM_NODE_VERSION
ARG HELLO

RUN echo "-> $HELLO"               #output: 5
RUN echo "-> $NODE_VERSION"        #output: 8.9.4
RUN echo "-> $CUSTOM_NODE_VERSION" #output: 8

docker-compose.yml:

version: "3"

services:
  ei:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        CUSTOM_NODE_VERSION: 8
        HELLO: 5


 类似资料:
  • 然而,这将失败。和参数从不传递给给定的DockerFile。 示例: 正如在构建阶段中显而易见的那样,它们从未被解析过: 产出: 如何不将其解析到cmd上?

  • 问题内容: 特别是,我想做这样的事情: 哦,我想这样做而不必修改pom文件或设置任何环境变量。 问题答案: 我认为最适合您。参见此处:http : //maven.apache.org/configure.html 在Unix中: 添加环境变量以指定JVM属性,例如。此环境变量可用于向Maven提供其他选项。 在Win中,您需要通过对话框设置环境变量 通过打开系统属性()添加…环境变量,…在同一对

  • 在Docker主机上,我有: app.js DockerFile: 我还尝试在docker-compose.yml中使用,如下所示,这同样只使它在运行时可用,而不是在构建时可用: 请指教,我怎样才能使它以最不费解的方式工作?

  • 问题内容: 我有一个简单的问题。我曾尝试在许多博客中搜索有关此问题的信息,但所有站点都返回了如何快速运行功能,但我需要这种情况。 我的自定义函数是: 如何通过args将args传递给其他系统函数? 谢谢前进。 问题答案: 与(Objective-)C中类似,您不能将变量参数列表直接传递给另一个函数。您必须创建一个 (与C语言中的Swift等效)并调用一个带有参数的函数。 所以这可能是您要寻找的:

  • 问题内容: 我正在尝试使用单个,几个文件和几个文件为多个环境创建配置。我需要它为每个环境使用具有python依赖关系的其他文件。 假设我们在两个环境中创建服务:和。为此,我创建了以下文件结构: 目的是在容器的过程中实例化文件的专有名称。根据文档,我尝试了这种天真的方法,这种方法似乎不起作用: 将名称定义为环境变量: envs / dev.env: envs / prod.env: 在 Docker

  • 这个码头商。yml: 使用这个。env文件(它位于根文件夹中,如docker-compose.yml和Dockerfile): 和节点服务器启动中的以下代码: 我真的更喜欢使用第一种或第二种方法 docker版本:18.06.1-CE docker-compose版本:1.19.0