我已经创建了几个 Docker 镜像来为每个简单的 Flask 应用程序提供服务,我测试了这些镜像在使用 docker run 命令时能够按预期运行。现在我正在尝试使用 docker-compose 连接这些服务,但当我运行 docker-compose up --build 时,会出现以下错误:
如果我以交互模式运行相同的容器并检查 PATH,我可以看到它指向正确的 Python 可执行文件。我的 Dockerfile 包含:
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.yml
文件中的environment:
设置之前执行。如果base_private_image
将 Python 安装到不在$PATH
中的某个位置,那么这可能会导致你所看到的行为。 (必须在运行时覆盖$PATH
的情况有点奇怪。) - David MazePATH
是正常的,但我认为问题出现在 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