【问题标题】:docker-compose --build cannot find python executable but docker run doesdocker-compose --build 找不到 python 可执行文件,但 docker run 可以
【发布时间】:2020-02-19 18:52:09
【问题描述】:

我创建了几个 docker 镜像,每个镜像都为一个简单的烧瓶应用程序提供服务,我已经测试了这些镜像在使用 docker run 命令时是否按预期运行。现在我正在尝试使用 docker-compose 连接这些服务,当我运行 docker-compose up --build 时出现以下错误: Cannot start service lungs: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: "python\": executable file not found in $PATH": unknown.

如果我在交互模式下运行同一个容器并检查 PATH,我可以看到它指向正确的 python 可执行文件。我的 dockerfile 包含:

FROM base_private_image # sets up a user and miniconda on ubuntu
USER root
ADD ./ ./ . # copy flask code into image
RUN pip install flask requests
USER user # setup in the base_private_image, we need our containers not to run as root
CMD ["python", "app.py"] # I've tried many variations of this CMD, all with the same result

docker-compose.yml 内容示例

version: '3'
services:
  central_service:
      build: ./central_service
      restart: always
      environment:
         - PATH=/home/user/miniconda3/bin/:$PATH
      ports:
        - '5010:5010'
      expose:
        - 5010

谁能指出 docker-compose 和 docker run 之间的功能差异可能导致这种情况?我找不到 miniconda 或 python 安装或 PATH 的任何问题,所以我认为它一定是 docker-compose 的底层内容?

编辑添加: dockerfile 有效,docker-compose 可以找到 python:

FROM python:3.7.6-slim

RUN mkdir /trigger_app
WORKDIR /trigger_app

COPY requirements.txt ./
RUN pip install -r requirements.txt

ADD . ./

EXPOSE 6000

CMD flask run --host=0.0.0.0 --port=6000

【问题讨论】:

  • 看起来 docker-compose 找不到 python,而不是你的容器。您的 python 安装是否健全且可通过路径访问?
  • 据我所知,我只是编辑了问题以显示一个与 docker-compose 配合得很好的 dockerfile。所以,我想如果它可以找到那个图像的 python,为什么不能找到另一个?
  • Dockerfile 中的任何事情都会在考虑 docker-compose.yml 文件中的 environment: 设置之前发生。如果 base_private_image 正在将 Python 安装到不在 $PATH 中的某个位置,那将导致您看到的行为。 (必须在运行时覆盖 $PATH 有点奇怪。)
  • 我想我已经找出了问题所在,PATH 很好,但我认为当 docker compose 运行 docker-compose exec 后跟我的命令时会出现问题。如果我将命令从python app.py 更改为/bin/sh -c python app.py,一切都会启动并收到exited with code 127 错误,因为python: not found,很可能是语法问题。此外,如果我将我的示例工作 docker 图像从 flask run 更改为 python app.py,则会显示原始错误

标签: python docker flask docker-compose


【解决方案1】:

尝试在 Dockerfile 中设置 PATH 环境变量

ENV PATH /home/user/miniconda3/bin/:$PATH

并删除docker-compose.yml 中的environment: PATH(使用它,您将把机器的PATH 变量传递给容器)

【讨论】:

  • 感谢您的回答,不过我已经在 dockerfile 中设置了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2019-10-15
  • 2020-12-23
  • 2018-08-10
  • 2023-01-31
相关资源
最近更新 更多