Dockerfile 入口点没有这样的文件或目录:找不到 OCI

Dockerfile Entrypoint no such file or directory: OCI not found

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

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

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

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

Docker文件

FROM registry.fedoraproject.org/fedora:34

WORKDIR /home

COPY . /home

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

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

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

Dockerfile ENTRYPOINTCMD 指令(以及 RUN)有两种形式。您已经使用了 JSON-数组形式;在那种形式中,不涉及 shell,您必须手动拆分单词。 (您正在尝试 运行 命令 CONFIG_FILE=... ./main.py,其中可执行文件本身需要包含 = 和 space。)如果您不使用 JSON-array 形式你可以使用 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 进程不是主进程的子进程。