Docker-compose args 不会传递给 Dockerfile

cbl*_*bll 3 docker dockerfile docker-compose

我有一个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
Run Code Online (Sandbox Code Playgroud)

它可以找到Dockerfile并构建它:docker-compose up --build some-service

但是,这将失败。在brokerqueueARG游戏从来没有通过给定的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"]
Run Code Online (Sandbox Code Playgroud)

在构建阶段很明显,这些永远不会被解析:

Step 7/7 : CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker $broker", "--queue $queue"]
Run Code Online (Sandbox Code Playgroud)

此后,由于命令行参数无效,Go 程序崩溃。

如何解析 args from docker-composeto a Dockerfile

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

例子:

ARG broker
ARG queue

RUN echo ${broker}
Run Code Online (Sandbox Code Playgroud)

输出:

Step 7/8 : RUN echo ${broker}
 ---> Running in c84828847d9a
redis:6379
Run Code Online (Sandbox Code Playgroud)

这如何不被解析到 CMD 上?

BMi*_*tch 5

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

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

其次,您需要从用于运行的 exec/json 语法切换CMD到运行将扩展这些变量的 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"
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您还应该注意 exec 语法中的每个参数都需要是一个单独的数组条目,例如:

CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker $broker", "--queue $queue"]
Run Code Online (Sandbox Code Playgroud)

类似于运行:

go run /go/src/github.com/org/project/cmd/some-service/some-service.go "--broker $broker" "--queue $queue"
Run Code Online (Sandbox Code Playgroud)

当你真的想运行时:

CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker", "your_broker", "--queue", "your_queue"]
Run Code Online (Sandbox Code Playgroud)

这将类似于:

go run /go/src/github.com/org/project/cmd/some-service/some-service.go --broker "your_broker" --queue "your_queue"
Run Code Online (Sandbox Code Playgroud)

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