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
但是,这将失败。在broker和queueARG游戏从来没有通过给定的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 上?
这里有两个问题。ARG仅在构建时、创建映像时使用,并CMD在运行时、运行容器时定义一个步骤。ARG被实现为RUN步骤的环境变量,因此由 shell 来扩展环境变量。并且 json 语法不运行 shell。因此,要对 执行此操作CMD,您需要进行两项更改。
首先,您需要将您ARG的ENV值保存到图像元数据中,并用于在创建容器时设置环境。
其次,您需要从用于运行的 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 语法中不起作用。)
| 归档时间: |
|
| 查看次数: |
3726 次 |
| 最近记录: |