如何在运行docker compose up时将参数传递到docker容器



我有以下Dockerfile:

FROM python:3.6
ADD . /
RUN pip install -r requirements.txt
ENTRYPOINT ["python3.6", "./main.py"]

其中main.py接收使用argparse解析的运行时参数,如下所示:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('city')
args = parser.parse_args()
print(args.city)

我已经成功地从我的Dockerfile构建了一个docker映像,并使用运行了一个基于该映像的容器

docker run -it my-docker-image "los angeles"

这非常有效,python中的argparse接收到param"洛杉矶";作为我的python代码片段中的城市。

我现在正在努力完成

docker run -it my-docker-image "los angeles"

但是有一个docker-compose.yml文件。现在我的docker-compose.yml文件看起来像:

version: '3'
services:
data-worker:
image: url-to-my-docker-container-on-ecr-that-i-have-pulled-onto-my-local-machine
container_name: run-for-city
volumes:
- ~/.aws/:/root/.aws

然后我试着运行:

docker-compose up

它开始但失败了,说:

run-for-city | usage: main.py [-h] city
run-for-city | main.py: error: the following arguments are required: city
run-for-city exited with code 2

这很有道理,因为我在运行docker compose时需要通过城市参数,但不知道如何通过。

我试过了:

docker-compose up "los angeles" 

但这并没有奏效。

我需要在我的docker-compose.yml中添加一些东西,或者在docker-compase-up命令中添加一个参数吗?

在Docker术语中,您传递的额外参数是一个"命令";。(docker run中图像名称之后的任何内容都是命令;按照惯例,这是一个要运行的实际命令,但如果Dockerfile中有一个ENTRYPOINT,它会作为参数传递给入口点。(您可以在docker-compose.yml文件中复制这一点:

version: '3'
services:
data-worker:
image: 123456789012.dkr...
volumes:
- ~/.aws/:/root/.aws
command: ["los angeles"]  # <--

如果需要在命令行中传递,唯一真正的方法是通过环境变量。Compose将替换环境变量(注意,语法有些有限(,我相信会起作用

command: ["$CITY"]

你会用启动这个

CITY="los angeles" docker-compose up

最新更新