Argon2 与节点 docker 容器

Posted

技术标签:

【中文标题】Argon2 与节点 docker 容器【英文标题】:Argon2 with node docker container 【发布时间】:2020-06-16 01:48:45 【问题描述】:

我的 NestJs 应用程序可以在我的本地机器(Windows)上完美运行。 现在我想为我的应用程序创建一个 docker 容器。 当我尝试启动我的容器时,我遇到了 Argon2 的一个问题。 我在容器上安装了所有需要的氩气。 我的错在哪里?

谢谢

internal/modules/cjs/loader.js:1025
  return process.dlopen(module, path.toNamespacedPath(filename));
                 ^

Error: Error loading shared library /usr/src/app/node_modules/argon2/build/Release/argon2.node: Exec format error
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:1025:18)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Module.require (internal/modules/cjs/loader.js:852:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at load (/usr/src/app/node_modules/node-gyp-build/index.js:20:10)
    at Object.<anonymous> (/usr/src/app/node_modules/argon2/argon2.js:5:81)
    at Module._compile (internal/modules/cjs/loader.js:959:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)

Dockerfile:

FROM node:12.13-alpine As development

WORKDIR /usr/src/app

COPY package*.json ./

# --no-cache: download package index on-the-fly, no need to cleanup afterwards
# --virtual: bundle packages, remove whole bundle at once, when done
RUN apk --no-cache --virtual build-dependencies add \
    python \
    make \
    g++ \
    && npm install \
    && apk del build-dependencies
RUN npm install -g node-gyp
RUN npm install argon2
RUN npm install --only=development

COPY . .

RUN npm run build

FROM node:12.13-alpine as production

ARG NODE_ENV=production
ENV NODE_ENV=$NODE_ENV

WORKDIR /usr/src/app

COPY package*.json ./

# --no-cache: download package index on-the-fly, no need to cleanup afterwards
# --virtual: bundle packages, remove whole bundle at once, when done
RUN apk --no-cache --virtual build-dependencies add \
    python \
    make \
    g++ \
    && npm install \
    && apk del build-dependencies
RUN npm install -g node-gyp
RUN npm install argon2
RUN npm install --only=production

COPY . .

COPY --from=development /usr/src/app/dist ./dist

CMD ["node", "dist/main"]

码头工人撰写:

version: "3.7"

services:
  main:
    container_name: NestApp
    build:
      context: .
      target: development
    volumes:
      - .:/usr/src/app
      #- /usr/src/app/node_modules
    ports:
      - 3001:3001
    command: npm run start:dev
    networks:
      - webnet
    depends_on:
      - mysql
  mysql:
    image: mysql:5
    restart: always
    networks:
      - webnet
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: bdd
    ports:
      - "3306:3306"
    volumes:
      - my-db:/var/lib/mysql
  adminer:
    image: adminer
    restart: always
    ports:
      - 8085:8080
    networks:
      - webnet
networks:
  webnet:
    driver: bridge
# Names our volume
volumes:
  my-db:

【问题讨论】:

您是否有忽略您的node_modules 目录的.dockerignore 文件? 谢谢,解决了我的问题 【参考方案1】:

我也遇到了这个问题,我做了 Jay McDoniel 的上述提示。尽管对我来说,我也遇到了另一个似乎引发了同样错误的问题。对我来说,问题是我不小心在我的项目中npm installed 了一些东西,同时使用了一个我应该有yarn added 的纱线项目,这给出了一个警告:

warning package-lock.json found. Your project contains lock files generated by    
tools other than Yarn. It is advised not to mix package managers in order to avoid 
resolution inconsistencies caused by unsynchronized lock files. To clear this. 
warning, remove package-lock.json.

直到我删除了package-lock.json,问题才得到解决(经验教训:从两个锁文件(yarn.lockpackage-lock.json)中选择你最不喜欢的,从你的项目中删除并始终只保留一种类型的包yarnnpm 之间使用的经理)

【讨论】:

【参考方案2】:

为后代着想回答:

听起来您没有.dockerignore 文件,所以当您使用COPY . . 时,您正在从本地机器(Windows)拉取node_modules 文件夹并尝试在Docker(Alpine Linux)中运行它,所以当您正确的时候在 Docker 上下文中运行 npm install argon2,当您从本地复制到 Docker 时会覆盖它。如果您创建一个.dockerignore 文件,请将/node_modules 添加到其中,这样您就不会移动node_modules 目录

【讨论】:

以上是关于Argon2 与节点 docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

docker compose 将 mongodb 容器与节点 js 容器连接起来

Docker深入浅出系列 | 单节点多容器网络通信

kubeadm安装Kubernetes v1.24.0 docker

浅述Docker的容器编排

浅述Docker的容器编排

如何从 docker 容器中获取节点版本?