Python docker文件中的环境未被替换
我有一个非常简单的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
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的参数
入口点