【问题标题】:Docker-compose args are not passed to DockerfileDocker-compose args 未传递给 Dockerfile
【发布时间】:2019-10-25 21:53:14
【问题描述】:

我有一个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 构建它

但是,这将失败。 brokerqueue 参数永远不会传递给给定的 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 程序由于命令行参数无效而崩溃。

如何将 args 从 docker-compose 解析为 Dockerfile

编辑:奇怪的是,我可以回显正确的值吗?

例子:

ARG broker
ARG queue

RUN echo ${broker}

输出:

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

如何不解析到 CMD 上?

【问题讨论】:

标签: docker docker-compose dockerfile


【解决方案1】:

这里有两个问题。 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 语法中不起作用。)

【讨论】:

  • 感谢您的帮助。似乎容器现在看不到以其他方式指定的 redis 容器,但一次出现一个问题。干杯,它奏效了。
  • ARG 可以在 BUILD 期间和 RUN 期间使用,但需要按照文档中的说明进行声明:docs.docker.com/engine/reference/builder/…
  • @AshishSingh RUN 步骤在构建时执行,当您创建映像时。当您创建容器时,CMD 步骤在运行时执行。是的,术语有点混乱。
【解决方案2】:

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

ENV broker $broker   //assign your env broker value to container
ENV queue  $queue

ARG

这些在您创建映像时可用,但在您想基于该映像运行容器时不可用。

环境

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

您还可以找到有关 env 值 here 的有用信息。

编辑。为了避免 [警告] 一个或多个 build-args [] 没有被消费 消息,您应该执行以下操作:

ARG broker=your.broker.value
ENV broker=${broker}

错误是告诉你有未使用的 ARGS(尽管你现在有 ENV,不设置它们可能没问题)。更多信息here 也是如此。

【讨论】:

  • 你能举个例子吗?将ARG 换成ENV 似乎是无效的语法。
  • 当然!这是一个愚蠢的例子,但提供的链接可能会更好地指导你:)
  • 以你的例子,我得到:[Warning] One or more build-args [queue broker] were not consumed
  • 已编辑,这似乎与不使用您提供的参数有关(silly docker
  • your.broker.value 指的是什么?这应该是 docker-compose 传递的内容吧?
猜你喜欢
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2020-01-11
  • 2020-02-23
相关资源
最近更新 更多