I can successfully create and run backend flask api and the frontend vue app inside individual containers with the following codes:
### Running the flask API in the backend ######### FROM python:3.6-slim as production WORKDIR /usr/src/app COPY requirements.txt ./backend/ COPY application.py ./backend/ RUN pip install -r /usr/src/app/backend/requirements.txt EXPOSE 5000 CMD ["python", "/usr/src/app/backend/application.py"] ###########################################################
### Running the main vue.js app as the frontend ###### FROM node:lts-alpine RUN npm install -g http-server WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . RUN npm run build #run the vue app & expose container port 8080 for the frontend CMD [ "http-server", "dist" ] EXPOSE 8080 ###########################################################
But when I try combining them inside a single container, only the vue app is running on localhost:8080 but it cannot access the flask api output which I thought would be running locally inside the container on port 5000
### Running the flask API in the backend ######### FROM python:3.6-slim as production WORKDIR /usr/src/app COPY requirements.txt ./backend/ COPY application.py ./backend/ RUN pip install -r /usr/src/app/backend/requirements.txt # EXPOSE 5000 CMD ["python", "/usr/src/app/backend/application.py"] ########################################################### ### Running the main vue.js app as the frontend ###### FROM node:lts-alpine RUN npm install -g http-server WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . RUN npm run build #run the vue app & expose container port 8080 for the frontend CMD [ "http-server", "dist" ] EXPOSE 8080 ###########################################################
Wondering if there is a way to run the flask api inside the container without spinning a separate container?
Advertisement
Answer
In a Dockerfile, the second CMD
command will overwrite the previous one. Check this post to get more information on the topic.
In this case, a better approach would be to have two separate Dockerfiles (one for the backend and one for the frontend) and use Docker Compose to launch them simultaneously.