繁体   English   中英

docker 文件中的 ENV 未被替换

[英]ENV in docker file not getting replaced

我有一个非常简单的 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]没有这样的文件或目录

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

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

环境变量名称CODEPATH但您将TOKEN设置为环境变量。 您能否尝试通过以下方式将 CODEPATH 设置为 env

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

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

# no ENTRYPOINT
CMD python3 /usr/src/app/${CODEPATH}

(完成此操作后,最好还是使用@allan 的答案中的方法并直接docker run python-image python3 other-script-name.py 。)

Dockerfile 语法不允许在RUNENTRYPOINTCMD命令中进行环境扩展 相反,这些命令有两个 forms。 执行形式要求您将命令格式化为 JSON 数组,并且不对您提供的内容进行任何处理; 它使用一组精确的 shell 字和命令中的确切字符串运行命令。 Shell 形式没有任何特殊语法,但将命令包装在sh -c中,并且 shell 处理您期望 Z2591C98B70119FE624898B1E42 做的所有正常事情。

RUN为例:

# These are the same:
RUN ["ls", "-la", "some directory"]
RUN ls -la 'some directory'

# These are the same (and print a dollar sign):
RUN ["echo", "$FOO"]
RUN echo \$FOO

# These are the same (and a shell does variable expansion):
RUN echo $FOO
RUN ["/bin/sh", "-c", "echo $FOO"]

如果您同时拥有ENTRYPOINTCMD ,则此扩展针对每一半单独发生。 这就是你的分裂导致麻烦的地方:这些选项都不起作用:

# Docker doesn't expand variables at all in exec form
ENTRYPOINT ["python3"]
CMD ["/usr/src/app/${CODEPATH}"]
# ["python3", "/usr/src/app/${CODEPATH}"] with no expansion

# The "sh -c" wrapper gets interpreted as an argument to Python
ENTRYPOINT ["python3"]
CMD /usr/src/app/${CODEPATH}
# ["python3", "/bin/sh", "-c", "/usr/src/app/${CODEPATH}"]

# "sh -c" only takes one argument and ignores the rest
ENTRYPOINT python3
CMD ["/usr/src/app/${CODEPATH}"]
# ["/bin/sh", "-c", "python3", ...]

这个ENTRYPOINT / CMD拆分的唯一真正效果是制作一个只能运行 Python 脚本的容器,无需特殊配置(一个尴尬的docker run --entrypoint选项) 您仍在CMD中提供大部分命令行,但不是全部。 我倾向于推荐 CMD 中的整个命令CMD ,并且您将ENTRYPOINT保留用于一些更专业的用途; 还有一种模式是将完整的命令放入ENTRYPOINT并尝试使用CMD部分来传递它的选项。 无论哪种方式,如果将整个命令放在一个指令或另一个指令中,事情会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM