Florian Ludewig
Florian Ludewig

Reputation: 6002

Monorepo Shared Package not Found when Running Docker-Compose

I have a monorepo set up with lerna and yarn workspaces. Everything is written in typescript and compiled into javascript.

But there is an issue with sharing packages when running the monorepo via docker-compose.

I've created a small repo, which mimics the behavior: https://github.com/skatestyle/stackoverflow-monorepo-dependencies.


Basically there is a @root/common and a @root/server package. The server imports the common. Everything works fine when running node packages/server/lib/index.js. (Please note, that you need to run yarn bootstrap and yarn build before starting)

But when running my docker-compose file via docker-compose up --build, I get the following error:

Building server
Step 1/4 : FROM node:alpine
 ---> d4edda39fb81
Step 2/4 : COPY . /src
 ---> Using cache
 ---> d96b00510d47
Step 3/4 : WORKDIR /src
 ---> Using cache
 ---> f112f411cdfb
Step 4/4 : CMD node lib/index.js
 ---> Using cache
 ---> 87a4cea60811
Successfully built 87a4cea60811
Successfully tagged stackoverflow-monorepo-dependecies_server:latest
Starting stackoverflow-monorepo-dependecies_server_1 ... done
Attaching to stackoverflow-monorepo-dependecies_server_1
server_1  | internal/modules/cjs/loader.js:626
server_1  |     throw err;
server_1  |     ^
server_1  | 
server_1  | Error: Cannot find module '@root/common'
server_1  | Require stack:
server_1  | - /src/lib/index.js
server_1  |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:623:15)
server_1  |     at Function.Module._load (internal/modules/cjs/loader.js:527:27)
server_1  |     at Module.require (internal/modules/cjs/loader.js:681:19)
server_1  |     at require (internal/modules/cjs/helpers.js:16:16)
server_1  |     at Object.<anonymous> (/src/lib/index.js:7:16)
server_1  |     at Module._compile (internal/modules/cjs/loader.js:774:30)
server_1  |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:785:10)
server_1  |     at Module.load (internal/modules/cjs/loader.js:641:32)
server_1  |     at Function.Module._load (internal/modules/cjs/loader.js:556:12)
server_1  |     at Function.Module.runMain (internal/modules/cjs/loader.js:837:10) {
server_1  |   code: 'MODULE_NOT_FOUND',
server_1  |   requireStack: [ '/src/lib/index.js' ]
server_1  | }

And yes, I need to use docker-compose, because my real project has more servers running.

The error probably lies in my Dockerfile or docker-compose.yml, but I can't find it.

Thanks in advance for every help!

Upvotes: 1

Views: 3893

Answers (1)

seddikomar
seddikomar

Reputation: 825

On you docker-compose you create volume

./packages/server:/src

The structure inside container will be different to your local. try :

version: '3'
services: 
   server: 
      build: ./packages/server 
      volumes: - ./:/src 

and on dockerfile:

FROM node:alpine
COPY . /src
WORKDIR /src
CMD ["node","packages/server/lib/index.js"]

Hope it helps

Upvotes: 4

Related Questions