docker - 在 ubuntu 20.04 上安装 Mesos 导致 makefile 问题
问题描述
我试图使用 Dockefile 在 ubuntu 20.04 上安装 mesos 最新版本(1.9.0)。
FROM ubuntu:20.04
ENV MESOS_VERSION 1.9.0
ENV MESOS_ARTIFACT_FILENAME mesos-${MESOS_VERSION}.tar.gz
# Install Mesos dependencies
# Compile and install Mesos (compilation phase uses 6 threads for speed up this process)
# Uninstall Mesos build dependencies
RUN apt-get update && apt-get install -y \
openjdk-8-jdk \
python-dev \
libcurl4-nss-dev \
libsasl2-dev \
libsasl2-modules \
maven \
libapr1-dev \
libsvn-dev \
zlib1g-dev
RUN wget http://archive.apache.org/dist/mesos/${MESOS_VERSION}/${MESOS_ARTIFACT_FILENAME} \
&& tar -xf ${MESOS_ARTIFACT_FILENAME}
RUN cd mesos-${MESOS_VERSION} \
&& mkdir build \
&& cd build \
&& ../configure \
&& make -j 6 \
&& cp src/.libs/libmesos-${MESOS_VERSION}.so /usr/local/lib/libmesos-${MESOS_VERSION}.so \
&& cd ../.. \
&& rm -rf mesos-${MESOS_VERSION} ${MESOS_ARTIFACT_FILENAME} \
&& apt-get purge -y \
openjdk-8-jdk \
python-dev \
libsasl2-dev \
libsasl2-modules \
maven \
zlib1g-dev \
&& apt-get clean \
&& apt-get autoremove -y \
&& rm -rf /var/lib/apt/lists/*
RUN ln -s /usr/local/lib/libmesos-${MESOS_VERSION}.so /usr/lib/libmesos.so
它一直工作到配置命令
../configure \
&& make -j 6 \
配置后,make commad 会抛出不同的错误。其中之一是:
ar: 'u' 修饰符被忽略,因为 'D' 是默认值(参见 'U')
rc/core/lib/gpr/log_linux.cc:42:13: error: ambiguating new declaration of 'long int gettid()'
42 | static long gettid(void) { return syscall(__NR_gettid); }
| ^~~~~~
In file included from /usr/include/unistd.h:1170,
from src/core/lib/gpr/log_linux.cc:40:
/usr/include/x86_64-linux-gnu/bits/unistd_ext.h:34:16: note: old declaration '__pid_t gettid()'
34 | extern _pid_t gettid (void) _THROW;
| ^~~~~~
src/core/lib/gpr/log_linux.cc:42:13: warning: 'long int gettid()' defined but not used [-Wunused-function]
42 | static long gettid(void) { return syscall(__NR_gettid); }
| ^~~~~~
make[4]: *** [Makefile:2650: /mesos-1.9.0/build/3rdparty/grpc-1.10.0/objs/opt/src/core/lib/gpr/log_linux.o] Error 1
我在为海马构建 mesos-spark-docker 映像时做错了什么?请帮我。
解决方案
您通过运行make -j 6
. 这将导致make
在 6 个线程中运行,并且所有线程都将同时输出。移动到-j 1
能够排除故障。
要解决此类问题,您需要在构建失败之前停止构建。如果您使用的是 buildx,请查看这篇SO 帖子如何创建阶段和中间图像。完成中间阶段后,您将创建容器并执行手动步骤并逐个解决问题。
为了检查您的问题,我构建了映像,直到./configure
创建容器以进一步排除故障。我看到的是缺少一些先决条件,例如build-essential
, autogen
, autoconf
. 我什至需要default-jdk
,但这可能是路径问题,因为我看到您正在安装openjdk-8-jdk
. 缺少库仍然存在问题,因此您需要从这一点继续。
推荐阅读
- c++ - 最高命令中的 SIZE 是什么意思?
- express - Supertest 对测试 express 应用 POST 方法给出 415 响应
- r - 将 SPSS 语法迁移到 R (Tidyverse)
- javascript - 使用 Python-Shell 和 NodeJS 的 ELIFECYCLE 错误
- javascript - 如何在本地捆绑 JavaScript 和 CSS 依赖项以供离线使用?
- javascript - 自动将本地驱动器中的 csv/txt 文件作为表 Javascript 加载到 html 页面中
- go - VS Code:模块和 GOPATH 的使用和设置
- python - Python:我无法从函数中的标准输入解析 csv
- javascript - 我可以使用什么 .filter 方法来代替运行 for 循环
- c# - 你如何找到一个也有负数的数组的正和?