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!
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