Is it for production or local dev ?
Feb 13, 2025
3
Level 1
How to run Laravel application inside Docker?
Hello, folks! I'm struggling with this for days now. I tried different approaches but no success.
I get /var/www/vendor does not exist and could not be created: failed to solve: process "/bin/sh -c composer install --no-interaction --no-dev --optimize-autoloader" did not complete successfully: exit code: 1.
docker-compose.yml
services:
app:
build:
context: .
dockerfile: Dockerfile
image: my-laravel-app
container_name: my-laravel-app
restart: unless-stopped
working_dir: /var/www
volumes:
- ./:/var/www
- ./.env:/var/www/.env
environment:
- APP_ENV=local
networks:
- app-network
nginx:
image: nginx:alpine
container_name: my-nginx
ports:
- "8000:80"
- "${VITE_PORT:-5173}:${VITE_PORT:-5173}"
volumes:
- ./:/var/www
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
depends_on:
- app
networks:
- app-network
node:
platform: linux/arm64/v8
build:
context: .
dockerfile: Dockerfile.node
image: my-laravel-node
container_name: my-laravel-node
ports:
- "3000:3000"
restart: unless-stopped
working_dir: /var/www
volumes:
- ./:/var/www
- /var/www/node_modules
networks:
- app-network
db:
platform: linux/x86_64
image: mysql:8.0
container_name: my-mysql
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
ports:
- "3306:3306"
networks:
app-network:
driver: bridge
volumes:
dbdata:
driver: local
Dockerfile
# Set the base image for subsequent instructions
FROM php:8.2-fpm
# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
curl \
unzip \
git \
libzip-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
default-mysql-client \
libpng-dev && \
docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www
# Remove default server definition
RUN rm -rf /var/www/html
# Copy existing application directory and set correct permissions
COPY --chown=www-data:www-data . /var/www
# Ensure necessary permissions
RUN chmod -R 777 storage bootstrap/cache
# Change current user to www-data
USER www-data
RUN composer install --no-interaction --no-dev --optimize-autoloader
# Expose port 9000
EXPOSE 9000
# Start PHP-FPM and run migrations on container startup
CMD php artisan key:generate && php artisan migrate --force && php-fpm
Dockerfile.node
# Set the base image
FROM node:20
# Set working directory
WORKDIR /var/www
# Copy `package.json` and `package-lock.json`
COPY package*.json ./
# Install project dependencies
RUN npm install
# Copy project files into the docker image
COPY . .
# Expose the port Vite runs on
EXPOSE 3000
# Start the Vite server
CMD ["npm", "run", "dev"]
Please or to participate in this conversation.