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 ENTRYPOINT
和 CMD
指令(以及 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
进程不是主进程的子进程。
我有一个带有 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 ENTRYPOINT
和 CMD
指令(以及 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
进程不是主进程的子进程。