【发布时间】: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