Dockerfile ARG 用于运行 python 脚本



我做了以下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有什么不明白的吗? 我的计划是在kubernetesyaml 文件中编辑这些参数。

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命令,而不是ENTRYPOINTCMD。 如果您使用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 中,您将参数设置为环境变量。

如果可能,请使用环境变量而不是参数。

相关内容

  • 没有找到相关文章

最新更新