在Docker容器中安装Mongoose

11

我正在尝试将我的Node.js应用程序Docker化。我创建了一个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软件包,所以我也安装了该软件包,但问题仍然存在。

有人能解释一下这里发生了什么吗?我该如何解决这个问题?

2个回答

5

这只是node-gyp的输出。如果您不使用MongoDB Enterprise with Kerberos Authentication,则可以忽略此消息。

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

上述输出只涉及某些编译器指令。Pragma语句是用ANSI-C引入的,以定义编译器选项。

例如,请看:

../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没有被任何地方使用。如果您查看github上的源代码,这不是问题。
每个C编译器处理这些pragma指令的方式略有不同,这是有意为之的。 也许在您的本地机器上,您有不同的C编译器或完全不同的操作系统?
所以这没什么好担心的。

我知道这个,我的问题是为什么会出现这些警告,当我本地安装时(而不是在Docker镜像中),这些警告并不存在。 - Syed
我更新了我的答案,关于这些#pragma指令提供了更多的信息。 - PatrickD
我使用Mac作为我的本地开发环境,根据这个问题,Mac使用clang编译器。 - Syed
你好 @PatrickD,在我提供赏金之前,能否解释一下我如何解决这个问题。 - Syed

1

就像其他答案提到的那样,你不需要担心这些警告。这些警告是由于gcc对未知#pragma定义的反应。例如:

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

这个警告弹出是因为clang pragma在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/目录,请先运行以下命令。这将安装指定Node版本的开发文件:

npm install -g node-gyp
node-gyp install 

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