【问题标题】:Dockerfile Entrypoint no such file or directory: OCI not foundDockerfile 入口点没有这样的文件或目录:找不到 OCI
【发布时间】:2021-05-25 12:33:11
【问题描述】:

我有一个带有入口点的 Dockerfile,我在其中指定了配置文件变量和可执行文件,但看起来 Docker 或入口点无法识别它。我的main.py 必须使用配置文件执行。

ENTRYPOINT ["CONFIG_FILE=path/to/config.file ./main.py"]

总是不重现这样的文件或目录:找不到 OCI

注意:我已经复制了当前工作目录中的所有文件。 main.py 是一个可执行文件。所以我猜问题是在可执行文件之前附加了config variable。有谁知道那里发生了什么?从ENTRYPOINT 更改为CMD 也无济于事。

Dockerfile

FROM registry.fedoraproject.org/fedora:34

WORKDIR /home

COPY . /home

ENTRYPOINT ["CONFIG_FILE=path/to/config.file ./main.py"]

【问题讨论】:

  • 您是否尝试过使用 ENV 指令来指定配置?
  • @ssc327 我做到了,但也许我没有正确地做到这一点,或者它仍然无法正常工作。 ENV path=path/to/config.file ENTRYPOINT ["CONFIG_FILE=${path} ./main.py"]
  • 请分享你的dockerfile
  • @ssc327 我在我的问题中添加了它
  • 你试过 FROM registry.fedoraproject.org/fedora:34 ENV CONFIG_FILE=path/to/config.file WORKDIR /home COPY 。 /home 入口点 [" /home/main.py"

标签: docker cmd dockerfile docker-entrypoint


【解决方案1】:

如果您只需要将环境变量设置为静态字符串,请使用 Dockerfile ENV 指令。

ENV CONFIG_FILE=/path/to/config.file
CMD ["./main.py"]

Dockerfile ENTRYPOINTCMD 指令(以及 RUN)有两种形式。您已经使用了 JSON 数组形式;在这种形式中,不涉及外壳,您必须手动拆分单词。 (您正在尝试运行命令 CONFIG_FILE=... ./main.py,其中可执行文件本身需要包含 = 和空格。)如果您不使用 JSON 数组形式,则可以改用 shell 形式,而这种形式应该工作:

CMD CONFIG_FILE=/path/to/config.file ./main.py

一般而言,您应该更喜欢CMD 而不是ENTRYPOINT。使用ENTRYPOINT 进行首次设置然后执行CMD 是一种相当标准的模式。例如,如果您希望将配置文件绑定挂载,但希望仅在变量存在时设置该变量,您可以编写一个 shell 脚本:

#!/bin/sh
# entrypoint.sh
#
# If the config file exists, set it as an environment variable.
CONFIG_FILE=/path/to/config.file
if [ -f "$CONFIG_FILE" ]; then
  export CONFIG_FILE
else
  unset CONFIG_FILE
fi

# Run the main container CMD.
exec "$@"

然后您可以同时指定ENTRYPOINT(设置环境变量)和CMD(说明实际执行的操作)

# ENTRYPOINT must be JSON-array form for this to work
ENTRYPOINT ["./entrypoint.sh"]
# Any valid CMD syntax is fine
CMD ["./main.py"]

您可以通过提供备用docker run 命令来仔细检查环境变量设置

# (Make sure to quote things so the host shell doesn't expand them first)
docker run --rm my-image sh -c 'echo $CONFIG_FILE'
docker run --rm -v "$PWD:/path/to" my-image sh -c 'echo $CONFIG_FILE'

如果在 docker exec 启动的一次性调试 shell 中拥有相同的环境对您很重要,那么在这些方法中,只有 Dockerfile ENV 会使变量在那里可见。在其他情况下,环境变量仅在主容器进程及其子进程中可见,但docker exec 进程不是主进程的子进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    相关资源
    最近更新 更多