'Okteto doesn't sync file changes even though syncthing reports changes

I'm using Okteto CLI version 2.2.1, MacOS Monterey (Macbook 2015). I've cloned and deployed their playground app and created the following Okteto configuration:

name: movies-with-compose

# The build section defines how to build the images of your development environment
# More info: https://www.okteto.com/docs/reference/manifest/#build
build:

  # You can use the following env vars to refer to this image in your deploy commands:
  #  - OKTETO_BUILD_API_REGISTRY: image registry
  #  - OKTETO_BUILD_API_REPOSITORY: image repo
  #  - OKTETO_BUILD_API_IMAGE: image name
  #  - OKTETO_BUILD_API_TAG: image tag
  api:
    context: api
    dockerfile: api/Dockerfile

  # You can use the following env vars to refer to this image in your deploy commands:
  #  - OKTETO_BUILD_FRONTEND_REGISTRY: image registry
  #  - OKTETO_BUILD_FRONTEND_REPOSITORY: image repo
  #  - OKTETO_BUILD_FRONTEND_IMAGE: image name
  #  - OKTETO_BUILD_FRONTEND_TAG: image tag
  frontend:
    context: frontend
    dockerfile: frontend/Dockerfile

  # You can use the following env vars to refer to this image in your deploy commands:
  #  - OKTETO_BUILD_INIT_REGISTRY: image registry
  #  - OKTETO_BUILD_INIT_REPOSITORY: image repo
  #  - OKTETO_BUILD_INIT_IMAGE: image name
  #  - OKTETO_BUILD_INIT_TAG: image tag
  init:
    context: api
    dockerfile: api/Dockerfile

  # You can use the following env vars to refer to this image in your deploy commands:
  #  - OKTETO_BUILD_MOVIES_REGISTRY: image registry
  #  - OKTETO_BUILD_MOVIES_REPOSITORY: image repo
  #  - OKTETO_BUILD_MOVIES_IMAGE: image name
  #  - OKTETO_BUILD_MOVIES_TAG: image tag
  movies:
    context: reverse-proxy
    dockerfile: reverse-proxy/Dockerfile

# The deploy section defines how to deploy your development environment
# More info: https://www.okteto.com/docs/reference/manifest/#deploy
deploy:
  compose:
    file: docker-compose.yml

# The dependencies section defines other git repositories to be deployed as part of your development environment
# More info: https://www.okteto.com/docs/reference/manifest/#dependencies
# dependencies:
#   - https://github.com/okteto/sample


# The dev section defines how to activate a development container
# More info: https://www.okteto.com/docs/reference/manifest/#dev
dev:
  api:
    command:
      - yarn
      - start
    sync:
      - api:/usr/src/app
    environment:
      - MONGODB_DATABASE=okteto
      - MONGODB_HOST=mongodb
      - MONGODB_PASSWORD=mongodb123
      - MONGODB_USERNAME=okteto
    forward:
      - 8081:8080
  frontend:
    image: okteto/node:14
    command: bash
    workdir: /src
    sync:
      - frontend:/src
    forward:
      - 9229:9229
      - 8080:80
  movies:
    command: bash
    workdir: /usr/src/app
    sync:
      - .:/usr/src/app
    forward:
      - 9229:9229
      - 8080:80

I'm deploying the api container and no matter what file changes I perform to server.js they're not reflected in the deployment. I ran okteto status --info to get the remote Syncthing URL and it does display that server.js was changed when I click Recent Changes:

enter image description here

I started okteto by running okteto up and this is the output I get:

enter image description here

I can't figure out why changes to files which I make on my local machine are not reflected in okteto deployment (they're only reflected if I run okteto build and then re-deploy). Perhaps I misunderstood Okteto docs but I expected for file changes to be reflected instantly in okteto deployment.

The dockerfile for the service I'm starting in Okteto is:

FROM node:14

WORKDIR /src

COPY package.json yarn.lock ./
RUN yarn install

COPY . .

EXPOSE 8080

CMD ["yarn", "start"]

EDIT: the issue shouldn't occur anymore as a pull request fixing the issue was merged



Solution 1:[1]

The issue was that the volume in docker-compose.yml for the api service is:

    volumes:
      - api:/usr/src/app

which is incorrect because the nodejs app is located in /src folder. Then when running okteto init the okteto manifest will automatically set the sync folder to api:/usr/src/app so any file changes locally will not result in updates in okteto cluster. Setting the volume in docker-compose.yml to be:

volumes:
      - api:/src

will solve the issue. In general I'm not sure volume should be defined at all in docker-compose.yml, I think it's enough to just define sync folder in okteto.yml (at least it worked for me because I guess Syncthing syncs files regardless of docker volume).

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Yos