Docker compose参数未传递给Dockerfile

Docker compose参数未传递给Dockerfile,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我有一个docker compose.yml文件,其中包含一个带有Dockerfile的给定服务的构建上下文 docker compose示例: version: '3' services: scd-service: build: context: ./cmd/some-service/ dockerfile: Dockerfile args: broker: redis:6379 queue: somequeu

我有一个
docker compose.yml
文件,其中包含一个带有
Dockerfile
的给定服务的构建上下文

docker compose示例:

version: '3'

services:

  scd-service:
    build:
      context: ./cmd/some-service/
      dockerfile: Dockerfile
      args:
        broker: redis:6379
        queue: somequeue
    depends_on:
      - redis
    networks:
      - backend

  redis:
    image: "redis:alpine"
    restart: unless-stopped
    networks:
      - backend
它可以找到
Dockerfile
并使用:
docker compose-up——build some service

然而,这将失败。
代理
队列
参数永远不会传递给给定的Dockerfile

示例
Dockerfile

FROM golang:1.11

// stuff...

ARG broker
ARG queue

CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker $broker", "--queue $queue"]
正如在构建阶段中所看到的那样,这些内容从未被解析:

Step 7/7 : CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker $broker", "--queue $queue"]
此后,由于命令行参数无效,Go程序崩溃

如何将参数从
docker compose
解析为
Dockerfile

编辑:奇怪的是,我能回显正确的值吗

例如:

ARG broker
ARG queue

RUN echo ${broker}
产出:

Step 7/8 : RUN echo ${broker}
 ---> Running in c84828847d9a
redis:6379

如何将其解析到CMD上?

如果希望它们在基于图像的容器(运行端)上可用,则应将其设置为
ENV
。比如:

ENV broker $broker   //assign your env broker value to container
ENV queue  $queue
ARG broker=your.broker.value
ENV broker=${broker}
ARG

当您创建映像时,这些功能是可用的,但当您想要运行基于该映像的容器时,这些功能就不可用了

ENV

ENV
值可用于容器,也可运行样式命令。如果希望参数在运行时可用,这些参数是很好的

您还可以找到有关环境值的有用信息

编辑。为了避免[警告]一个或多个生成参数[]未被消息使用,您应该执行以下操作:

ENV broker $broker   //assign your env broker value to container
ENV queue  $queue
ARG broker=your.broker.value
ENV broker=${broker}

错误是告诉您有未使用的参数(尽管现在您有了环境,不设置参数也可以)。更多信息。

这里有两个问题
ARG
仅在创建映像时在构建时使用,而
CMD
在运行容器时在运行时定义一个步骤
ARG
被实现为
RUN
步骤的环境变量,因此由shell来展开环境变量。json语法不运行shell。因此,要使用
CMD
执行此操作,您需要进行两项更改

首先,您需要将
ARG
保存为
ENV
值,该值将保存到图像元数据中,并在创建容器时用于设置环境

其次,您需要从运行
CMD
的exec/json语法切换到运行将扩展这些变量的shell。Docker使用字符串语法为您完成此操作

最终结果如下:

FROM golang:1.11

// stuff...

ARG broker
ENV broker=${broker}
ARG queue
ENV queue=${queue}

CMD go run /go/src/github.com/org/project/cmd/some-service/some-service.go --broker "$broker" --queue "$queue"

另外,您还应该注意,exec语法中的每个参数都需要是一个单独的数组项,例如:

CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker $broker", "--queue $queue"]
与跑步相似:

go run /go/src/github.com/org/project/cmd/some-service/some-service.go "--broker $broker" "--queue $queue"
当你真的想跑步时:

CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker", "your_broker", "--queue", "your_queue"]
这类似于:

go run /go/src/github.com/org/project/cmd/some-service/some-service.go --broker "your_broker" --queue "your_queue"

(注意,我从示例中删除了变量,因为它们在exec语法中不起作用。)

Build args仅在构建时可用,但
CMD
条目在运行时执行。这里有一个参考和可能的解决方案:你能提供一个例子吗?仅用
ENV
替换
ARG
似乎是无效的语法。确定!这是一个愚蠢的示例,但提供的链接可能会更好地指导您:)通过您的示例,我得到:
[Warning]一个或多个构建参数[queue broker]未被使用
编辑,这似乎与不使用您提供的参数(愚蠢的docker)有关。
您的.broker.value
指的是什么?这大概是docker compose应该传递的内容?谢谢你的帮助。看起来容器现在无法看到另外指定的redis容器,但一次只能看到一个问题。干杯,它成功了。ARG可以在生成时和运行时使用,但需要按照文档中的说明声明:@AshishSingh创建映像时,运行步骤在生成时执行。CMD步骤在创建容器时在运行时执行。是的,术语有点混乱。