docker compose生成参数未传递到Dockerfile
docker-compose.yml: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"
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秒内解决了我的问题。我被难住了一段时间,这救了我。非常感谢。另外,这就是我的问题所在