@rizzie

Как настроить Docker, чтобы composer создавал папку vendor?

Привет! Недавно начал изучать Docker, вторые сутки бьюсь с проблемой, что при создании контейнера не создаётся папка vendor при выполнении команды composer install через Docker.

Проект представляет из себя веб-приложение, которое работает со сторонним API. API ключ хранится в .ENV, для работы с которым установлена библиотека, которая и должна тянуться с помощью vendor/autoload.php

Что попробовал:

1. Посмотрел логи. Папка vendor генерируется, но ни я, ни веб-сервер не можем получить информацию о её существовании через ls -ln. О существовании папки знаю только благодаря строчке
RUN composer install --no-dev --optimize-autoloader \
    && echo "Composer install completed" \
    && ls -la /var/www/html/git \
    && ls -la /var/www/html/git/vendor


2. Папка vendor успешно создаётся, если подключившись к контейнеру через docker exec -it <id> bash ввожу composer install. В этом случае проблем с доступом к ней не возникает.

Проект планируется переносить на сервер, к которому у меня не будет доступа — поэтому мне важно реализовать именно автоматическую сборку папки vendor при запуске контейнера.

Возможно, проблема исходит от прав, но разобраться самостоятельно в проблеме не удалось. Буду рад, если подскажете решение или укажите, в какую сторону копать. Код прикладываю:

docker-compose.yml
services:
  web:
    build: .
    ports:
      - "80:80"
    volumes:
      - .:/var/www/html/git
    environment:
      - API_KEY=${API_KEY}


dockerfile
# Используем официальный образ PHP с Apache
FROM php:7.4-apache

# Устанавливаем рабочую директорию
WORKDIR /var/www/html/git

# Копируем файлы приложения в контейнер
COPY . .

# Устанавливаем зависимости для Composer
RUN apt-get update && apt-get install -y \
    libzip-dev \
    unzip \
    && docker-php-ext-install zip

# Устанавливаем Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Копируем файлы Composer
COPY composer.json composer.lock ./

# Устанавливаем права для директории перед выполнением composer install
RUN chown -R www-data:www-data /var/www/html/git \
    && chmod -R 755 /var/www/html/git

RUN composer install --no-dev --optimize-autoloader \
    && echo "Composer install completed" \
    && ls -la /var/www/html/git \
    && ls -la /var/www/html/git/vendor

# Устанавливаем права для директории после установки зависимостей
RUN chown -R www-data:www-data /var/www/html/git/vendor \
    && chmod -R 755 /var/www/html/git/vendor

# Открываем порт 80
EXPOSE 80


composer.json, composer.lock, docker-composer.yml и dockerfile лежат в одной папке.
  • Вопрос задан
  • 307 просмотров
Решения вопроса 1
@dronmaxman
VoIP Administrator
volumes:
- .:/var/www/html/git


Этой командой ты перетираеш содержимое /var/www/html/git. Это ужастная практика делать именно вот так "- .:/" без указания каталога источника.

Хороший пример https://github.com/codefresh-contrib/php-composer-...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы