Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker compose生成参数未传递到Dockerfile_Docker_Docker Compose - Fatal编程技术网

docker compose生成参数未传递到Dockerfile

docker compose生成参数未传递到Dockerfile,docker,docker-compose,Docker,Docker Compose,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"

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

我在琢磨为什么这不起作用。如果我更改了节点版本号,则编号也会更改。

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

在来自的
之前声明的
ARG
在生成阶段之外,因此不能在来自的
之后的任何指令中使用-

为什么参数
节点\u版本
起作用?

参数
节点\u VERSION
中的
之后不起作用。此参数仅用于
FROM
FROM节点:8
)上。在FROM
之后,有一个同名的。因此,您将回显图像的环境变量,而不是compose文件的参数

但是您可以在
中的
之后使用参数的默认值:

要使用在第一个
FROM
之前声明的
ARG
的默认值,请使用在生成阶段中没有值的
ARG
指令。-


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

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
version: "3"

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

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
version: "3"

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

如果你来到这里,语法和一切都很好,但是变量仍然没有通过

可能是您试图覆盖父映像已设置的变量(在我的示例中,尝试设置父映像已设置的
BUNDLE\u PATH

如果是这种情况,您可以简单地将参数重命名为不会与父级冲突的参数(即,使用
ARG\u BUNDLE\u PATH
,而不是
ARG\u BUNDLE\u PATH


有关更多详细信息,请参阅本期:

我对您的解释印象深刻,太棒了,谢谢!我犯了这个错误,在我想用谷歌搜索它之前,我已经用头撞了一天的墙。你的回答在30秒内解决了我的问题。我被难住了一段时间,这救了我。非常感谢。另外,这就是我的问题所在