При монтировании тома перезаписываются файлы, хранящиеся в образе Docker - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь контейнировать интерфейс моего сайта и автоматизировать его развертывание. Моя цель состоит в том, чтобы иметь возможность генерировать и размещать новое изображение при отправке изменения, и чтобы сервер автоматически извлекал его и перезапускал контейнер. Вот шаги, которые я предпринимаю:

  1. Я создаю образ, сначала собирая приложение Node, а затем объединяя дистрибутив и файлы конфигурации nginx в последний linuxserver / letsencrypt изображение. Это Dockerfile:

    # Use the NodeJS image as builder
    FROM node:alpine AS builder
    
    # Create the workspace
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    
    # Copy the package file and source code
    COPY package.json /usr/src/app
    COPY . ./
    
    # Install dependencies
    RUN npm install
    
    # Build the application
    RUN npm run build
    
    # The nginx server, this builds the final image
    FROM linuxserver/letsencrypt
    
    # Copy the nginx configuration
    COPY ./config/nginx.conf /config
    
    # Copy the output of the builder
    COPY --from=builder /usr/src/app/dist /config/www
    
    # Inform Docker to listen on port 443 and 80
    EXPOSE 443 80  
    
  2. Это изображение загружено в реестр пакетов GitHub , и я запрашиваю обновления, используя Сторожевая башня .

  3. Изображение запускается с использованием этого docker -компонентного файла:

    version: "3"
    services:
      ...
      frontend:
        image: [IMAGE]
        container_name: frontend
        cap_add:
          - NET_ADMIN
        environment:
          - PUID=1000
          - PGID=1000
          - TZ=[TIMEZONE]
          - URL=[URL]
          - SUBDOMAINS=www,
          - VALIDATION=http
        ports:
          - 443:443
          - 80:80
        volumes:
          - ./frontend:/config
        restart: unless-stopped
      ...  
    

Проблема заключается в том, что файлы, которые были упакованы в изображение, использующее инструкцию COPY, перезаписывается, когда я использую следующую строку в моем docker -compose:

volumes:
  - ./frontend:/config  

Если я удаляю этот раздел из моего docker -compose файла, все работает нормально Однако это не решение, потому что в этой папке хранятся важные данные.

Я прочитал, что при монтировании тома полностью перезаписываются все предыдущие данные, однако мне нравится тот факт, что я могу легко загрузить изображение на свой сервер и уже встроить все необходимые файлы. Есть ли что-нибудь, что я могу сделать, чтобы исправить мою проблему, или я неправильно использую / неправильно понимаю docker images?

Я попытался установить громкость только для чтения, как предложено здесь , однако это не работал и вместо этого заставлял изображение постоянно останавливаться и перезапускаться.

Я также кратко прочитал о bind mounts и мне интересно, пригодятся ли они.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Такое поведение ожидается. Docker монтирование работает так же, как и Linux монтирование, т.е. перезаписывает содержимое целевого каталога содержимым исходного каталога.

Я предлагаю использовать другой каталог назначения для вашего тома, например

volumes:
 - ./frontend:/someotherdir 

А затем настройте свою конфигурацию nginx, чтобы искать там JS файлы.

0 голосов
/ 04 мая 2020

Я обнаружил, что могу сохранить данные на изображении, сначала создав именованный том :

volumes:
  frontend_data:

И затем установив контейнер на этот том:

services:
  frontend:
    ...
    volumes:
      - frontend_data:/config
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...