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
然而,这将失败。broker
和queue
参数从不传递给给定的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上?
这里有两个问题。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即可。所以: