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 aFROM
is outside of a build stage, so it can't be used in any instruction after aFROM
. - 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 firstFROM
use anARG
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/