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步骤在创建容器时在运行时执行。是的,术语有点混乱。