【问题标题】:docker: Error response from daemon: OCI runtime create failed:docker:来自守护进程的错误响应:OCI 运行时创建失败:
【发布时间】:2020-04-17 08:49:16
【问题描述】:

我正在尝试运行我的 docker 映像,但收到以下错误:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"python3\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled

这是我的 Dockerfile:

FROM python:3.6-alpine3.7

RUN apk add --no-cache python3-dev \
    && pip3 install --upgrade pip

RUN apk add --no-cache --update \
    python3 python3-dev gcc \
    gfortran musl-dev

RUN apk add --no-cache libressl-dev musl-dev libffi-dev

RUN python3.6 -m pip install --upgrade pip

RUN apk --no-cache add git

RUN apk add mariadb-dev

WORKDIR /socialworks-api

COPY . /socialworks-api

RUN pip3 --no-cache-dir install -r requirements.txt

ENV PATH="/opt/gtk/bin:$env/development.env"

EXPOSE 5000

ENTRYPOINT ["python3"]
CMD ["app.py"]

我认为问题可能出在我设置的 ENV PATH 上。我也尝试将其设置为:

ENV PATH="/opt/gtk/bin:${env/development.env}"

但是在构建 dockerfile 时我会收到以下错误:

Step 11/14 : ENV PATH="/opt/gtk/bin:${env/development.env}"
failed to process "\"/opt/gtk/bin:${env/development.env}\"": missing ':' in substitution

不设置环境,我的应用程序将无法运行。

我也试过在我的 dockerfile 上运行这个命令:

RUN export $(grep -v '^#' ./env/development.env | xargs)

构建成功,但是当我在终端输入这个命令时:

docker run -it flaskapp

我收到一个错误,它仍然无法找到环境变量。

$ docker run -it flaskapp
Traceback (most recent call last):
  File "app.py", line 11, in <module>
    app.config.from_object("config.Config")
  File "/usr/local/lib/python3.6/site-packages/flask/config.py", line 174, in from_object
    obj = import_string(obj)
  File "/usr/local/lib/python3.6/site-packages/werkzeug/utils.py", line 568, in import_string
    __import__(import_name)
  File "/socialworks-api/config.py", line 4, in <module>
    class Config(object):
  File "/socialworks-api/config.py", line 5, in Config
    MYSQL_HOST = os.environ['MYSQL_HOST']
  File "/usr/local/lib/python3.6/os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'MYSQL_HOST'

【问题讨论】:

  • 是的,您的$PATH 设置会删除所有系统目录,例如/bin/usr/bin。确保在变量值中包含现有的$PATH
  • 感谢您的回答。您能否指定我应该在我的 dockerfile 中运行什么命令?因为我的完整环境路径是socialworks-api/env/development.env,而我的workdir是socialworks-api,我觉得env/development.env应该够用了。

标签: docker environment-variables


【解决方案1】:

在您指定的 Dockerfile 中

ENV PATH="/opt/gtk/bin:$env/development.env"

当您稍后运行python3 时,系统 查找这两个目录,当那里没有 Python 时,您会看到您看到的错误。它可能在/usr/bin/python3 中,但目录/usr/bin 不在$PATH 中。

这里最简单的答案是完全删除这一行。您的 Dockerfile 既不会创建 /opt/gtk 也不会创建 /development.env 目录,因此这两个路径中都没有可以执行的文件。如果您确实需要安装自定义软件,将其放在默认系统路径中的目录中(例如 /usr/local/bin)是一个不错的方法。

如果您确实需要保留此行,请确保现有的 $PATH 保留为值的一部分。

ENV PATH="/opt/gtk/bin:$PATH"

(不要指定ENTRYPOINT ["python"];将其组合成一个CMD ["python3", "app.py"]。我鼓励您运行docker run --rm -it yourimage /bin/sh 来查看文件系统并运行env 之类的调试命令,但ENTRYPOINT声明打破了这种用法,并且以CMD 命名的脚本文件意味着它仍然不是“容器即命令”模式。)

【讨论】:

  • 感谢您的回答。我使用 ENV PATH 的主要原因是声明我将使用开发环境。也许有更简单的方法来声明我将在 docker 中使用哪个环境?
  • “开发环境”是什么意思?唯一可用的软件是 Dockerfile 中专门安装的软件;一个容器没有多个“环境”。
  • 好吧,我有一个 config.py 文件,我在其中编写了我的环境变量,例如 MYSQL_HOST = os.environ['MYSQL_HOST']。设置特定环境时,将使用特定变量,在此示例中,将使用 development.env 中的变量。如果我不声明环境,我会收到上面提到的错误,因此我需要设置将在我的 dockerfile 中使用的环境。我希望这是有道理的。
  • 这不是 PATH 环境变量的用途。它说明在哪里查找命令,如shlspython 等。数据文件或配置永远不会在那里查找。
  • 谢谢,我误解了 PATH 环境变量的用途。所以,要声明我将使用哪个环境,我应该使用命令 RUN export $(grep -v '^#' ./env/development.env | xargs)?因为不幸的是,我在使用这个命令时收到了上面提到的错误。
猜你喜欢
  • 2019-04-30
  • 2020-01-11
  • 2018-05-28
  • 2020-04-19
  • 1970-01-01
  • 2016-12-20
  • 2021-02-20
  • 2021-10-08
  • 2023-01-27
相关资源
最近更新 更多