dpdragnev
dpdragnev

Reputation: 2111

Docker container works, but fails when build from docker-compose

I have an application with 3 containers: client - an angular application, gateway - a .NET Core application, api - a .NET Core application

I am having trouble with the container hosting the angular application. Here is my Docker file:

#stage 1
FROM node:alpine as node
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build

#stage 2
FROM nginx:alpine
COPY --from=node /app/dist/caliber_client /usr/share/nginx/html
EXPOSE 80

and here is the docker compose file:

# Please refer https://aka.ms/HTTPSinContainer on how to setup an https developer certificate for your ASP .NET Core service.

version: '3.4'

services:
  calibergateway:
    image: calibergateway
    container_name: caliber-gateway
    build:
      context: .
      dockerfile: caliber_gateway/Dockerfile
    ports:
      - 7000:7000
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    networks:
      - caliber-local

  caliberapi:
    image: caliberapi
    container_name: caliber-api
    build:
      context: .
      dockerfile: caliber_api/Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    networks:
      - caliber-local

  caliberclient:
    image: caliber-client-image
    container_name: caliber-client
    build:
      context: .
      dockerfile: caliber_client/Dockerfile
    ports:
      - 7005:7005
    networks:
      - caliber-local

networks:
  caliber-local:
    external: true

When I build and run the angular container independently, I can connect and run the site, however if I try to build it with docker-compose, I get the following error:

enoent ENOENT: no such file or directory, open '/app/package.json'

I can see that npm cannot find the package.json, but I am copying the whole site to the /app directory in the docker file, so I am not sure where the disconnect is.

Thank you.

Upvotes: 0

Views: 716

Answers (1)

David Maze
David Maze

Reputation: 158647

In the Dockerfile, the left-hand side of COPY statements is always interpreted relative to the build: { context: } directory in the docker-compose.yml file (or the build: directory if there's not a nested argument, or the docker build directory argument; but in any case never anything outside this directory tree).

In a comment, you say

The package.json is one level deeper than the docker-compose.yml file. It is at the same level of the Dockerfile in the caliber_client folder.

Assuming that client application is self-contained, you can change the build definition to use the client subdirectory as the build context

build:
  context: caliber_client
  dockerfile: Dockerfile

or, since dockerfile: Dockerfile is the default, the shorter

build: caliber_client

If it's important to you to use the parent directory as the build context (maybe you're including some shared files that you don't show in the question) then you can also change the Dockerfile to refer to the subdirectory.

# when the build: { context: } is the parent directory of this one
COPY caliber_client .

Upvotes: 2

Related Questions