I know my question might be too simple but as i’m not a Docker expert, i’m kinda stuck with it
the follow is my docker configs
1- docker-compose.yml
version: "3.4"
services:
angular:
build:
context: .
dockerfile: docker/staging/angular.dockerfile
ports:
- '4200:4200'
nginx:
build:
context: .
dockerfile: docker/staging/nginx.dockerfile
ports:
- '80:80'
depends_on:
- angular
2- angular.dockerfile
FROM node as node
MAINTAINER fustany-admin
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
COPY package*.json /usr/src/app/
RUN npm install --legacy-peer-deps
RUN npm install -g @angular/cli
COPY ./ /usr/src/app
EXPOSE 4200
RUN ng build --configuration=production
# COPYING SHOULD BE HERER ?
CMD ["ng", "serve", "--host", "0.0.0.0", "--port", "4200"]
3- nginx.dockerfile
# nginx
FROM nginx
MAINTAINER fustany-admin
COPY nginx/staging-default.conf /etc/nginx/conf.d/default.conf
# Tried thoes and nothing worked
# COPY dist /usr/share/nginx/html
# COPY --from=node ./usr/src/app/dist/fustany /usr/share/nginx/html/
EXPOSE 80
4- nginx.config
server {
listen 80;
server_name 46.101.58.213;
if ($http_x_forwarded_proto = 'http') {
return 301 https://$server_name$request_uri;
}
sendfile on;
default_type application/octet-stream;
gzip on;
gzip_http_version 1.1;
gzip_disable "MSIE [1-6].";
gzip_min_length 256;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 9;
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ /index.html =404;
}
}
Everything works fine with me, build is successful and containers run fine with nginx welcoming message (because dist isn’t copied)
Once i manually copy the dist folder from angular container to nginx container under /usr/share/nginx/html
everything works fine
So I’m just missing how to properly copy the dist as it always giving me file/folder doesn’t exist, and i’m sure i’m conflicting between the build context files and the actual files
3
Answers
Try the following in the nginx.dockerfile
The two Dockerfiles need to be the same file; you can literally concatenate one to the other.
With these in the same file, this sets up a multi-stage build. The
COPY --from=...
finds theFROM ... AS ...
earlier in the same file, and you can copy files between stages. If these are separate Dockerfiles, then when the second file saysCOPY --from=node
, it tries to copy a file from thenode:latest
image, and it just isn’t there. (I’ve renamed theAS
to something different from the original image to disambiguate this.)Correspondingly, you don’t need a separate dev-server container in your
docker-compose.yml
file. You can reduce this to:I was getting the same error but the error was not code related. Updating docker to latest version solved the issue for me.