gpt4 book ai didi

linux - Docker 容器中 bcrypt 的 ELF header 或安装问题

转载 作者:IT老高 更新时间:2023-10-28 21:22:21 27 4
gpt4 key购买 nike

有点远见,但是有人在 linux 容器(特别是 docker)中使用 bcrypt 时遇到任何问题并且知道自动解决方法吗?我和这两个有同样的问题:

Invalid ELF header with node bcrypt on AWSBox

bcrypt invalid elf header when running node app

我的 Dockerfile

# Pull base image
FROM node:0.12

# Expose port 8080
EXPOSE 8080

# Add current directory into path /data in image
ADD . /data

# Set working directory to /data
WORKDIR /data

# Install dependencies from package.json
RUN npm install --production

# Run index.js
CMD ["npm", "start"]

如果我已经在我的 node_modules 中安装了 bcrypt,我会收到前面提到的无效 ELF header 错误,但是如果我删除它(只是它本身或我的所有包),当我构建容器时由于某种原因它没有安装.我必须在构建后手动进入容器并将其安装在里面。

是否有自动解决方法?

或者,也许,只是,用 Node 堆栈来替代 bcrypt 的好方法是什么?

最佳答案

Liam 的评论是关于钱的,只是为 future 的互联网旅行者扩展它。

问题是您已将 node_modules 文件夹复制到容器中。这是一个问题的原因是 bcrypt 是一个本地模块。它不仅仅是 javascript,还有一堆在安装时编译的 C 代码。

从该编译中产生的二进制文件存储在 node_modules 文件夹中,并根据它们的构建位置进行定制。将他们从他们的 OSX 家移植到一个陌生的 Linux 领域会导致他们行为不端并提示 ELF header 和仙女脚。

解决方案是 echo node_modules >> .dockerignore 并运行 npm install 作为 Dockerfile 的一部分。这意味着 native 模块将在您的笔记本电脑上容器内部而不是在容器外部编译。

有了这个,就不需要在启动 CMD 之前运行 npm install 了。只需将它放在 Dockerfile 的构建阶段就可以了。

protip:官方 Node 镜像默认设置 NODE_ENV=production,npm 与 --production 标志相同。大多数时候这是一件好事。当您的 Dockerfile 还包含一些依赖于开发依赖项(webpack 等)的构建步骤时,这不是一件好事。在这种情况下,您需要 NODE_ENV=null npm install

专业提示:您可以通过将 package.json 单独复制到代码的其余部分来更好地利用 Docker 的缓存。让你的 Dockerfile 看起来像这样:

# Pull base image
FROM node:0.12

# Expose port 8080
EXPOSE 8080

# Set working directory to /data
WORKDIR /data

# Set working directory to /data
COPY package.json /data

# Install dependencies from package.json
RUN npm install

# Add current directory into path /data in image
ADD . /data

# Run index.js
CMD npm start

这样,Docker 只会在您更改 package.json 时重新运行 npm install,而不是每次更改一行代码时。

关于linux - Docker 容器中 bcrypt 的 ELF header 或安装问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31604334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com