Python docker文件中的环境未被替换

Python docker文件中的环境未被替换,python,docker,containers,Python,Docker,Containers,我有一个非常简单的docker文件 FROM python:3 WORKDIR /usr/src/app ENV CODEPATH=default_value ENTRYPOINT ["python3"] CMD ["/usr/src/app/${CODEPATH}"] 这是我的容器命令 docker run -e TOKEN="subfolder/testmypython.py" --name mycontainer -v /op

我有一个非常简单的docker文件

FROM python:3
WORKDIR /usr/src/app
ENV CODEPATH=default_value
ENTRYPOINT ["python3"]
CMD ["/usr/src/app/${CODEPATH}"]
这是我的容器命令

docker run -e TOKEN="subfolder/testmypython.py"  --name mycontainer -v /opt/testuser/pythoncode/:/usr/src/app/  -t -d  python-image:latest
当我看到容器日志时,它会显示


python3:无法打开文件“/usr/src/app/${TOKEN}”:[Errno 2]没有这样的文件或目录

环境变量名
代码路径
,但您的设置
标记
是环境变量。 请您尝试以下方式将代码路径设置为env好吗

doker run -e CODEPATH="subfolder/testmypython.py" --name mycontainer -v /opt/testuser/pythoncode/:/usr/src/app/ -t -d python-image:latest 

环境变量名称
CODEPATH
,但您的设置
TOKEN
为环境变量。 请您尝试以下方式将代码路径设置为env好吗

doker run -e CODEPATH="subfolder/testmypython.py" --name mycontainer -v /opt/testuser/pythoncode/:/usr/src/app/ -t -d python-image:latest 

看起来您要做的是覆盖启动容器时运行的python文件的默认路径。您可以将文件的路径作为参数传递给docker run,而不是将此选项作为环境变量传递给docker run,这是本文的目的。设置为CMD选项的是默认选项,图像的用户可以通过向docker run命令传递参数轻松覆盖该选项

doker run --name mycontainer -v /opt/testuser/pythoncode/:/usr/src/app/ -t -d python-image:latest "subfolder/testmypython.py"

看起来您要做的是覆盖启动容器时运行的python文件的默认路径。您可以将文件的路径作为参数传递给docker run,而不是将此选项作为环境变量传递给docker run,这是本文的目的。设置为CMD选项的是默认选项,图像的用户可以通过向docker run命令传递参数轻松覆盖该选项

doker run --name mycontainer -v /opt/testuser/pythoncode/:/usr/src/app/ -t -d python-image:latest "subfolder/testmypython.py"

分割
ENTRYPOINT
CMD
的方式没有意义,并且不可能在这里进行变量扩展。您应该将这两个部分组合成一个
CMD
,然后使用shell表单运行它:

#无入口点
CMD python3/usr/src/app/${CODEPATH}
(完成此操作后,更好的方法是使用docker run python image python3 other script name.py中的方法并直接使用该方法)

Dockerfile语法不允许在
RUN
ENTRYPOINT
CMD
命令中使用。相反,这些命令有两种形式。 要求您将命令格式化为JSON数组,并且不对您提供的内容进行任何处理;它使用一组精确的shell字和命令中的精确字符串运行命令。没有任何特殊语法,但将命令包装在
sh-c
中,该shell处理您期望shell完成的所有正常操作

RUN
为例:

这些都是相同的: 运行[“ls”、“-la”、“某些目录”] 运行ls-la“某些目录” #这些是相同的(并打印一个美元符号): 运行[“echo”、“$FOO”] 运行echo\$FOO #这些都是相同的(shell进行变量扩展): 运行echo$FOO 运行[“/bin/sh”、“-c”、“echo$FOO”] 如果您同时拥有
ENTRYPOINT
CMD
两个入口点,则此扩展将分别针对每一半进行。这就是您的拆分会带来麻烦的地方:这些选项都不起作用:

#Docker根本不以exec形式展开变量
入口点[“蟒蛇3”]
CMD[“/usr/src/app/${CODEPATH}”]
#[“python3”,“/usr/src/app/${CODEPATH}”]没有扩展
#“sh-c”包装器被解释为Python的参数
入口点[“蟒蛇3”]
CMD/usr/src/app/${CODEPATH}
#[“python3”、“/bin/sh”、“-c”、“/usr/src/app/${CODEPATH}”]
#“sh-c”只接受一个参数,忽略其余参数
入口点蟒蛇3
CMD[“/usr/src/app/${CODEPATH}”]
#[“/bin/sh”、“-c”、“python3”、…]

这种
ENTRYPOINT
/
CMD
拆分的唯一真正效果是创建一个容器,该容器只能运行Python脚本,而无需特殊配置(一个笨拙的
docker运行--ENTRYPOINT
选项);您仍然在
CMD
中提供大部分命令行,但不是全部。我倾向于建议将整个命令放入
CMD
,并保留
ENTRYPOINT
,以便进行一些更专门的使用;还有一种模式是将完整的命令放入
ENTRYPOINT
并尝试使用
CMD
部分传递它的选项。无论哪种方式,如果您将整个命令放在一个或另一个指令中,事情都会更好。

您分割
入口点和
CMD
的方式没有意义,并且无法在这里进行变量扩展。您应该将这两个部分组合成一个
CMD
,然后使用shell表单运行它:

#无入口点
CMD python3/usr/src/app/${CODEPATH}
(完成此操作后,更好的方法是使用docker run python image python3 other script name.py中的方法并直接使用该方法)

Dockerfile语法不允许在
RUN
ENTRYPOINT
CMD
命令中使用。相反,这些命令有两种形式。 要求您将命令格式化为JSON数组,并且不对您提供的内容进行任何处理;它使用一组精确的shell字和命令中的精确字符串运行命令。没有任何特殊语法,但将命令包装在
sh-c
中,该shell处理您期望shell完成的所有正常操作

RUN
为例:

这些都是相同的: 运行[“ls”、“-la”、“某些目录”] 运行ls-la“某些目录” #这些是相同的(并打印一个美元符号): 运行[“echo”、“$FOO”] 运行echo\$FOO #这些都是相同的(shell进行变量扩展): 运行echo$FOO 运行[“/bin/sh”、“-c”、“echo$FOO”]
如果您同时拥有
ENTRYPOINT
CMD
两个入口点,则此扩展将分别针对每一半进行。这就是您的拆分会带来麻烦的地方:这些选项都不起作用:

#Docker根本不以exec形式展开变量
入口点[“蟒蛇3”]
CMD[“/usr/src/app/${CODEPATH}”]
#[“python3”,“/usr/src/app/${CODEPATH}”]没有扩展
#“sh-c”包装器被解释为Python的参数
入口点