简体   繁体   中英

Cannot find module error for a node js app running in a docker environment

This application is written in ES6 and compile to ES5 using babel. The build files stored in the following order inside the build folder. the dockerfile reside in the outside the build folder.

 -build ---public ---server ---shared ---package.json -Dockerfile

This is my docker file.

 FROM node:8.9-alpine ENV NODE_ENV production WORKDIR /usr/src/app ADD ./build/ /usr/src/app RUN npm install --production --silent RUN ls /usr/src/app/ RUN ls /usr/src/app/server/ EXPOSE 3000 CMD ["node", "/usr/src/app/server/index.js", "--config", "/usr/src/app/config.json"]

This is the output I get when running the image build command.

 Sending build context to Docker daemon 16.08MB Step 1/9 : FROM node:8.9-alpine ---> 406f227b21f5 Step 2/9 : ENV NODE_ENV production ---> Using cache ---> 090d3e742281 Step 3/9 : WORKDIR /usr/src/app ---> Using cache ---> fa2a344bd8ee Step 4/9 : ADD ./build/ /usr/src/app ---> 93559e34a45a Step 5/9 : RUN npm install --production --silent ---> Running in ebc2b6b2ba1a added 212 packages in 15.212s Removing intermediate container ebc2b6b2ba1a ---> b49180988a07 Step 6/9 : RUN ls /usr/src/app/ ---> Running in b140530cb8ca build-info.json node_modules package-lock.json package.json public server shared Removing intermediate container b140530cb8ca ---> 0712e1b84e1a Step 7/9 : RUN ls /usr/src/app/server/ ---> Running in b6570fbc8d2c auth configuration database files index.js sessions users utils Removing intermediate container b6570fbc8d2c ---> c49775551756 Step 8/9 : EXPOSE 3000 ---> Running in 9318dfc0f183 Removing intermediate container 9318dfc0f183 ---> ad20aec92973 Step 9/9 : CMD ["node", "/usr/src/app/server/index.js", "--config", "/usr/src/app/config.json"] ---> Running in fa6c2e388906 Removing intermediate container fa6c2e388906 ---> ba1ced3be150 Successfully built ba1ced3be150 Successfully tagged tiqri:myclaim SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

After image created, i start the image using the following command. "docker run -d -v C:\\portal\\environments\\development:/usr/src/app/ -p 3000:80 f057e4bc8191" There is volume map for config files.

But the container, not running. when I check the logs, it shows the following error.

 C:\\portal>docker logs c819d39fea61 module.js:540 throw err; ^ Error: Cannot find module '/usr/src/app/server/index.js' at Function.Module._resolveFilename (module.js:538:15) at Function.Module._load (module.js:468:25) at Function.Module.runMain (module.js:684:10) at startup (bootstrap_node.js:187:16) at bootstrap_node.js:608:3

I couldn't figure out why giving this error even though all folders are in place in the docker container(RUN ls- shows the folder structure in the container). still, I couldn't start the container because of this error.

UPDATE

Based on the answer given by @Marcos Casagrande, made changes to the docker file and container run command as follows. Now I'm getting a new error.

After made changes in the Dockerfile.

 FROM node:8.9-alpine ENV NODE_ENV production WORKDIR /usr/src/app ADD ./build/ /usr/src/app RUN npm install --production --silent && mv node_modules ../ RUN mkdir /usr/src/app/environments RUN mkdir /usr/src/app/environments/development RUN ls /usr/src/app/ RUN ls /usr/src/app/server/ EXPOSE 3000 CMD ["node", "/usr/src/app/server/index.js", "--config", "/usr/src/app/environments/development/config.json"]

container run command changed as follows, "docker run -d -v C:\\portal\\environments\\development:/usr/src/app/environments/development -p 3000:80 ca290d67ff34"

Then I get the following error when checking the logs. The container does not start yet.

 /usr/src/app/environments/development/config.json /usr/src/app/environments/development/config.json fs.js:646 return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); ^ Error: ENOENT: no such file or directory, open '/usr/src/app/environments/development/config.json' at Object.fs.openSync (fs.js:646:18) at Object.fs.readFileSync (fs.js:551:33) at loadJSON (/usr/src/node_modules/convict/lib/convict.js:364:25) at /usr/src/node_modules/convict/lib/convict.js:501:17 at Array.forEach (<anonymous>) at Object.loadFile (/usr/src/node_modules/convict/lib/convict.js:500:13) at Object.<anonymous> (/usr/src/app/server/configuration/configuration.js:156:19) at Module._compile (module.js:643:30) at Object.Module._extensions..js (module.js:654:10) at Module.load (module.js:556:32)

Without knowing the contents of C:\\portal\\environments\\development I will assume that there isn't server/index.js in it.

I couldn't figure out why giving this error even though all folders are in place in the docker container(RUN ls- shows the folder structure in the container). still i couldnt start the container because of this error.

RUN ls is executed after you copy the build dir, when building the docker image, if you run ls when you start the container you will see that there is no server/index.js

While you're copying the build folder to /usr/src/app/ , you're overriding that files when mounting development folder on /usr/src/app .

The easiest way, is to mount C:\\portal\\environments\\development on /usr/src/app/development .

docker run -d -v C:\portal\environments\development:/usr/src/app/development/ -p 3000:80 f057e4bc8191

Also you can mount development on /usr/src/app and then use the build/server that was build on the image:

-v C:\portal\environments\development:/usr/src/app/ -v /usr/src/app/server

You will have to do that for every folder that you need from the built image.

-v /usr/src/app/server -v /usr/src/app/public -v ...

I had a similar problem running a docker container. I figured out I might I have created the image wrongly and I resolved this by deleting the image and rebuilding. but first I had to delete the existing containers of the image like below

    docker rm containerId

then I deleted the image like below

    docker rmi imageId

then I rebuilt the image and ran to create a new container.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM