I've dockerized Apache + MySQL correctly and also managed to hit the setup installation page for Magento. But I'm having issues with managing a host <-> container data volume.
Magento is creating read-only log files on the volume, but the installation then returns an error saying the log file is not writeable in the later steps of the installation process.
My suspicions are that Docker's ACL automatically sets new files to read-only, but after it reads it from the volume again it is not writeable and returns an error.
Does anyone know an elegant way of solving this issue?
docker-compose.yml:
apache:
build: .
dockerfile: Dockerfile
command: "/usr/sbin/apache2 -D FOREGROUND"
volumes:
- ./src/magento:/var/www/site
environment:
APACHE_RUN_USER: www-data
APACHE_RUN_GROUP: www-data
APACHE_LOCK_DIR: /var/lock/apache2
APACHE_LOG_DIR: /var/log/apache2
APACHE_PID_FILE: /var/run/apache2.pid
ports:
- "80:80"
mysqldb:
image: mysql
ports:
- "3306:3306"
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: magento
Dockerfile:
FROM ubuntu
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y \
apache2 php curl libapache2-mod-php7.0 \
php7.0 php7.0-mysql php7.0-mcrypt \
php7.0-mbstring php7.0-cli php7.0-gd \
php7.0-curl php7.0-xml php7.0-zip php7.0-intl sudo
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN a2enmod php7.0
RUN a2enmod rewrite
ADD apache-config.conf /etc/apache2/sites-enabled/000-default.conf
RUN mkdir -p /var/www/site
ADD src/magento /var/www/site
WORKDIR /var/www/site
EXPOSE 80
Error output during installation which stalls at 0%:
The path
"install.log:///var/www/site/var/log/var/www/site/var/log/"
is not writable
I think you don't run docker with safe user, maybe you should try this:
# Add user
RUN groupadd -g 1000 app \
&& useradd -g 1000 -u 1000 -d /var/www -s /bin/bash app
RUN mkdir -p /var/www/html \
&& chown -R app:app /var/www
USER app:app
VOLUME /var/www
WORKDIR /var/www/html
You can see my full Dockerfile here:
https://github.com/dylanops/docker-magento/blob/master/dockerfile/php-fpm/Dockerfile
Try adding the following line in your dockerfile and restart the process:
VOLUME /var/www/site
Related
I ran into a problem that I have to manually write a cronjob in a production environment inside Ubuntu, I would like to have a completely standalone docker project. There is a solution with creating an ubuntu container, but it looks weird, ubuntu inside ubuntu. So far, I've had to set up a cronjob outside of a container on Ubuntu itself.
Dockerfile
FROM php:8.1-fpm
RUN apt-get update && apt-get install -y \
apt-utils \
libpq-dev \
libpng-dev \
libzip-dev \
zip unzip \
git && \
docker-php-ext-install pdo_mysql && \
docker-php-ext-install bcmath && \
docker-php-ext-install gd && \
docker-php-ext-install zip && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY ./_docker/app/php.ini /usr/local/etc/php/conf.d/php.ini
# Install composer
ENV COMPOSER_ALLOW_SUPERUSER=1
RUN curl -sS https://getcomposer.org/installer | php -- \
--filename=composer \
--install-dir=/usr/local/bin
WORKDIR /var/www
docker-compose.yml
version: '3'
services:
nginx:
image: nginx:latest
volumes:
- ./:/var/www/
- ./_docker/nginx/conf.d/:/etc/nginx/conf.d/
ports:
- 8876:80
container_name: flowers_nginx
depends_on:
- flowers
flowers:
build:
context: .
dockerfile: _docker/app/Dockerfile
volumes:
- ./:/var/www/
depends_on:
- database
container_name: flowers_php
database:
image: mysql:8.0
restart: always
volumes:
- ./temp/db:/var/lib/mysql
environment:
MYSQL_DATABASE: ****
MYSQL_ROOT_PASSWORD: *****
MYSQL_USER: ****
MYSQL_PASSWORD: *****
ports:
- 8101:3306
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
container_name: flowers_mysql
Due to lack of experience, I need a hint with the best solution, maybe use kubernetes-cronjob or redis, but I have not yet learned these technologies, I will be grateful if you help me choose the right solution and development path.
I tried to do the following inside Ubuntu itself which has docker installed and it works, but because of this I can't make a completely standalone docker project without connecting to the ubuntu job which has docker installed
crontab -e
* * * * * cd /var/www/public/flowers_shop && php artisan schedule:run >> /dev/null 2>&1
I am deploying dockerized application to digitalocean server. (Ubuntu 22.04)
But I don't want to pass vendor directory there. To create it in remote server I am trying to use composer update method in my application's container.
docker-compose.yml:
version: "3.9"
services:
#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
- ./:/var/www
networks:
- app-network
#Nginx Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network
#Docker Networks
networks:
app-network:
driver: bridge
Dockerfile:
FROM php:8.1-fpm as php
USER root
WORKDIR /var/www
# Install PHP packages
RUN apt-get update && apt-get install -y \
git \
curl \
libreoffice \
build-essential \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
libonig-dev \
libzip-dev
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install mbstring zip exif pcntl
RUN docker-php-ext-configure gd --enable-gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/
RUN docker-php-ext-install gd
# Copy existing application directory contents
COPY . /var/www
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer update
RUN composer dump-autoload
RUN chmod -R 755 storage/
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
When I run docker build and up commands everything working fine without any error. But my application throws an error because it can't find vendor directory in application.
As you see in Dockerfile I am running composer update command. It is working while building and gives me some logs:
But when I log in my container with docker exec -it app /bin/bash command, I can't see any vendor directory created in /var/www. I am able to run composer update in container manually and it is not giving any error.
Main problem is why composer update is not creating vendor directory while givings logs. Even RUN chmod -R 755 storage/ command is not giving defined permissions to folder. I feel like Dockerfile has no effect on my container except installing packages and extensions.
I have a container with a nginx, mailhog, redis and PHP image. All these images are on the same network.
I run Laravel on the PHP image.
I want to make use of the Job queue that laravel has, but I am struggling to run the queue in the PHP image.
I've looked at all the examples but it seems my lack of understanding of docker is causing me to not ask the right question
Below is my docker-compose.yml
version: '3'
networks:
devnet:
external: true
services:
# lightweight web-server:
nginx:
image: nginx:stable-alpine
container_name: lar-nginx
ports:
- 8080:80
- 4040:443
volumes:
- ./:/var/www
- ./run/nginx:/etc/nginx/conf.d
- ./local/certs:/etc/nginx/certs
depends_on:
- php
networks:
- devnet
# server-side scripting engine
php:
build:
context: .
dockerfile: Dockerfile
container_name: lar-php
volumes:
- ./:/var/www
ports:
- "9000:9000"
networks:
- devnet
# caching server:
redis:
image: redis:latest
container_name: lar-redis
ports:
- "6379:6379"
networks:
- devnet
# development email catch-all server & client:
mailhog:
image: mailhog/mailhog:latest
container_name: lar-mailhog
ports:
# imap port for send mail
- "1025:1025"
# www mailhog ui
- "8025:8025"
networks:
- devnet
Dockerfile
FROM php:7.4-fpm
RUN apt-get update
RUN apt-get -y install curl gnupg cron
# RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
# RUN apt-get -y install nodejs
# RUN npm install
# Install other required PHP extensions and unix utils:
RUN apt-get update && apt-get install -y libmcrypt-dev \
mariadb-client libmagickwand-dev libonig-dev \
libzip-dev libcurl4-openssl-dev redis-server \
zlib1g-dev wget git \
--no-install-recommends \
# && pecl install imagick
# && docker-php-ext-enable imagick
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install mbstring \
&& docker-php-ext-install zip \
&& docker-php-ext-install xml \
&& docker-php-ext-install curl \
&& docker-php-ext-install gd \
&& docker-php-ext-install soap
# Configure PHP internal vars:
ENV PHP_MEMORY_LIMIT=256M
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Install php apcu pecl package:
RUN pecl install apcu && docker-php-ext-enable apcu
# Install php redis pecl package:
RUN pecl install redis && docker-php-ext-enable redis
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl
# Permissions for Laravel
RUN chown -R www-data:www-data /var/www
RUN chmod -R 777 /var/www
COPY entrypoint.bash /usr/sbin
RUN chmod a+x /usr/sbin/entrypoint.bash
ENTRYPOINT /usr/sbin/entrypoint.bash
entrypoint.bash
#!/bin/bash
# turn on bash's job control
set -m
# Start the "main" PHP process and put it in the background
php-fpm &
# Start the helper crond process
crond
# now we bring the primary process back into the foreground
fg %1
In normal server(lamp) environment its pretty simple to work with cronjobs and queue but I dont know how to start up the queue.
php artisan queue:work in the php image returs There are no commands defined in the "queue:" namespace. Did you mean this? queue
Running it in tinker
\Queue::pushON('new', new App\Jobs\PublishingClass(array('foo'=>1,'foobar'=>783,'foobarfoo'=>33)));
show the job gets processed but I need to do it with a process running in the background
The most simple way is to call with the use of Tinker
It's Laravel command using for debugging, use it by running below command from from project root
php artisan tinker
To dispatch job on a specific queue from tinker
\Queue::pushON('rms', new App\Jobs\UpdateRMS());
first parameter - Queue name
second parameter - job name
Dispatch multiple jobs at once to a specific queue
\Queue::bulk([new App\Jobs\UpdateRMS(), new App\Jobs\UpdateRMS()], null, 'rms');
You can use this docker image, you don't need to configure the schedule, it's already implemented, with differents php expansions like redis, Rdkafka.
Follow this link:
https://hub.docker.com/r/jkaninda/laravel-php-fpm
https://github.com/jkaninda/laravel-php-fpm
I'm trying out Laravel Sail, as I've been successfully using Laradock for a few years and hoping to simplify my dev environment setup. I am on Windows 10 64, Docker Desktop 3.0 installed using WSL 2, and my Laravel app is running Laravel 8.20.1.
In my Laravel project, I've followed the Laravel Sail setup guide: I've run composer require laravel/sail --dev and php artisan sail:install, and I see the docker-compose.yml in my root directory.
But when I run ./vendor/bin/sail up I get this error:
./vendor/bin/sail: line 1: XSym: command not found
./vendor/bin/sail: line 2: 0024: command not found
./vendor/bin/sail: line 3: a81960381c7144e16cd1e768af147de3: command not found
./vendor/bin/sail: line 4: ../laravel/sail/bin/sail: No such file or directory
Update: I fixed the above through Qumber's help: removing /vendor/ and reinstalling. But now I get this error:
In GitBash I get this response:
Unsupported operating system [MINGW64_NT-10.0-19041]. Laravel Sail supports macOS, Linux, and Windows (WSL2).
If I try from Powershell now, I get:
/bin/bash: C:\Users\ssund\Source\steepdb\vendor\bin\/../laravel/sail/bin/sail: No such file or directory
-------------Requested attachments--------------------
docker-compose.yml:
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.0
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.0/app
ports:
- '${APP_PORT:-80}:80'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
# - selenium
# selenium:
# image: 'selenium/standalone-chrome'
# volumes:
# - '/dev/shm:/dev/shm'
# networks:
# - sail
mysql:
image: 'mysql:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- 'sailmysql:/var/lib/mysql'
networks:
- sail
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
volumes:
- 'sailredis:/data'
networks:
- sail
# memcached:
# image: 'memcached:alpine'
# ports:
# - '11211:11211'
# networks:
# - sail
mailhog:
image: 'mailhog/mailhog:latest'
ports:
- 1025:1025
- 8025:8025
networks:
- sail
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
sailredis:
driver: local
Dockerfile in \vendor\laravel\sail\runtimes\7.4:
FROM ubuntu:20.04
LABEL maintainer="Taylor Otwell"
ARG WWWGROUP
WORKDIR /var/www/html
ENV DEBIAN_FRONTEND noninteractive
ENV TZ=UTC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update \
&& apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 \
&& mkdir -p ~/.gnupg \
&& chmod 600 ~/.gnupg \
&& echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf \
&& apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E5267A6C \
&& apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C300EE8C \
&& echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu focal main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
&& apt-get update \
&& apt-get install -y php7.4-cli php7.4-dev \
php7.4-pgsql php7.4-sqlite3 php7.4-gd \
php7.4-curl php7.4-memcached \
php7.4-imap php7.4-mysql php7.4-mbstring \
php7.4-xml php7.4-zip php7.4-bcmath php7.4-soap \
php7.4-intl php7.4-readline php7.4-pcov \
php7.4-msgpack php7.4-igbinary php7.4-ldap \
php7.4-redis \
&& php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
&& curl -sL https://deb.nodesource.com/setup_15.x | bash - \
&& apt-get install -y nodejs \
&& apt-get install -y mysql-client \
&& apt-get -y autoremove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN setcap "cap_net_bind_service=+ep" /usr/bin/php7.4
RUN groupadd --force -g $WWWGROUP sail
RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
COPY start-container /usr/local/bin/start-container
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY php.ini /etc/php/7.4/cli/conf.d/99-sail.ini
RUN chmod +x /usr/local/bin/start-container
EXPOSE 8000
ENTRYPOINT ["start-container"]
Ok there were multiple things that I needed to fix here.
#Qumber helped me initially by suggesting I wipe /vendor/ and run composer install/update again. That fixed the missing sail file that wasn't getting added for some reason.
I also had some permission-related issues, possibly due to running compose in WSL and then trying to run sail in Windows/GitBash (or vice versa).
The biggest issue was my misunderstanding about Docker WSL2 integration and that the sail command should be run from within WLS (coming from Laradock, I made some incorrect assumptions). I needed to have a linux distro installed (I chose Ubuntu 20.x) AND make sure it was set as the default, via running wsl -s . You can check which is currently default with wsl -l -v. For more detailed steps about this setup see https://learn.microsoft.com/en-us/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package.
Once I fixed the above, I was able to open Windows Terminal, create an Ubuntu tab, and run ./vendor/bin/sail up and it executed.
You need to install linux under windows first. Your answer is correct. Thanks :)
If you're like me who cloned a Laravel project from GitHub where none of the application's Composer dependencies are available including Sail, you'll need to run the following commands from the project directory. The following commands use a small Docker Container containing PHP and Composer to install the application's dependencies:
docker run --rm \
-u "$(id -u):$(id -g)" \
-v $(pwd):/var/www/html \
-w /var/www/html \
laravelsail/php81-composer:latest \
composer install --ignore-platform-reqs
Further information can be found on the Laravel documentation.
For me, this was a permissions issue. Running as sudo worked.
Using Win10 with WSL Ubuntu 20.04 LTS.
I was facing this problem on my Mac .This issue is due to permission
Solution for MAC
1: Pull down the Apple menu and choose ‘System Preferences’
2: Choose “Security & Privacy” control panel
3: Now select the “Privacy” tab, then from the left-side menu select “Full Disk Access”
4:Click the lock icon in the lower left corner of the preference panel and authenticate with an admin level login
5: Now click the [+] plus button to add an application with full disk access
6:Navigate to the /Applications/Utilities/ folder and choose “Terminal” to grant Terminal with Full Disk Access privileges
7: Relaunch Terminal, the “Operation not permitted” error messages will be gone
After that you can install Laravel.
Solution for Windows 10
Find the sail file in the vendor folder: vendor/laravel/sail/bin/sail and change from this code:
Verify operating system is supported...
case "${UNAMEOUT}" in
Linux*) MACHINE=linux;;
Darwin*) MACHINE=mac;;
*) MACHINE="UNKNOWN"
esac
if [ "$MACHINE" == "UNKNOWN" ]; then
echo "Unsupported operating system [$(uname -s)]. Laravel Sail supports macOS, Linux, and Windows (WSL2)." >&2
exit 1
fi
to this:
# Verify operating system is supported...
#case "${UNAMEOUT}" in
# Linux*) MACHINE=linux;;
# Darwin*) MACHINE=mac;;
# *) MACHINE="UNKNOWN"
#esac
#
#if [ "$MACHINE" == "UNKNOWN" ]; then
# echo "Unsupported operating system [$(uname -s)]. Laravel Sail supports macOS, Linux, and Windows (WSL2)." >&2
#
# exit 1
#fi
then use GitBash to run commond
./vendor/bin/sail up
From Unsupported operating system Laravel 8 with Sail on Windows 10 (WSL2)
This may sound crazy, but I had the same issue.
I just did vendor/bin/sail up
Instead of .vendor/bin/sail up
And that worked!
I am new at docker and docker-compose and I am developing a Laravel-project on docker and docker-compose with Laradock as following a tutorial(not sure whether It is a correct way or not to refer this situation though).
I want to install the composer in this environment to be able to use the composer command.
As a matter of fact, I wanted to do seeding to put data into DB that I made by php artisan make:migrate but this error appeared.
include(/var/www/laravel_practice/vendor/composer/../../database/seeds/AdminsTableSeeder.php): failed to open stream: No such file or directory
So I googled this script to find a solution that will solve the error then I found it.
It says, "Do composer dump-autoload and try seeding again", so I followed it then this error appeared.
bash: composer: command not found
Because I have not installed composer into docker-container.
My docker's condition is like this now.
・workspace
・mysql
・apache
・php-fpm
Since I have not installed the composer, I have to install it into docker-container to solve the problem, BUT I have no idea how to install it into docker-container.
So could anyone tell me how to install composer into docker-container?
Thank you.
here is the laradock/mysql/Dockerfile and laravelProject/docker-compose.yml.
ARG MYSQL_VERSION=5.7
FROM mysql:${MYSQL_VERSION}
LABEL maintainer="Mahmoud Zalt <mahmoud#zalt.me>"
#####################################
# Set Timezone
#####################################
ARG TZ=UTC
ENV TZ ${TZ}
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && chown -R mysql:root /var/lib/mysql/
COPY my.cnf /etc/mysql/conf.d/my.cnf
CMD ["mysqld"]
EXPOSE 3306
version: '2'
services:
db:
image: mysql:5.7
ports:
- "6603:3306"
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=true
- MYSQL_DATABASE=laravelProject
- LANG=C.UTF-8
volumes:
- db:/var/lib/mysql
command: mysqld --sql-mode=NO_ENGINE_SUBSTITUTION --character-set-server=utf8 --collation-server=utf8_unicode_ci
web:
image: arbiedev/php-nginx:7.1.8
ports:
- "8080:80"
volumes:
- ./www:/var/www
- ./nginx.conf:/etc/nginx/sites-enabled/default
volumes:
db:
You can build your own image and use it in your Docker compose file.
FROM php:7.2-alpine3.8
RUN apk update
RUN apk add bash
RUN apk add curl
# INSTALL COMPOSER
RUN curl -s https://getcomposer.org/installer | php
RUN alias composer='php composer.phar'
# INSTALL NGINX
RUN apk add nginx
I used the PHP alpine image as my base image because it's lightweight, so you might have to install other dependencies yourself. In your docker-compose file
web:
build: path/to/your/Dockerfile/directory
image: your-image-tag
ports:
- "8080:80"
volumes:
- ./www:/var/www
- ./nginx.conf:/etc/nginx/sites-enabled/default
You could do something like this:
FROM php:8.0.2-apache
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y mariadb-client libxml2-dev
RUN apt-get autoremove -y && apt-get autoclean
RUN docker-php-ext-install mysqli pdo pdo_mysql xml
COPY --from=composer /usr/bin/composer /usr/bin/composer
the argument COPY --from= should solve your problem.
FROM php:7.3-fpm-alpine
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer
RUN apk update
RUN apk upgrade
RUN apk add bash
RUN alias composer='php /usr/bin/composer'