'Path Error running AdonisJS in production via Docker

I'm getting a path error from require-ts and I have no idea how to determine what I'm missing. The app works fine locally using node ace serve but not within docker on a production server.

This is the error:

docker exec -it adonis_app node ace list:routes

  TypeError

 The "path" argument must be of type string. Received undefined


   1  Cache.makeCachePath
      /home/node/app/node_modules/@adonisjs/require-ts/build/src/Cache/index.js:41

   2  Config.getCached
      /home/node/app/node_modules/@adonisjs/require-ts/build/src/Config/index.js:139

   3  Config.parse
      /home/node/app/node_modules/@adonisjs/require-ts/build/src/Config/index.js:156

   4  register
      /home/node/app/node_modules/@adonisjs/require-ts/build/index.js:82

   5  Object.registerForAdonis [as default]
      /home/node/app/node_modules/@adonisjs/assembler/build/src/requireHook/index.js:17

   6  registerTsHook
      /home/node/app/node_modules/@adonisjs/core/build/src/utils/index.js:26

   7  App.onFind
      /home/node/app/node_modules/@adonisjs/core/build/src/Ignitor/Ace/App/index.js:132

This is my dockerfile:

ARG NODE_IMAGE=node:16.13.1-alpine

FROM $NODE_IMAGE AS base
RUN apk --no-cache add dumb-init
RUN mkdir -p /home/node/app && chown node:node /home/node/app
WORKDIR /home/node/app
USER node
RUN mkdir tmp

FROM base AS dependencies
COPY --chown=node:node ./package*.json ./
COPY --chown=node:node ./tsconfig*.json ./
RUN npm ci
COPY --chown=node:node . .

FROM dependencies AS build
RUN node ace build --production --ignore-ts-errors

FROM base AS production
ENV NODE_ENV=production
ENV PORT=$PORT
ENV HOST=0.0.0.0
COPY --chown=node:node ./package*.json ./
RUN npm ci --production
COPY --chown=node:node --from=build /home/node/app/build .
EXPOSE $PORT
CMD [ "dumb-init", "node", "build/server.js" ]

And docker-compose:

version: '3'

services:



  adonis_app:
    container_name: adonis_app
    restart: always
    build:
      context: .
      #target: dependencies
    depends_on:
      - postgres
    ports:
      - ${PORT}:${PORT}
      - 9229:9229
    env_file:
      - .env
    volumes:
      - ./:/home/node/app
      - uploads:/home/node/app/public/uploads
    networks:
      - adonis
    #command: dumb-init node ace serve --watch --node-args="--inspect=0.0.0.0"
    #command: dumb-init node build/server.js --node-args="--inspect=0.0.0.0"


  postgres:
    image: postgres:13.1
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
      timeout: 45s
      interval: 10s
      retries: 10
    restart: always
    environment:
      - POSTGRES_USER=${ROOT_DB_USER}
      - POSTGRES_PASSWORD=${ROOT_DB_PASS}
      - APP_DB_USER=${PG_USER}
      - APP_DB_PASS=${PG_PASSWORD}
      - APP_DB_NAME=${PG_DB_NAME}
    volumes:
      #- ./db:/docker-entrypoint-initdb.d/
      - ./db:/var/lib/postgresql/data
    ports:
      - 54325:5432
    networks:
      - adonis

networks:
  adonis:
    driver: bridge
    
volumes:
    db:
      driver: local
    uploads:
      driver: local

I receive the same error when running any ace command, such as migration and seeding. What am I missing?



Solution 1:[1]

I finally have a solution after watching the adonis compiled code for two hours.

I found out that adonis uses a library called find-cache-dir. And it seems that it doesn't find any cache directory, so it returns undefined (the famous one).

The solution I opted for is to just specify the cache directory in the environment variables.
For example:

ENV CACHE_DIR /home/node/app/.cache/

Consult the library documentation if you want to specify the cache directory elsewhere.

EDIT: If the library returns undefined it could also be because the node_modules directory is not writable, in this case make it writable or move the cache directory.

Thanks for reading (this is my first answer).

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Galitan