当前位置: 首页 > 知识库问答 >
问题:

Docker-compose参数不传递给Dockerfile

咸昀
2023-03-14
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

然而,这将失败。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"]
ARG broker
ARG queue

RUN echo ${broker}

产出:

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

如何不将其解析到cmd上?

共有1个答案

盛骏祥
2023-03-14

这里有两个问题。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"
 类似资料:
  • 问题内容: Docker 1.9允许将参数传递给dockerfile。参见链接:https : //docs.docker.com/engine/reference/builder/#arg 如何在docker-compose.yml中传递相同的参数? 如果可能,也请提供示例。 问题答案: 此功能已在Compose 1.6中添加。 参考:https : //docs.docker.com/comp

  • 问题内容: docker-compose.yml: Dockerfile: 结果是: 我ing不休,为什么这不起作用。如果更改节点版本号,则该数字也会更改。 问题答案: 在compose文件上定义的参数在Dockerfile上可用,但仅在之前和之上可用。在参数不可用之后: 在a之前的声明位于构建阶段之外,因此不能在以后的任何指令中使用它。- 来自docker docs 为什么论点起作用? 。之后的

  • 有时对一个类的某些方面进行 参数化(parameterize)是很有用的。例如, 你可能需要管理不同版本的 gem 软件包,既可以为每一种版本创建分离的单独的类, 也可以使用继承和覆盖,为一个类传递一个版本号作为参数。 操作步骤 声明参数作为如下类定义的一部分: class eventmachine( $version ) { package { "eventmachine": pro

  • 问题内容: 我正在使用Go内置的http服务器,并拍拍来响应一些URL: 我需要向该处理函数传递一个额外的参数-一个接口。 如何向处理程序函数发送额外的参数? 问题答案: 通过使用闭包,您应该能够做您想做的事情。 更改为以下内容(未测试): 然后对

  • 我在解一个有很多常数的非线性方程 我创建了一个用于解决以下问题的函数: 然后我想做: 但是正在解包并向函数传递太多参数,因此我得到: TypeError:terminalV()正好接受2个参数(给定6个) 那么,我的问题是,我是否可以通过某种方式将元组传递给调用的函数?

  • 问题内容: 我编写了一个Java应用程序,该应用程序使用一个环境变量,该变量带有一个参数来设置JWT令牌盐密钥的密钥。我有办法在Docker Compose中传递命令变量吗? 并运行docker image 问题答案: 如果您已经能够使用以下命令运行docker容器: 然后,您只需要在撰写文件中将您的属性覆盖为–key = blah即可。所以: