gofiber / cli

Fiber Command Line Interface
MIT License
85 stars 12 forks source link

How can I get hot reloading work in docker? 🤗 #102

Open hcancelik opened 2 years ago

hcancelik commented 2 years ago

Question description I'm having trouble getting the hot reloading working with fiber dev inside a docker container.

Here is my Dockerfile.

FROM golang:1.18-alpine as build

WORKDIR /go/src/api

RUN go install github.com/gofiber/cli/fiber@latest

COPY . .

RUN go mod download

CMD ["fiber", "dev"]

Here is my docker-compose file.

services:
  db:
    image: mongo:5.0.7
    restart: always
    ports:
      - 27017:27017
    volumes:
      - mongodb:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${DB_USERNAME:-root}
      MONGO_INITDB_ROOT_PASSWORD: ${DB_PASSWORD:-password}

  api:
    depends_on:
      - db
    build:
      context: ./api
      target: build
    restart: always
    ports:
      - 3000:3000
    volumes:
      - ./api:/app

volumes:
  mongodb:

I do see the files being changed inside the container but I cannot get the fiber cli to restart the fiber. What I might be missing?

Thanks.

welcome[bot] commented 2 years ago

Thanks for opening your first issue here! 🎉 Be sure to follow the issue template! If you need help or want to chat with us, join us on Discord https://gofiber.io/discord

MohabMohamed commented 2 years ago

@hcancelik I think the problem is you are mounting the wrong directory inside the container. you are mounting /app in the docker-compose file and putting your code in /go/src/api.

so try to change the docker file line WORKDIR /go/src/api to WORKDIR /app or change in your docker-compose.yml the part

    volumes:
      - ./api:/app

to

    volumes:
      - ./api:/go/src/api

both solutions should work, if it still not working please tell me.

hcancelik commented 2 years ago

Thanks for the reply @MohabMohamed.

They are indeed wrong, so I've corrected them. However, the hot reload is still not working.

TheTeaCat commented 2 years ago

I've had this issue today with an Ubuntu 22.04 machine, while the hot reloading works fine on a mac.

I'm pretty certain what this comes down to is the fact that file system events on the Ubuntu host machine don't get propagated into the container - if we go inside the container and modify the files from within then the hot reloading works, but if we modify it from the host machine it doesn't.

If the host machine is MacOS then changes on the host machine do trigger the hot reload as osxfs supports creation, modification, attribute change, deletion and directory change events. See the docs here.

This is an issue for non-mac users wanting to containerise their development environments face with various different development tools that provide hot reloading, and the typical solution is to provide a legacy watch option which periodically checks for changes instead of relying upon file system events. This CLI tool doesn't have one, though. Feature request maybe?

In the meantime I'm going to experiment with using air instead, which has been suggested in this comment in an issue on the gofiber/fiber repo regarding hot reload support.

TheTeaCat commented 2 years ago

Update: air also doesn't have a legacy watch option, so neither air or the fiber cli work in my use case.