npm:docker中未运行Postinstall

24

我有一个npm包(npm版本为5.5.1,node版本为9.2.0)。如果我在本地机器上运行npm install,那么会执行在package.json中定义的postinstall。但是,如果我在Docker文件中运行相同的命令RUN npm install,即在容器内部运行命令时,则不会执行postinstall步骤。有任何想法,可能出了什么问题吗?

2个回答

35

尝试使用 --unsafe-perm 选项运行安装。在以 root 用户身份运行时,npm 不会运行任何脚本。

另外,在 Dockerfile 中创建一个用户并切换到该用户:

FROM ...
RUN groupadd -r app && useradd -r -g app app
USER app

9

除了所选答案(@yamenk)之外,还有另一种选择,已在包括 OP 版本的 <v9.x 上进行测试: 您可以将此行添加到 Dockerfile 中,以配置容器内的 npm 配置(从而允许使用必要权限执行 postinstall 脚本):

FROM ...
RUN npm config set unsafe-perm true

如果在v9上:

FROM ...

# Create a non-root user
RUN useradd --user-group --create-home --shell /bin/false appuser

# Set the working directory (optional, uncomment if needed)
# WORKDIR /app

# Install dependencies as the non-root user, this will run postinstall
RUN chown -R appuser:appuser /app \
  && npm install

# BONUS: you can go back to default user w/ USER root instead, but if you want to run the application, you should do it as the non-root user, as in: USER appuser

unsafe-perm已从npm中移除 https://github.com/npm/cli/pull/2196 有没有其他解决问题的选项? - Sh eldeeb
@Sheldeeb 这不是一个标志,而是我的答案中的配置调整,与所选答案不同(标志确实被删除了,但配置没有)。您可以选择创建一个.npmrc文件,将其添加并将其设置为unsafe-perm=true - sab
即使配置被删除,也尝试在npm v9中进行设置。 - Sh eldeeb
1
@Sheldeeb 哦,你正在使用v9版本,我的回答是针对OP的问题版本(v5)的。虽然在v7中已经说明了一些重大变化,但它仍然可以在v8上运行(即使文档没有提到)。在v9中确实没有使用配置文件,此时如果npm在root上运行,则会采用工作目录所有者的uid和gid,因此,是的,您应该创建一个具有足够权限的用户,切换到该用户并运行安装。我将逐步更新我的答案。 - sab
不错,但还有另一个问题。这个答案不是跨平台的。 - Sh eldeeb
1
@Sheldeeb 当然可以,但你应该开一个新的问题来涵盖你所有的需求(因为针对这个特定情况,也就是版本已经满足了原始问题的需求),这样我们才能帮助你。或者更好的方法是,在这里发布一个新的答案,包含你的评论。在这里,我只是假设Docker的alpine版本镜像,这是最常见的情况。 - sab

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