【问题标题】:Unable to solve this basic error invalid literal for int() with base 10无法解决这个基本错误 int() 以 10 为底的无效文字
【发布时间】:2020-11-05 18:35:38
【问题描述】:

我正在尝试自动化构建 docker 映像的过程。我有以下 docker 图像传递命令行参数,在 python 脚本中检索参数。

自动化

#!/bin/bash
docker build -t test . --build-arg split=$split
docker run --rm -it test

Dockerfile

FROM tensorflow/tensorflow:latst-py3
RUN mkdir -p /test/src
ARG split
WORKdir  /test/src
COPY . ./
CMD["python", "script.py","$split"]

python 脚本

m1=testing(int(sys.argv[1])

运行 bash 脚本

bash ./automate.sh 5

在运行上述代码时,我正在检索以下错误

ValueErro: invalid literal for int() with base 10; 'split'

非常感谢您的帮助。谢谢

【问题讨论】:

  • 这是否回答了您的问题Is Docker ARG allowed within CMD instruction?我对 Docker 比较陌生,但很明显,您将字符串“split”传递给 Python,而不是命令行中的数字字符串,因此显然 $split 无法解析为实际参数值,并根据CMD 实际预期的链接。
  • $split 似乎没有像您预期的那样展开。
  • 在您的 Python 脚本中,为什么不简单地打印 sys.argv
  • @barny 不需要,错误信息已经告诉你它是什么:'split'
  • 是的,但是如果 OP 学会调试,即使只打印导致错误的原因,也许他们会在调试方面做得更好?

标签: python python-3.x docker


【解决方案1】:

automat.sh 文件中的$split 为空。

如果你想在automat.sh中传递值5,它可以作为bash脚本的第一个参数,所以你可以得到它的值$1

总之,如果你执行:

bash ./automate.sh 5

那么 $0 是脚本中的 ./automate.sh 而 $1 是 5。这称为位置参数。如果您确实想从 $split 中获取值,请执行以下操作:

split=5 bash ./automate.sh

这将解决错误。 但是看到你的 Docker 配方,有更好的方法来做到这一点。

您的 Docker ARG 拆分参数实际上根本没有在构建时使用。它仅在 CMD 中被引用,这就是它为空的原因。要在运行时(而不是构建时)在 shell 中引用它,您需要 ENV。从构建时指定 ENV 值是不可能的,而是在运行时使用 docker run 命令。您只能在 Dockerfile 中指定它的默认值。

最后,由于您只在 CMD 中使用 split,因此可以根本不使用 ENV,而只需将其指定为 docker run 位置参数中的命令参数。它会是这样的:

docker run myimage python script.py 5

【讨论】:

  • 另外值得注意的是,使用 JSON 数组形式 CMD [..., "$split"],根本不会处理这些命令字:脚本将文字字符串 $split 作为参数传递。
  • 不错的评论!因此错误。整个脚本 + Dockerfile 配方对我来说似乎是一个测验,测试您对 bash 如何处理参数以及构建 ARG 和 docker ENV 之间的区别的理解。我只想在原始评论中提供这个,而不是作为答案,但我目前的声誉不允许我这样做。
  • 非常感谢@lucernae,现在一切正常。非常感谢您的帮助。
  • 很高兴它有帮助
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
相关资源
最近更新 更多