Hi, I'm trying to deploy my app to production with Docker, but I struggle a lot. Here is the structure from the root folder :
- a server folder : runs with Express on port 4000
- a web folder : a React app running on 3000 (locally), that needs to run on 80 on my server
- a docker-compose.prod.yml file in the root folder
What I'm currently trying :
- the docker-compose.prod.yml is running a Postgres service (port 5432), as well as web and server's respective Dockerfile
- a Dockerfile in both web and server folders
- I
yarn buildboth server and web folders locally and send everything on my server - on my server, I run
docker build -f web/Dockerfile.prod -t app_web ./webanddocker build -f server/Dockerfile.prod -t app_server ./serverto build both images - finally, I run
docker-compose -f docker-compose.prod.yml up
My problem :
The server container throws Error: Cannot find module '...' although I run yarn install --production in its Dockerfile (it may be related to volumes?)
Also, when I run docker run -it -p 80:80 app_web and docker-compose up, the web container acts differently when visiting my server IP address : in the first case, the app displays well, in the second case, a page is listing my web folder content (all files and folders)
I'd really appreciate help as I'm a bit new to Docker in production (should I use docker machine? are my folders structure / docker-compose / Dockerfiles wrong?)
docker-compose.prod.yml :
version: "3" services: db: image: postgres:latest restart: on-failure environment: POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_NAME} POSTGRES_PASSWORD: ${DB_PASSWORD} ports: - 5432:5432 volumes: - ./.db/data:/var/lib/postgresql/data server: container_name: app_server build: context: ./server dockerfile: Dockerfile.prod volumes: - ./server:/app/server ports: - 4000:4000 depends_on: - db web: container_name: app_web build: context: ./web dockerfile: Dockerfile.prod volumes: - ./web:/app/web ports: - 80:80 depends_on: - db server/Dockerfile.prod :
FROM mhart/alpine-node:11 AS builder WORKDIR /app/server COPY package.json ./ RUN yarn install --production COPY . . FROM mhart/alpine-node WORKDIR /app/server COPY --from=builder /app/server . CMD ["node", "/app/server/dist"] web/Dockerfile.prod :
FROM mhart/alpine-node:11 AS builder WORKDIR /app/web COPY package.json . RUN yarn install --production COPY . . FROM mhart/alpine-node RUN yarn global add serve WORKDIR /app/web COPY --from=builder /app/web/build . CMD ["serve", "-p", "80", "-s", "."]