我做了以下Dockerfile
:
FROM python:3.7
WORKDIR /app
# Install python dependencies
ADD requirements.txt /app/
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt
# Copy sources
ADD . /app
# Read arguments
ARG top_k=5
ARG threshold=0.5
ARG broker=broker.mqttdashboard.com
ARG port=8000
ARG topic=topic/truc
# Run detection
CMD python3 detect.py --top_k ${top_k} --threshold ${threshold} --broker ${broker} --port ${port} --topic ${topic}
该建筑运行良好,但是当我尝试运行容器时,我收到一个错误,说缺少参数:
usage: detect.py [-h] [--top_k TOP_K] [--threshold THRESHOLD]
[--broker BROKER] [--port PORT] [--topic TOPIC]
detect.py: error: argument --top_k: expected one argument
python代码是非常基本的:
parser = argparse.ArgumentParser()
parser.add_argument('--top_k', type=int, default=3, help='Number of categories with highest score to display')
args = parser.parse_args()
我对 DockerARG
有什么不明白的吗? 我的计划是在kubernetes
yaml 文件中编辑这些参数。
ARG
在这里没有意义。 这是一种在生成映像时传入选项的方法,但要更改这些选项,需要重新生成它。 在这种情况下,您只是尝试在运行脚本时提供选项。
一种方法是将这些选项作为命令行选项传递。 具有运行脚本的默认CMD
,但在运行容器时覆盖该。
# In the Dockerfile, no ARGs, and a default
CMD ./detect.py
docker run --rm ... my/image
./detect.py --top_k 5
这里的变体是将命令提供为ENTRYPOINT
,将选项提供为CMD
。
ENTRYPOINT ["./detect.py"] # must be JSON-array form
# CMD ["--help"] # must be JSON-array form
docker run --rm ... my/image
--top_k 5
在这两种情况下,Kubernetesargs:
在docker run
命令中的映像名称后指定"命令"部分。
image: my/image
args:
- --top_k
- 5
更新应用程序代码以直接接受这些选项作为环境变量可能更易于管理
parser.add_argument('--top_k', type=int,
default=int(os.environ.get('TOP_K', '3')), # <-----
help='Number of categories with highest score to display')
然后在 Dockerfile 中,如果需要在 Docker 上下文中更改这些默认值,您可以将这些默认值指定为ENV
变量
ENV TOP_K=5
CMD ["./detect.py"] # with no additional arguments
但是,在运行容器时提供单独的环境值设置非常简单。
docker run --rm ...
-e TOP_K=20
my/image
image: my/image
env:
- name: TOP_K
value: '20' # must be a YAML string
您遇到的机械问题是ARG
值仅插入到环境中以进行RUN
命令,而不是ENTRYPOINT
或CMD
。 如果您使用ENV
而不是ARG
,或者同时使用两者以使选项在构建时可配置,但随后作为环境变量保存在映像中,则您显示的语法可能会起作用,但设置和维护起来会更棘手。
使用ENV
而不是ARG
ARG
- 用于构建步骤,ENV
- 在运行时使用
您可以创建一个 shell 脚本
#!/bin/sh
# --> I need $DATA to be set
if [ -z "$DATA" ]; then
echo "Please set a DATA environment variable" >&2
exit 1
fi
echo "You are running $DATA version of your app"
exec "$@"
运行码头工人:docker run --rm -e DATA=some_data docker_image_name /bin/true
您可以在 Dockerfile 中指定默认数据
FROM centos:7.4.1708
COPY ./run.sh /usr/local/bin
RUN chmod a+x /usr/local/bin/run.sh
ENV DATA=default_data"
ENTRYPOINT ["run.sh"]
Kubernetes config
image: image/docker
env:
- name: DATA
value: '20'
选项 : 2 :命令行参数
外壳脚本:run.sh
#!/bin/sh
# --> pass a data, thn command, as parameters
DATA="$1"
if [ -z "$DATA" ]; then
echo "Please pass DATA as a command-line" >&2
exit 1
fi
echo "Details of data $DATA"
shift
export DATA #This will set argument as environment
exec "$@"
运行码头工人
docker run --rm docker_image_name **some_data** /bin/true
在选项 2 中,您将参数设置为环境变量。
如果可能,请使用环境变量而不是参数。