【问题标题】:docker-compose build args not passing to Dockerfiledocker-compose build args 未传递给 Dockerfile
【发布时间】:2018-02-16 16:52:59
【问题描述】:

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

我在摸不着头脑,为什么这不起作用。如果我更改节点版本号,则数字会更改。

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

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

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

    为什么参数 NODE_VERSION 有效?
    参数NODE_VERSIONFROM 之后不起作用。该参数仅用于FROM (FROM node:8)。在FROM 之后有一个同名的environment variable of the image。因此,您回显图像的环境变量而不是撰写文件的参数。

    但是FROM后面的参数可以使用默认值:

    要使用在第一个 FROM 之前声明的 ARG 的默认值,请在构建阶段使用不带值的 ARG 指令。 - from 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
    

    【讨论】:

    • 您对此的解释得非常好,给我留下了深刻的印象,太棒了,谢谢!
    • 我犯了这个错误,在我想用谷歌搜索之前,我已经把头撞在墙上一天了。您的回答在
    【解决方案2】:

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

    您可能正在尝试覆盖已由父映像设置的变量(在我的情况下,尝试设置已由ruby 父映像设置的BUNDLE_PATH)。

    如果是这种情况,您可以简单地将参数重命名为不会与父级冲突的名称(即,使用 ARG_BUNDLE_PATH 代替 BUNDLE_PATH)!

    ARG ARG_BUNDLE_PATH
    ENV BUNDLE_PATH=$ARG_BUNDLE_PATH
    

    更多详情请查看本期:https://github.com/moby/moby/issues/34494

    【讨论】:

    • 我被难住了一段时间,这救了我。谢谢!
    • 很棒的补充,这就是我遇到的问题
    猜你喜欢
    • 2021-09-11
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多