docker-compose exec:"webserver":在$PATH中找不到可执行文件

3
当我使用 docker-compose up 命令运行我的 docker-compose.yml 文件时,它会输出以下内容:
Removing airflow_webserver_1
Starting airflow_postgres_1 ... done
Recreating bfec6e557af5_airflow_webserver_1 ... error

ERROR: for bfec6e557af5_airflow_webserver_1  Cannot start service webserver: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"webserver\": executable file not found in $PATH": unknown

ERROR: for webserver  Cannot start service webserver: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"webserver\": executable file not found in $PATH": unknown
ERROR: Encountered errors while bringing up the project.

在运行docker-compose up之前,我使用成功的Dockerfile运行了docker build .。到目前为止,我只尝试过退出、重新启动Docker,并使用docker system prune -a来删除Docker映像、容器、卷和网络。
以下是Dockerfile:
FROM python:3
WORKDIR /usr/local/airflow/
COPY requirements.txt ./
RUN pip install --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt
COPY . .

这是docker-compose.yml文件:

version: '3.7'
services:
    postgres:
        image: postgres:9.6
        environment:
            - POSTGRES_USER=airflow
            - POSTGRES_PASSWORD=airflow
            - POSTGRES_DB=airflow
        logging:
            options:
                max-size: 10m
                max-file: "3"

    webserver:
        # image: puckel/docker-airflow:1.10.9
        image: puckel/docker-airflow:latest
        restart: always
        depends_on:
            - postgres
        environment:
            - LOAD_EX=n
            - EXECUTOR=Local
        logging:
            options:
                max-size: 10m
                max-file: "3"
        volumes:
            - ./dags:/usr/local/airflow/dags
            # - ./plugins:/usr/local/airflow/plugins
            - ./plugins/:/usr/local/airflow/plugins
            - ./requirements.txt:/requirements.txt
        ports:
            - "8080:8080"
        command: webserver
        healthcheck:
            test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
            interval: 30s
            timeout: 30s
            retries: 3

        build:
            context .
            args:
                PYTHON_DEPS: "boto3==1.12.41, notebook==6.0.3, numpy==1.18.1, pandas==0.25.3, psycopg2==2.8.4"
                AIRFLOW_DEPS: "aws, postgres"

以下是 requirement.txt 文件:

boto3==1.12.41
notebook==6.0.3
numpy==1.18.1
pandas==0.25.3
psycopg2==2.8.4

Dockerfile 应该运行什么 CMDdocker-compose.yml 有一个覆盖项 command: webserver,那个命令会被安装在哪里? - David Maze
是否有一个名为 webserver 的命令可以在容器内运行?您需要在 Dockerfile 中使用 CMDENTRYPOINT,或在 docker-compose 中使用 command 来定义容器启动时应执行的内容。 - Wander3r
你的 Dockerfile 似乎缺少 FROM 行。 - Klaus D.
@DavidMaze 我想要运行的命令是 pip install --upgrade pip && \ pip install --no-cache-dir -r requirements.txt。我对 Docker 很陌生,不确定 command: webserver 安装在哪里。 - Marshallm
@Wander3r 我使用 https://github.com/puckel/docker-airflow/blob/master/script/entrypoint.sh 中的 entrypoint.sh 定义了 CMD bash script/entrypoint.sh,但是仍然出现了相同的错误。 - Marshallm
1个回答

0

我有几个问题:

  1. 为什么你在你的 docker-compose.yml 文件中有一个 healthcheckcommand 参数?你确定你需要它们在那里而不是在 Dockerfile 文件中吗?
  2. 你使用参数 PYTHON_DEPSAIRFLOW_DEPS 构建镜像,你在哪里使用它们?请记住,你正在使用只安装了 Python 的 FROM python:3 系统。
  3. image: puckel/docker-airflow:latest -- 你是这个镜像的维护者吗?
  4. 你能解释一下你想在 Dockerfile 中做什么吗?因为你只是将你的文件复制到只安装了 Python 的镜像中。

据我理解,你通过添加你的代码扩展了 puckel/docker-airflow 的某些功能,那么你需要:

  1. 在你的 Dockerfile 中使用 FROM puckel/docker-airflow:latest
  2. 为你的构建设置标签 docker build -t my-airflow .
  3. docker-compose.yml 中的 image 值更改为 image:my-airflow
  4. 运行它。然后一切都有意义了。

感谢您的建议。
  1. 我对Docker非常陌生,我正在尝试使用此存储库中的docker-compose.yml文件进行实验:https://github.com/puckel/docker-airflow/blob/master/docker-compose-LocalExecutor.yml,该文件恰好包含健康检查。
  2. 我使用了参数,因为Dockerfile没有从requirement.txt导入软件包
  3. 不,我已经更改了它
  4. 指定镜像的配置,如Python软件包、入口点和容器的默认命令。
- Marshallm

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