Dockerized Nginx: Можно ли обновить ресурсы stati c без остановки контейнера? - PullRequest
0 голосов
/ 02 мая 2020

У меня настроен контейнер Nginx, который обслуживает ресурсы для сайта c. Идея заключается в том, чтобы веб-сервер всегда оставался включенным и перезаписывал ресурсы всякий раз, когда они перекомпилированы. В настоящее время настройка docker выглядит следующим образом:

docker-app

docker -compose.yml:

version: '3'
services:
  web:
    build: ./app
    volumes:
      - site-assets:/app/dist:ro
  nginx:
    build: ./nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - site-assets:/app:ro
      - https-certs:/etc/nginx/certs:ro
    depends_on:
      - web

volumes:
  site-assets:
  https-certs:

Web ( построитель ресурсов) Dockerfile:

FROM node:latest
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY ./ .
RUN npm run generate

Nginx Dockerfile:

FROM nginx:latest
RUN mkdir /app
COPY nginx.conf /etc/nginx/nginx.conf

Контейнер certbot управляется отдельно и не имеет отношения к моей проблеме, но * Контейнер 1034 * должен иметь возможность монтировать том https-certs.

Эта настройка казалась хорошей, пока я не понял, что том с ресурсами сайта не будет обновлен после первого создания. Чтобы это работало, том должен быть уничтожен и заново создан при каждом развертывании приложения, для чего требуется остановка контейнера Nginx для размонтирования тома. Вот вам и такой подход.

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

Я надеюсь, что есть здравый ответ на этот вопрос, кроме "Это обычный сайт c, почему вы не используете Netlify или GitHub Pages?" :)

1 Ответ

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

Вот пример, который переместит ваш npm run generate со времени сборки образа на время выполнения контейнера. Это минимальный пример, иллюстрирующий, как перемещение процесса во время выполнения делает том доступным как для работающего контейнера при запуске, так и для будущих во время выполнения.

со следующими значениями docker-compose.yml:

version: '3'
services:
  web:
    image: ubuntu
    volumes:
      - site-assets:/app/dist
    command: bash -c "echo initial > /app/dist/file"
    restart: "no"
  nginx:
    image: ubuntu
    volumes:
      - site-assets:/app:ro
    command: bash -c "while true; do cat /app/file; sleep 5; done"
volumes:
  site-assets:

Мы можем запустить его с docker-compose up в терминале. Наш сервер nginx первоначально пропустит данные, но начальная служба web запустит и сгенерирует наш актив (с содержанием initial):

❯ docker-compose up  
Creating network "multivol_default" with the default driver
Creating volume "multivol_site-assets" with default driver
Creating multivol_web_1   ... done
Creating multivol_nginx_1 ... done
Attaching to multivol_nginx_1, multivol_web_1
nginx_1  | cat: /app/file: No such file or directory
multivol_web_1 exited with code 0
nginx_1  | initial
nginx_1  | initial
nginx_1  | initial
nginx_1  | initial

В другом терминале мы можем обновить наш актив (ваш npm run generate команда):

❯ docker-compose run web bash -c "echo updated > /app/dist/file"

И теперь мы можем видеть наш nginx сервис, обслуживающий обновленное содержимое:

❯ docker-compose up  
Creating network "multivol_default" with the default driver
Creating volume "multivol_site-assets" with default driver
Creating multivol_web_1   ... done
Creating multivol_nginx_1 ... done
Attaching to multivol_nginx_1, multivol_web_1
nginx_1  | cat: /app/file: No such file or directory
multivol_web_1 exited with code 0
nginx_1  | initial
nginx_1  | initial
nginx_1  | initial
nginx_1  | initial
nginx_1  | updated
nginx_1  | updated
nginx_1  | updated
nginx_1  | updated
^CGracefully stopping... (press Ctrl+C again to force)
Stopping multivol_nginx_1 ... done

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

...