What is the CMD command for nats-server inside Dockerfile

2.9k Views Asked by At

I am currently building an application using NestJS by following microservice architecture. And use NATS as a messaging system. It works fine on my local machine but I am unable to dockerized the NATS server.

The folder structure of my project:

├─── services/
    ├─── nats/
    |       Dockerfile
    ├─── client/
    |       ...
    |       ...
    |       .dockerignore
    |       Dockerfile
    └─── docker-compose.yml

Now, the Dockerfile inside nats/ folder describes as below:

FROM nats:2.1.9

EXPOSE 4222

CMD [ "nats-server" ]

And Dockerfile inside client/ folder describes as:

FROM node:12

WORKDIR /myProject/src/app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

EXPOSE 8081

CMD [ "node", "dist/main" ]

And the docker-compose.yml is:

version: '3'

services:
  nats-server:
    image: nats:2.1.9
    restart: always
    build: ./nats
    ports:
      - 4222:4222

  client-service:
    build: ./client
    volumes:
      - ./client:/myProject/src/app
    depends_on:
      - nats-server
    environment:
      NODE_ENV: development
    ports:
      - 8081:3000

I've run the command sudo docker-compose build and found no error, after that run the command sudo docker-compose up and found the following error:

Recreating services_nats-server_1 ... done
Recreating services_client-service_1 ... done
Attaching to services_nats-server_1, services_client-service_1
nats-server_1     | nats-server: unrecognized command: "nats-server_1"
services_nats-server_1 exited with code 1
nats-server_1     | nats-server: unrecognized command: "nats-server_1"
nats-server_1     | nats-server: unrecognized command: "nats-server_1"
nats-server_1     | nats-server: unrecognized command: "nats-server_1"
client-service_1  | [Nest] 1   - 12/03/2020, 4:44:34 PM   [NestFactory] Starting Nest application...
client-service_1  | [Nest] 1   - 12/03/2020, 4:44:34 PM   [InstanceLoader] AppModule dependencies initialized +41ms
client-service_1  | [Nest] 1   - 12/03/2020, 4:44:34 PM   [InstanceLoader] MongooseModule dependencies initialized +1ms
client-service_1  | [Nest] 1   - 12/03/2020, 4:44:34 PM   [InstanceLoader] ClientsModule dependencies initialized +1ms
client-service_1  | [Nest] 1   - 12/03/2020, 4:44:34 PM   [InstanceLoader] ClientsModule dependencies initialized +0ms
client-service_1  | [Nest] 1   - 12/03/2020, 4:44:34 PM   [InstanceLoader] ConfigHostModule dependencies initialized +1ms
client-service_1  | [Nest] 1   - 12/03/2020, 4:44:34 PM   [InstanceLoader] ConfigModule dependencies initialized +1ms
services_nats-server_1 exited with code 1
nats-server_1     | nats-server: unrecognized command: "nats-server_1"
nats-server_1     | nats-server: unrecognized command: "nats-server_1"
nats-server_1     | nats-server: unrecognized command: "nats-server_1"
nats-server_1     | nats-server: unrecognized command: "nats-server_1"
nats-server_1     | nats-server: unrecognized command: "nats-server_1"

There is no problem with the client service Dockerfile, as it depends on the nats-server tried to run it first. Can anyone please help me to figure out the problem?

I would like to thank you for your time and consideration.

2

There are 2 best solutions below

0
On BEST ANSWER

The build: command for the nats-server service has overwritten the Docker Hub image. I just need to pull the image and expose the port.

So, my docker-compose.yml file will be as following:

version: '3'

services:
  nats-server:
    image: nats:2.1.9
    restart: always
    ports:
      - 4222:4222

  client-service:
    build: ./client
    volumes:
      - ./client:/myProject/src/app
    depends_on:
      - nats-server
    environment:
      NODE_ENV: development
    ports:
      - 8081:3000
2
On

Check the Dockerfile and you'll notice that ENTRYPOINT is set to /nats-server and CMD is the parameters to ENTRYPOINT (--config nats-server.conf in that case). Unless you extend the nats image you don't need to build a new one based on it (remove build: ./nats from the compose file). Overriding the default CMD can be achieved by setting command: on the docker-compose.yml.