Файлы внутри контейнера Docker не обновляются при редактировании в host

#docker #docker-compose #dockerfile

#docker #docker-compose #dockerfile

Вопрос:

Я использую Docker, который работает нормально.
Я могу запустить образ Docker с помощью docker-compose.

 docker-compose rm nodejs; docker-compose rm db; docker-compose up --build
  

Я прикрепил оболочку к контейнеру Docker с помощью

 docker exec -it nodejs_nodejs_1 bash
  

Я могу просматривать файлы внутри контейнера

 (inside container)
cat server.js
  

Теперь, когда я редактирую server.js файл внутри host, я хотел бы, чтобы файл внутри контейнера изменился без необходимости перезапуска Docker.
Я пытался добавить volumes в docker-compose.yml файл или в Dockerfile, но почему-то я не могу заставить это работать.

 (Dockerfile, not working)
FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
VOLUMES ["/usr/src/app"]

EXPOSE 8080
CMD [ "npm", "run", "watch" ]
  

или

 (docker-compose.yml, not working)
version: "3.3"
services:
  nodejs:
    build: ./nodejs-server
    ports:
      - "8001:8080"
    links:
      - db:db
    env_file:
      - ./.env-example
    volumes:
      - src: /usr/src/app
  db:
    build: ./mysql-server
    volumes:
      - ./mysql-server/data:/docker-entrypoint-initdb.d #A folder /mysql-server/data with a .sql file needs to exist
    env_file:
      - ./.env-example
volumes:
  src:
  

Вероятно, где-то есть простое руководство, но я его пока не нашел.

Комментарии:

1. используйте тома в файле compose следующим образом: ./path/to/application:/usr /src/app

Ответ №1:

Если вы хотите, чтобы копия файлов была видна в контейнере, используйте том bind mount (он же том host) вместо именованного тома.

Предполагая, что ваш файл docker-compose.yml находится в корневом каталоге нужного вам местоположения в / usr / src / app, вы можете изменить свой docker-compose.yml следующим образом:

 version: "3.3"
services:
  nodejs:
    build: ./nodejs-server
    ports:
      - "8001:8080"
    links:
      - db:db
    env_file:
      - ./.env-example
    volumes:
      - .:/usr/src/app
  db:
    build: ./mysql-server
    volumes:
      - ./mysql-server/data:/docker-entrypoint-initdb.d #A folder /mysql-server/data with a .sql file needs to exist
    env_file:
      - ./.env-example
  

Комментарии:

1. В моем случае местоположение, которое я хочу сохранить, /usr/src/app находится во вложенной папке nodejs-server . Я изменил вашу строку - .:/usr/src/app на - ./nodejs-server:/usr/src/app , и это работает 🙂