He probado todas las soluciones de esta publicación y esta publicación
No encuentro una solución para deshacerme del siguiente error al ejecutar docker-compose up :
module.js:598 return process.dlopen(module, path._makeLong(filename)); ^ Error: /code/node_modules/bcrypt/lib/binding/bcrypt_lib.node: invalid ELF headerAquí está mi último intento docker-compose.yml
version: "2" services: app: build: ./client ports: - "3000:3000" links: - auth volumes: - ./client:/code auth: build: ./auth-service ports: - "3002:3002" links: - db volumes: - ./auth-service:/code db: ...Y mi servicio de autenticación Dockerfile:
FROM node:7.7.1 EXPOSE 3002 WORKDIR /code COPY package.json /code RUN npm install COPY . /code CMD npm startDespués de probar cada una de las soluciones de los dos enlaces anteriores, reconstruyo los contenedores y siempre da como resultado el mismo error.
También vale la pena señalar que el servicio funciona bien localmente, cuando no uso la ventana acoplable.
¿Cómo hago para que docker funcione con bcrypt?
Actualizar
Pude hacerlo funcionar haciendo lo siguiente:
docker psdocker exec -t -i containerId /bin/bashnpm install bcryptEsto no es ideal para la portabilidad.
Pasé algunas horas tratando de resolver esto y al final se me ocurrió la siguiente solución. Mi archivo de composición se ve así...
version: "3" services: server: build: context: ./server volumes: - ./server:/usr/src/app - /usr/src/app/node_modules/ ports: - 3050:3050 depends_on: - db command: ["nodemon", "./bin/www"]El segundo montaje de volumen allí es el importante, ya que soluciona el problema del node_module local.
Solo como referencia, mi dockerfile es así:
FROM node RUN npm install -g nodemon RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json /usr/src/app RUN npm install EXPOSE 3050 CMD ["nodemon", "./bin/www"]estaba luchando con esto unas cuantas veces, la solución ".dockerignore" no funcionará si usa volúmenes lamentablemente, ya que solo está relacionado con el comando "Copiar" y solo cuando construye el contenedor.
la única solución que encontré, que creo que tiene más sentido, es volumen solo lo que necesita, ¿qué significa? Divida su código fuente y los archivos de "configuraciones" (como package.json):
- origen -- más código -- máscódigo2 -- servidor.js - índice.js - paquete.json - jslint.json - tsconfig.json - .env - .dockerignore - ... etc
y coloque el volumen solo en la carpeta "src", de esa manera sus compilaciones también serán mucho más rápidas y sus módulos de nodo se compilarán e instalarán en el sistema operativo correcto, no olvide agregar .dockerignore a node_modules para evitar que se formen compilaciones tomando más tiempo innecesario
tenga en cuenta que hacerlo requerirá la reconstrucción de la aplicación cada vez que agregue un nuevo paquete, pero si usa las mejores prácticas de npm y divide la instalación de npm en su archivo acoplable para almacenar en caché, será más rápido
La razón por la que ocurre este error es que el módulo de nodo bcrypt se compila primero en su máquina original (específica para su sistema operativo) y cuando se crea una imagen en la ventana acoplable, no se puede ejecutar porque el sistema operativo ya no es el mismo. solución cree un archivo .dockerignore en su carpeta raíz y agregue node_modules a este archivo.