【问题标题】:install mongoose in docker container在 docker 容器中安装猫鼬
【发布时间】:2016-01-01 09:07:58
【问题描述】:

我正在尝试 dockerize 我的 node.js 应用程序。我创建了一个 Dockerfile,下面是 Dockerfile 的内容

# Official node base image
FROM node:0.12

# Bundle app source
COPY . /src

RUN apt-get update && apt-get install -y --no-install-recommends libkrb5-dev supervisor \
    && cd /src \
    && npm install \
    && rm -rf /var/lib/apt/lists/*

# copy the supervisor conf file
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# Exclude npm cache from the image
VOLUME /root/.npm

# expose environment variable
EXPOSE 3300

# start supervisor
CMD ["/usr/bin/supervisord"]

但在运行 npm install 命令时,我在日志中看到以下警告

> kerberos@0.0.14 install /rate-my-ride-users-api/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/node_modules/kerberos
> (node-gyp rebuild) || (exit 0)

make: Entering directory '/rate-my-ride-users-api/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/node_modules/kerberos/build'
  CXX(target) Release/obj.target/kerberos/lib/kerberos.o
  CXX(target) Release/obj.target/kerberos/lib/worker.o
  CC(target) Release/obj.target/kerberos/lib/kerberosgss.o
../lib/kerberosgss.c:27:0: warning: ignoring #pragma clang diagnostic [-Wunknown-pragmas]
 #pragma clang diagnostic push
 ^
../lib/kerberosgss.c:28:0: warning: ignoring #pragma clang diagnostic [-Wunknown-pragmas]
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
 ^
../lib/kerberosgss.c: In function 'authenticate_gss_client_wrap':
../lib/kerberosgss.c:348:19: warning: variable 'server_conf_flags' set but not used [-Wunused-but-set-variable]
   char buf[4096], server_conf_flags;
                   ^
../lib/kerberosgss.c: At top level:
../lib/kerberosgss.c:687:0: warning: ignoring #pragma clang diagnostic [-Wunknown-pragmas]
 #pragma clang diagnostic pop

自 12 小时以来,我一直在用头撞墙,我几乎搜索了互联网上的所有内容,但我无法找出发生这种情况的原因。我在某处读到我需要 libkrb5-dev 包,所以我也安装了该包,但问题仍然存在。

谁能向我解释这里发生了什么?以及如何解决这个问题?

【问题讨论】:

    标签: node.js mongodb mongoose docker dockerfile


    【解决方案1】:

    这只是 node-gyp 的输出。如果您不使用带有 Kerberos 身份验证的 MongoDB Enterprise,则可以忽略此消息。

    尽管如此,docker build 命令将成功运行,并且 mongoose 也将工作。

    上面的输出只是一些 pragam 指令。 ANSI-C 引入了 pragma 语句来定义编译器选项。

    例如看看:

    ../lib/kerberosgss.c: In function 'authenticate_gss_client_wrap':
    ../lib/kerberosgss.c:348:19: warning: variable 'server_conf_flags' set but not used [-Wunused-but-set-variable]
    char buf[4096], server_conf_flags;
    

    这只是告诉你,在 lib/kerberosgss.c:348:19 中定义的变量 server_conf_flags 没有在任何地方使用。如果你看source on github,这不是问题。

    每个 C 编译器有意处理这些 pragam 指令略有不同。 也许在你的本地机器上你有不同的 C 编译器或完全不同的操作系统?

    所以这没什么好担心的。

    【讨论】:

    • 我知道这一点,我的问题是为什么会有这些警告,当我在本地安装时(不在 docker 镜像中)这些警告不存在
    • 我更新了我的答案,提供了有关这些 pragma 指令的更多信息。
    • 我在本地使用 mac,根据this 问题,mac 使用 clang。
    • 您好@PatrickD,在我提供赏金之前,您能解释一下我如何解决这个问题。
    【解决方案2】:

    就像提到的其他答案一样,您不必担心这些警告。这些来自于 gcc 的未知编译指示定义。例如:

    ../lib/kerberosgss.c:27:0:警告:忽略#pragma clang diagnostic [-Wunknown-pragmas] #pragma clang 诊断推送

    由于clang 不知道gcc 的编译指示而弹出此警告。

    如果您仍想摆脱这些警告,您可以设置cflags 以忽略这些警告。要使用 node-gyp 执行此操作,请编辑 ~/.node-gyp/<node_version>/include/node/common.gypi

    找线:

    'cflags': [ '-Wall', '-Wextra', '-Wno-unused-parameter', ],
    

    并将其替换为:

    'cflags': [ '-Wall', '-Wextra', '-Wno-unused-parameter', '-Wno-unknown-pragmas','-Wno-unused-but-set-variable', ],
    

    这是存储默认标志的地方。注意两个额外的标志来禁用警告。在docker中,你可以使用sed将cflags这一行替换成上面的。

    而且我不确定为什么您在本地环境中没有收到警告。很可能是因为您使用的是 gcc 以外的其他编译器,或者可能是您正在使用的 gcc 版本,所以已经设置了这些标志。


    编辑:如果您没有看到 ~/.node-gyp/ 目录,请先运行这些命令。这将安装指定节点版本的开发文件:

    npm install -g node-gyp
    node-gyp install 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-21
      • 2017-11-11
      • 2017-05-02
      • 2014-07-06
      • 2020-12-20
      • 2021-05-11
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多