I have my dokku cluster and would love to deploy it using docker and not buildpacks.
Overall, I'd say you guys've beat create-react-app by a lot!
FROM node:6-onbuild
# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install
# Bundle app source
COPY . /usr/src/app
RUN npm run build
EXPOSE 80
As I said I am trying to run this thing on my dokku, and exposing 80 kinda did the trick but now I can not get letsencrypt to work with this new app. Will keep investigating...
@ojosdegris Thanks for the research. It's really important to be able to deploy this everywhere. In the meanwhile, you can use now.
$ cd your-project
$ now
馃挜
I've made slight progress on figuring this out, but hit a roadblock.
.dockerignore:
npm-debug.log
.next
Dockerfile:
FROM node:argon
# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install
RUN npm run build
# Bundle app source
COPY . /usr/src/app
EXPOSE 3000
CMD [ "npm", "start" ]
bash:
$ docker build -t my-nodejs-app .
$ docker run -it -P --rm --name my-running-app my-nodejs-app
$ open http://localhost:32770/ # port number found using kitematic ui
Finally, I get a 404:

Ah, I just switched to node:6-onbuild instead of node:argon and everything worked fine 馃帀
Maybe we can add this to the wiki and close this issue?
I used the Dockerfile to build an image. The image size is 776 MB, is it too big? node:6-onbuild image is already 651 MB. Is there any slimmer node image that works?
@johannchen try node:alpine
Should work out of the box with any Node docker image. Next doesn't require anything special on top, other than running npm run build and npm run start.
Dockerfile mentioned here dont work for me `
Couldn't find a
pagesdirectory. Please create one under the project root`
I posted this tutorial which has a node-alpine image
https://medium.com/@sbr464/next-js-tutorial-deploy-to-docker-on-google-cloud-container-engine-6b0c19dd8ecb
This is what works for me. The issue with Couldn't find a pages directory. Please create one under the project root was caused by the postinstall script that tried to run next build, but at a moment that the files were not copied in yet.
My Dockerfile:
FROM node:11-alpine
WORKDIR /workspace
COPY package.json yarn.lock /workspace/
RUN yarn install
COPY . .
RUN yarn build
CMD ["yarn", "start"]
Using this Dockerfile -- starts at ~130MB.
FROM node:12-alpine as build
COPY . /src
WORKDIR /src
RUN npm ci
RUN npm run build
RUN npm prune --production
FROM node:12-alpine
WORKDIR /usr/app
COPY --from=build /src/node_modules /usr/app/node_modules
COPY --from=build /src/package.json /usr/app/package.json
COPY --from=build /src/.next /usr/app/.next
ENV NODE_ENV production
CMD ["npm", "start"]
@Meemaw Thank you very much
Below is my slightly production ready modified version
FROM node:13.7.0-alpine3.11 as build
COPY . .
ENV NPM_CONFIG_LOGLEVEL warn
RUN npm install --production
RUN npm run build
FROM node:13.7.0-alpine3.11
COPY --from=build package.json package.json
COPY --from=build package-lock.json package-lock.json
COPY --from=build .next .next
ENV NPM_CONFIG_LOGLEVEL warn
RUN npm install --production
EXPOSE 3000
CMD npm start
@whs-dot-hk Thank you.
Added public folder
FROM node:12-alpine as build
COPY . .
ENV NPM_CONFIG_LOGLEVEL warn
RUN npm install --production
RUN npm run build
FROM node:12-alpine
COPY --from=build package.json package.json
COPY --from=build package-lock.json package-lock.json
COPY --from=build .next .next
COPY --from=build public public
ENV NPM_CONFIG_LOGLEVEL warn
RUN npm install --production
EXPOSE 3000
CMD npm start
Here is my running application Dockerfile Create this inside the root folder -
FROM node:12
# Create app directory
RUN mkdir /var/movable/ && mkdir /var/movable/app
WORKDIR /var/movable/app
# Installing dependencies
COPY package*.json /var/movable/app/
RUN npm install
# Copying source files
COPY . /var/movable/app
# Building app
RUN npm run build
# Running the app
CMD "npm" "run" "start"
Thanks to @whs-dot-hk and @dickamin
Adding next.config.js (e.g. if you use basePath for routing)
FROM node:14-alpine as build
COPY . .
ENV NPM_CONFIG_LOGLEVEL warn
RUN npm install --production
RUN npm run build
FROM node:14-alpine
COPY --from=build package.json package.json
COPY --from=build package-lock.json package-lock.json
COPY --from=build next.config.js next.config.js
COPY --from=build .next .next
COPY --from=build public public
ENV NPM_CONFIG_LOGLEVEL warn
RUN npm install --production
EXPOSE 3000
CMD npm start
Most helpful comment
Using this Dockerfile -- starts at ~130MB.