运行docker-compose up时如何将参数传递给docker容器

时间:2020-07-24 23:06:20

标签: python docker docker-compose

我有以下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"

这很好用,在argparse中,python在我的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-compose up命令中添加一个参数,还是什么?

1 个答案:

答案 0 :(得分:0)

在Docker术语中,您要传递的额外参数是“命令”。 (docker run中映像名称之后的任何命令都是命令;通常是实际运行的命令,但是如果您的Dockerfile中有ENTRYPOINT,则会将其作为参数传递给入口点。)您可以复制在您的docker-compose.yml文件中:

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

如果您需要在命令行中传递它,那么唯一的真正方法是通过环境变量。 Compose will substitute environment variables(注意,语法略有限制),我相信这可以说

command: ["$CITY"]

您将使用

启动它
CITY="los angeles" docker-compose up