docker-compose --build 无法找到 Python 可执行文件,但是 docker run 可以。

3
我已经创建了几个 Docker 镜像来为每个简单的 Flask 应用程序提供服务,我测试了这些镜像在使用 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 安装是否正常并且在路径上可访问? - Burak Serdar
据我所知,是可以的。我刚刚编辑了问题,展示了一个与docker-compose完美配合的Dockerfile。因此,我认为如果它能在那个镜像中找到Python,为什么不能在另一个镜像中找到呢? - notarya
Dockerfile 中的任何内容都会在 docker-compose.yml 文件中的 environment: 设置之前执行。如果 base_private_image 将 Python 安装到不在 $PATH 中的某个位置,那么这可能会导致你所看到的行为。 (必须在运行时覆盖 $PATH 的情况有点奇怪。) - David Maze
我认为我已经找到了问题所在,PATH 是正常的,但我认为问题出现在 docker compose 运行 docker-compose exec 后面跟着我的命令。如果我将我的命令从 python app.py 更改为 /bin/sh -c python app.py,那么一切都会启动并且得到 exited with code 127 错误,因为找不到 python,所以很可能是语法问题。此外,如果我将可工作的 Docker 镜像示例从 flask run 更改为 python app.py,那么原始错误就会出现。 - notarya
1个回答

0
尝试在Dockerfile内设置PATH环境变量
ENV PATH /home/user/miniconda3/bin/:$PATH

并且移除 docker-compose.yml 文件中的 environment: PATH(这样做,您将传递您计算机的PATH变量到容器中)


谢谢你的回答,不过我已经在Dockerfile中设置好了。 - notarya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接