如何在 Docker Compose 中启动 Apache Drill

问题描述

This link 解释了如何在 Docker 上运行 Apache Drill。

docker run -i --name drill-1.18.0 -p 8047:8047 -t apache/drill:1.18.0 /bin/bash

我需要在 Docker Compose 上运行它,所以我设置了它:

   version: "3.0"
   services:
      drill:
        image: apache/drill:latest
        ports:
          - "8047:8047"
        volumes:
          - vol_dask_data:/data
        entrypoint:
          - /bin/bash

然后像这样开始:

docker-compose up -d

但是容器没有做任何事情就结束了,即使我用 -d 开始 docker compose。

如何在 Docker Compose 中启动 Drill?

解决方法

Drill Dockerfile 以:

结尾
ENTRYPOINT /opt/drill/bin/drill-embedded

docker run 命令中,此特定结构完全忽略了图像名称后给出的命令。在您的 Compose 设置中,您将其(使用 entrypoint: 行)替换为 Bash shell,但此 shell 将立即退出。

docker run 命令和 Compose 设置之间的另一个重要区别是 -it 选项。如果您在没有 docker run-i 的情况下尝试使用 -t 命令,您将看到 Drill 提示,然后容器将立即退出。如果您添加回 -i 则它将等待命令,并且在执行此操作时它将接受网络连接。与此等效的 Compose 是 stdin_open: true 命令。

通过这个 docker-compose.yml,我可以在 http://localhost:8047 上看到 Drill UI:

version: "3.8"        # a more current version
services:
  drill:
    image: apache/drill:latest
    ports:
      - "8047:8047"
    stdin_open: true  # add this line
                      # do not override entrypoint: or command:
                      # include volumes: if required

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...