Как развернуть докеризованное приложение laravel с помощью эластичного бобового стебля?

#docker #docker-compose #amazon-elastic-beanstalk

Вопрос:

Я новичок в Докере. Попытка развернуть докеризованное приложение laravel с помощью эластичного бобового стебля. Текущие файлы Docker —

docker-compose.yml

 version: '3'
services:

  #PHP Service
  app:
    build:
      context: ./
      dockerfile: Dockerfile
    image: admin
    container_name: admin-app
    restart: unless-stopped
    working_dir: /usr/share/nginx/app/
    volumes:
      - ./:/usr/share/nginx/app/
    networks:
      - app-network

  nginx:
    image: nginx:stable-alpine
    container_name: admin-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/usr/share/nginx/app/
      - ./nginx/conf.d/:/etc/nginx/conf.d
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge
 

и Dockerfile

 FROM php:7.4-fpm

ARG uid=1000
ARG user=sammy
# Install system dependencies
RUN apt-get update amp;amp; apt-get install -y 
    git 
    curl 
    libpng-dev 
    libonig-dev 
    libxml2-dev 
    zip 
    unzip 
    libcurl4-openssl-dev pkg-config libssl-dev
# Clear cache
RUN apt-get clean amp;amp; rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd 
RUN pecl install mongodb amp;amp; docker-php-ext-enable mongodb amp;amp; 
    pecl install xdebug amp;amp; docker-php-ext-enable xdebug
RUN pecl config-set php_ini /etc/php.ini
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Add user for laravel application
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer amp;amp; 
    chown -R $user:$user /home/$user
    
# Copy existing application directory contents
COPY . /usr/share/nginx/app
WORKDIR /usr/share/nginx/app

RUN chown -R $user:$user .
USER $user

RUN chown -R $user:$user storage bootstrap/cache
RUN chmod -R 775 storage bootstrap/cache

RUN composer install
RUN php artisan cache:clear
RUN php artisan view:clear
RUN php artisan config:clear

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
 

Он отлично работает на локальном компьютере, когда я запускаю docker compose up -d , только если я уже запустил composer install , в противном случае выдает следующую ошибку

введите описание изображения здесь Это нормально для целей разработки, которые я должен запустить composer install один раз, но для производства, я думаю, что это неправильный способ вручную делать composer install каждый раз, когда развертывается новая версия. Разве команда RUN composer install at Dockerfile не устанавливает необходимые зависимости? Я вижу индикатор выполнения устанавливаемых зависимостей, но vendor если я подключусь по ssh к контейнеру, папка не будет создана. Опять же, это прекрасно работает, если я подключусь к экземпляру по ssh и вручную установлю зависимости.

Я также успешно развернул приложение nodejs, используя эластичный бобовый стебель. Там зависимости были установлены правильно с помощью команды RUN npm install at Dockerfile . Я не вижу никакой разницы в этом процессе. Должен ли я vendor также включать папку в zip-файл?. Пожалуйста, предложите правильный способ развертывания.

Комментарии:

1. Ты имеешь в виду, что делает composer install ?

2. @JRichardsz То, о чем я знаю composer install , это то, что он устанавливает зависимости, указанные composer.json в местоположении at /vendor . Я спрашиваю, почему /vendor папка не создается, когда я запускаю docker composer up -d , как у меня RUN composer install в Dockerfile.

3. В вашем файле Dockerfile содержится инструкция compose install, но вы сказали: » Она отлично работает на локальном компьютере, когда я запускаю docker compose up-d, только если я уже запустил composer install «. Вы имеете в виду, что после docker-compose up того, как вам нужно войти в контейнер и запустить его вручную composer install , потому что предложение в файле Dockerfile не работает?

4. @JRichardsz да, вы правы. Инструкция Dockerfile composer install показывает ход выполнения в терминале при выполнении docker compose up -d , но не создает никакой папки /поставщика. Я должен выполнить вручную composer install

5. Нам нужно это отладить! В файле Dockerfile после установки composer распечатайте содержимое папки /usr/share/nginx/приложение/поставщик ls -la /usr/share/nginx/app , а также прикрепите соответствующую часть журнала сборки docker. Я видел нечто подобное с apache2: в процессе сборки существовала какая-то папка, но после запуска docker папка исчезла