#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 папка исчезла