docker-compose build args 未传递给 Dockerfile

标签 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"
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

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

最佳答案

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

An ARG declared before a FROM is outside of a build stage, so it can't be used in any instruction after a FROM. - from docker docs

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

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

To use the default value of an ARG declared before the first FROM use an ARG instruction without a value inside of a build stage. - 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

关于docker-compose build args 未传递给 Dockerfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48831447/

相关文章:

postgresql - Docker群在容器中执行命令

python - Django 应用程序在容器内部运行,但无法解析容器外部的数据库

docker - 在Norton中进行哪些更改以允许Docker共享驱动器D

angular - 如何在 Docker 容器内运行单元测试

mysql - 如何将 prestashop docker 链接到现有的 mysql 服务器

mysql cli 到 127.0.0.1 但重定向到 172.17.0.1

docker - 如何从 Docker 容器创建镜像?

Docker 堆栈到 Kubernetes

python - 惯用方式管理Docker中的持久数据存储

docker - AWS 负载均衡器后面使用 Traefik 进行 HTTPS 重定向