Односторонняя синхронизация вместо двухсторонней для Docker Volume? - PullRequest
0 голосов
/ 03 мая 2019

Я использую Docker Compose для локальной среды разработки для проекта Full Stack Javascript.

часть моего файла Docker Compose выглядит следующим образом

version: "3.5"
services:
  frontend:
    build:
      context: ./frontend/
      dockerfile: dev.Dockerfile
    env_file:
      - .env
    ports:
      - "${FRONTEND_PORT_NUMBER}:${FRONTEND_PORT_NUMBER}"
    container_name: frontend
    volumes:
      - ./frontend:/code
      - frontend_deps:/code/node_modules
      - ../my-shared-module:/code/node_modules/my-shared-module

Я пытаюсь разработать собственный модуль Node под названием my-shared-module, поэтому я добавил - ../my-shared-module:/code/node_modules/my-shared-module в файл Docker Compose. Модуль узла размещается в частном репозитории Git и определяется следующим образом: package.json

  "dependencies": {
    "my-shared-module": "http://gitlab+deploy-token....@gitlab.com/.....git",

Моя проблема в том,

Когда я запускаю update моих узловых модулей в контейнере Docker, используя npm install, он загружает my-shared-module из моего личного репозитория Git в /code/node_modules/my-shared-module, и это перезаписывает файлы на хосте ../my-shared-module, потому что они синхронизируются.

Итак, мой вопрос: возможно ли иметь одностороннюю синхронизацию громкости в Docker?

  • при смене хоста обновить контейнер
  • при изменении контейнера не обновлять хост?

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Вы можете написать что-нибудь для этого.Смонтируйте узел host_modules в другой каталог внутри контейнера и в точке входа скопируйте каталог:

version: "3.5"
services:
  frontend:
    build:
      context: ./frontend/
      dockerfile: dev.Dockerfile
    env_file:
      - .env
    ports:
      - "${FRONTEND_PORT_NUMBER}:${FRONTEND_PORT_NUMBER}"
    container_name: frontend
    volumes:
      - ./frontend:/code
      - frontend_deps:/code/node_modules
      - /code/node_modules/my-shared-module
      - ../my-shared-module:/host/node_modules/my-shared-module:ro

Затем добавьте скрипт точки входа в ваш Dockerfile с помощью чего-то вроде:

#!/bin/sh
if [ -d /host/node_modules/my-shared-module ]; then
  cp -r /host/node_modules/my-shared-module/. /code/node_modules/my-shared-module/.
fi
exec "$@"
2 голосов
/ 03 мая 2019

К сожалению, я не думаю, что это возможно в Docker.Монтирование тома хоста всегда двустороннее, если только вы не считаете монтирование только для чтения односторонним, но это не позволяет вам изменять файловую систему такими вещами, как npm install.

.Либо нужно перестраивать образ с новыми файлами каждый раз, либо запечь ваш CMD шаг, чтобы скопировать смонтированные файлы в новую папку за пределами смонтированного тома.Таким образом, любые изменения файла не будут сохранены обратно на хост-машину.

...