Как можно обновить Laravel в контейнере Docker?

Здравствуйте! У кого из вас есть опыт работы с докером для ларавел-моно на продакшене? Можете ли вы поделиться, как вы организовали перенос данных между контейнерами, особенно по поводу папки storage/cache? 

Заранее отмечу, что я осведомлён о S3 и "ненужности" использования докера, но у меня есть чисто технический интерес. Я хотел попробовать интегрировать всё привычное в CI/CD с использованием докера, и столкнулся с множеством мелких сложностей, что вызывает у меня сомнения в корректности моих подходов.

На прикреплённом скриншоте вы видите мой продакшн compose. Я вынес файлы в volume, но у меня каждый контейнер работает от разных пользователей (не root), что приводит к проблемам с доступом к файлам в папке кеш.

Как вы справлялись с этой проблемой? Вы рассматривали варианты: 
1) запускать контейнеры от одного пользователя и/или группы, или готовиться к другим трудностям, которые могут возникнуть? 
2) использовать несколько "грубой" настройкой прав доступа в volume?

Также у меня возник вопрос: как инициализировать элементы в volume для хранения?
  • 1 октября 2024 г. 10:23
Ответы на вопрос 2
Здравствуйте! Управление правами доступа и обновление Laravel в Docker-контейнерах — это распространенные проблемы, с которыми сталкиваются разработчики, работающие с Docker. Давайте разберем их по порядку.

### Обновление Laravel в контейнере Docker

Чтобы обновить Laravel в контейнере Docker, вам нужно выполнить несколько шагов:

1. **Обновите зависимости в `composer.json`**: откройте файл `composer.json` и обновите версии пакетов Laravel и других зависимостей.

2. **Запустите контейнер с `composer`**:
   Вы можете использовать команду `docker exec` для выполнения команд внутри контейнера. Например:
   ```bash
   docker exec -it <container_name> composer update
   ```
   
3. **Запустите миграции**:
   После обновления вы, возможно, захотите выполнить миграции:
   ```bash
   docker exec -it <container_name> php artisan migrate
   ```

### Управление данными в `storage/cache`

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

1. **Общий Volume**:
   Используйте Docker volumes для хранения данных, чтобы они были доступны из разных контейнеров. Например, в вашем `docker-compose.yml` вы можете объявить volume для папки `storage`.

   ```yaml
   volumes:
     storage:
   ```

   И монтировать его в нужные контейнеры:
   ```yaml
   services:
     app:
       volumes:
         - storage:/var/www/html/storage

   volumes:
     storage:
   ```

2. **Проблемы с правами доступа**:
   Если ваши контейнеры работают от разных пользователей, возможны проблемы с доступом к файлам. Рассмотрите варианты:

   - **Запуск контейнеров от одного пользователя**: Используйте опцию `user` в вашем `docker-compose.yml`, чтобы все контейнеры работали от одного пользователя и группы.

   - **Настройка прав доступа**: Если разные контейнеры должны работать от разных пользователей, вы можете использовать более гибкие настройки прав доступа, чтобы разрешить доступ к общим ресурсам.

   - **Использование `chown`:** В вашем Dockerfile или `docker-compose` можно использовать команды `chown` для изменения владельца файлов:

   ```dockerfile
   RUN chown -R <user>:<group> /var/www/html/storage
   ```

3. **Инициализация элементов в volume**:
   Для инициализации данных в volume, вы можете использовать начальные скрипты или команды, которые будут выполняться при создании контейнера. Например, использовать `Dockerfile` или `docker-compose` для запуска команд копирования или загрузки начальных данных при первом запуске.

   В `docker-compose.yml` можно использовать `command` или `entrypoint` для выполнения скрипта:

   ```yaml
   services:
     app:
       entrypoint: ["sh", "-c", "cp -R /path/to/initial/data/* /var/www/html/storage && php-fpm"]
   ```

Это базовые рекомендации для работы с Docker и Laravel. Вы можете адаптировать их под ваши конкретные нужды и окружение. Успехов в работе с Docker и CI/CD!
Пусть контейнеры работают от разных пользователей, пишет-то в каталог только кто-то один (надеюсь). А остальным достаточно на чтение доступ дать. php-fpm и php-cli практически наверняка можно объединить в один сервис. 

P.S. не рекомендую использовать образы без тэга или latest - лучше обозначайте конкретную версию.
Похожие вопросы