Docker Slow Response Time with Laravel API calls - php

Docker Response Time
Does anyone have any idea why response time takes up to 1500 ms when using docker ?
While when I run in my local machine it's only ~200 ms which's reasonable
my docker-compose.yml file
version: "3.4"
networks:
backend:
driver: bridge
services:
mysql:
image: mysql:8.0
container_name: mysql
restart: unless-stopped
ports:
- 3307:3306
environment:
- MYSQL_ROOT_PASSWORD=securerootpassword
- MYSQL_DATABASE=${DB_DATABASE}
- MYSQL_USER=${DB_USERNAME}
- MYSQL_PASSWORD=${DB_PASSWORD}
networks:
backend:
aliases:
- db-network
app:
container_name: laravel_app
build:
context: .
dockerfile: ./docker/8.0/php/Dockerfile
args:
WWWGROUP: '1000'
ports:
- '${APP_PORT:-80}:80'
networks:
backend:
aliases:
- laravel-app-network
volumes:
- '.:/var/www/html' # tried - '.:/var/www/html:cached' same results
depends_on:
- mysql
my docker/8.0/php/Dockerfile
FROM ubuntu:21.04
USER root
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 \
libpng-dev \
zlib1g-dev \
libxml2-dev \
libzip-dev \
libonig-dev \
zip \
curl \
unzip \
webp \
gnupg \
gosu \
ca-certificates \
git \
supervisor \
libcap2-bin \
python3
RUN 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
RUN echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu hirsute main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
&& curl -sL https://deb.nodesource.com/setup_16.x | bash -
RUN apt-get update && apt-get install -y php8.0-cli php8.0-dev \
php8.0-pgsql php8.0-sqlite3 php8.0-gd \
php8.0-curl php8.0-memcached \
php8.0-imap php8.0-mysql php8.0-mbstring \
php8.0-xml php8.0-zip php8.0-bcmath php8.0-soap \
php8.0-intl php8.0-readline php8.0-pcov \
php8.0-msgpack php8.0-igbinary php8.0-ldap \
php8.0-redis php8.0-swoole
RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer
RUN apt-get install -y nodejs \
&& npm install -g npm
RUN apt-get install -y mysql-client
RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.0
RUN groupadd --force -g $WWWGROUP sail
RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
COPY ./docker/8.0/start-container /usr/local/bin/start-container
COPY ./docker/8.0/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY ./docker/8.0/php.ini /etc/php/8.0/cli/conf.d/99-sail.ini
RUN chmod +x /usr/local/bin/start-container
EXPOSE 80
ENTRYPOINT ["start-container"]
CPU Usage
Not to mention when on idle state it might take up to 3-4 seconds
Does it have to do with CPU usage ?
on an api call request it geos up to 17-20 % during the 1400 ms and back to 0.01%
note taht it's modified sail Dockerfile provided by Laravel
the same issue consist if used sail out of the box
Also, I insured that all dependencies in Dockerfile are installed on my local machine, and still the same issue.

Problem Resolved:
It turned out to be windows/WSL related issue, that my development environment was built on windows running a Ubuntu 20.04 LTS /mnt/c/Users/<username>/code-directory
I migrated the entire code to the actual ubuntu absolute path /var/www/html/code-directory like in a production server and it's working perfectly. And made changes to Dockerfile accordingly.
Response time is ~100ms which's faster than localhost of windows OS 200ms

Related

"deploy-php-ext-configure" in /bin/sh missing when building docker laravel image

i am trying to build image and container from a project but i am having an issue when trying to build the image. the project is a template and I already have a project using this template in my computer. I would like to know how to solve it and understand a little more. I hope somebody would help me.
here is the error log when I run the command "docker build -t my-payments ." :
#7 200.3 /bin/sh: 1: deploy-php-ext-configure: not found
here is the "docker-compose.yml" :
version: '3.8'
services:
web:
container_name: laravel-template-...
build:
context: ./
dockerfile: ./Dockerfile.dev
volumes:
- .:/var/www-data
environment:
- PORT=80
ports:
- 81:80
links:
- db
db:
image: postgres:13
container_name: db-lrv-postgres-...
restart: always
environment:
POSTGRES_DB: db-lrv-postgres
POSTGRES_USER: ...
POSTGRES_PASSWORD: ...
TZ: ...
PORT: ${PORT:-5432}
ports:
- "5434:5432"
here is "Dockerfile" :
FROM php:7.4-fpm
USER root
WORKDIR /var/www-data
RUN apt-get update \
# gd
&& apt-get install -y --no-install-recommends build-essential openssl nginx libfreetype6-dev libjpeg-dev libpng-dev libwebp-dev zlib1g-dev libzip-dev gcc g++ make nano vim unzip curl git jpegoptim optipng pngquant gifsicle locales libonig-dev nodejs npm libpq-dev \
#custom-dependencies installed: libpq-dev
&& deploy-php-ext-configure gd \
&& deploy-php-ext-install gd \
# gmp
&& apt-get install -y --no-install-recommends libgmp-dev \
&& deploy-php-ext-install gmp \
# pdo
&& deploy-php-ext-install pdo \
# pdo_pgsql
&& deploy-php-ext-install pgsql pdo_pgsql mbstring \
# opcache
&& deploy-php-ext-enable opcache \
# zip
&& deploy-php-ext-install zip \
&& apt-get autoclean -y \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /tmp/pear/
COPY . /var/www-data
COPY ./deploy/php.ini /usr/local/etc/php/conf.d/local.ini
COPY ./deploy/nginx.conf /etc/nginx/nginx.conf
RUN mv .env.production .env
RUN chmod +rwx /var/www-data
RUN chmod -R 777 /var/www-data
#RUN npm install -g npm#latest
RUN npm install
RUN npm run prod
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install --working-dir="/var/www-data"
RUN composer dump-autoload --working-dir="/var/www-data"
RUN php artisan optimize
EXPOSE 8080
RUN ["chmod", "+x", "./deploy/post_deploy.sh"]
CMD [ "sh", "./deploy/post_deploy.sh" ]

Laravel Sail container suddenly unreachable

A few days ago my sail environment was working just fine. Now it isn't. Currently I'm using Laravel to refactor a bunch of api's over from our legacy system. So the way it works is our legacy system makes an http request, using Guzzle, to Laravel which does the processing and then returns. I noticed on my local machine I am no longer able to hit my laravel project. I get an error of connection refused. I also noticed I'm not able to hit the application through my chrome browser either and I get ERR_EMPTY_RESPONSE, however, if I log into any of my other containers on the same network and try to ping my laravel container it works just fine. I'd also like to note I have a rabbitmq service in the same docker-compose.yml and I'm able to hit the ui portion of that just fine in my browser.
This is a shared project being used on both Mac and Windows. The one mac machine it's running on is fine. My windows machine is the only one that's experiencing this issue. Below is an image of the output from sail up -d
sail up -d output
See laravel.test Error??? That's never come up before. Also notice how the DockerFile is running on CACHED commands. Not sure if that's an issue, but it never did that before when building from scratch.
Current Configuration:
Windows 10
Docker Desktop 4.8.2
PHP 8.1
WSL2
Things I've tried (stupid or not)
Restart my machine
Add php_flag opcache.enable Off to my .htaccess
Add memory_limit = 1024M to my php.ini
Point to a different DockerFile
Change the port
Wipe all associate images and rebuild from scratch
docker-compose.yml:
version: '3'
services:
laravel.test:
build:
context: ./docker_config/sail/runtimes/8.1
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.1/app
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '${APP_PORT:-80}:80'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
volumes:
- '.:/var/www/html'
networks:
- sail
- default
depends_on:
- rabbitmq3
rabbitmq3:
container_name: "rabbitmq"
image: rabbitmq:3-management
environment:
- RABBITMQ_DEFAULT_USER=guest
- RABBITMQ_DEFAULT_PASS=guest
volumes:
- ./docker_config/rabbitmq_init/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
- ./docker_config/rabbitmq_init/definitions.json:/etc/rabbitmq/definitions.json:ro
ports:
# AMQP protocol port
- '5672:5672'
# HTTP management UI
- '15672:15672'
networks:
default:
external: true
name: localdevstructure_default
sail:
driver: bridge
DockerFile:
FROM ubuntu:21.10
LABEL maintainer="Taylor Otwell"
ARG WWWGROUP
ARG NODE_VERSION=16
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 hkps://keyserver.ubuntu.com --recv-keys 14AA40EC0831756756D7F66C4F4EA0AAE5267A6C \
&& echo "deb https://ppa.launchpadcontent.net/ondrej/php/ubuntu impish main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
&& apt-get update \
&& apt-get install -y php8.1-cli php8.1-dev \
php8.1-pgsql php8.1-sqlite3 php8.1-gd \
php8.1-curl \
php8.1-imap php8.1-mysql php8.1-mbstring \
php8.1-xml php8.1-zip php8.1-bcmath php8.1-soap \
php8.1-intl php8.1-readline \
php8.1-ldap \
php8.1-msgpack php8.1-igbinary php8.1-redis php8.1-swoole \
php8.1-memcached php8.1-pcov php8.1-xdebug \
&& php -r "readfile('https://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
&& curl -sL https://deb.nodesource.com/setup_$NODE_VERSION.x | bash - \
&& apt-get install -y nodejs \
&& npm install -g npm \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
&& apt-get update \
&& apt-get install -y yarn \
&& apt-get install -y mysql-client \
&& apt-get install -y postgresql-client \
&& apt-get install -y vim \
&& 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/php8.1
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 highPriority-worker.conf /etc/supervisor/conf.d/highPriority-worker.conf
COPY lowPriority-worker.conf /etc/supervisor/conf.d/lowPriority-worker.conf
COPY php.ini /etc/php/8.1/cli/conf.d/99-sail.ini
RUN chmod +x /usr/local/bin/start-container
EXPOSE 8000
ENTRYPOINT ["start-container"]
EDIT:
The only error I keep coming across is this:
"Error response from daemon: Get "https://sail-8.1/v2/": Failed to lookup host: sail-8.1"
I believe this relates to the error shown in the provided image for service laravel.test. What's happening is that service enters the "Pulling" stage and within a second errors out. So this is leading me to believe that something is happening during image creation
So I figured out what was happening and this was really stupid on my part. I thought that inherently supervisor isn't setup to autostart on local dev environments, but when using sail it is. In the supervisord.conf file that gets copied over to the container from local, there's a program in there to run the artisan serve command. Long story short I commented this out thinking it wasn't necessary. Didn't realize sail was using supervisor to keep that command running.

Laravel SAIL_XDEBUG_MODE not working for debugging web calls

I have started to play with my first Laravel project on a MacOS. I am using Laravel Sail for running the project inside a container and everything seems to work except the debugging part.
Versions used:
Laravel 8.66,
PHP 8.0.12,
Xdebug 3.1.1
According to Laravel docs we can set SAIL_XDEBUG_MODE to enable the debug mode. However, the debugging is not working in PhpStorm even if it is set to listen for incoming connections. I have seen that running php -i in container returns different configs for Xdebug comparing to what we see in phpinfo() from browser even if the Configuration file is the same one.
Here are some screenshots from browser:
Here are screenshots from what I see in the command line:
As it can be seen in the attached screenshots, in console is used the XDEBUG_MODE env var, while in browser is used xdebug.mode. Is is possible to have the same configs in console and browser via SAIL_XDEBUG_MODE ?
This is the Dockerfile that is used:
FROM ubuntu:21.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 hirsute main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
&& apt-get update \
&& apt-get install -y php8.0-cli php8.0-dev \
php8.0-pgsql php8.0-sqlite3 php8.0-gd \
php8.0-curl php8.0-memcached \
php8.0-imap php8.0-mysql php8.0-mbstring \
php8.0-xml php8.0-zip php8.0-bcmath php8.0-soap \
php8.0-intl php8.0-readline php8.0-pcov \
php8.0-msgpack php8.0-igbinary php8.0-ldap \
php8.0-redis php8.0-swoole php8.0-xdebug \
&& php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
&& curl -sL https://deb.nodesource.com/setup_16.x | bash - \
&& apt-get install -y nodejs \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
&& apt-get update \
&& apt-get install -y yarn \
&& apt-get install -y mysql-client \
&& apt-get install -y postgresql-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/php8.0
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/8.0/cli/conf.d/99-sail.ini
RUN chmod +x /usr/local/bin/start-container
EXPOSE 8000
ENTRYPOINT ["start-container"]
And this is my 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
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '${APP_PORT:-80}:80'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
PHP_IDE_CONFIG: "serverName=my.local"
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
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
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
retries: 3
timeout: 5s
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
As it can be seen in the attached screenshots, in console is used the XDEBUG_MODE env var, while in browser is used xdebug.mode.
Xdebug uses XDEBUG_MODE if it is set, otherwise it falls back to the value of the xdebug.mode setting.
I don't know which web server Sail uses, but some will strip out the environment variables — including XDEBUG_MODE.
So you can either fix that, or update the Dockerfile to add a line below:
COPY php.ini /etc/php/8.0/cli/conf.d/99-sail.ini
Which says:
COPY xdebug.ini /etc/php/8.0/cli/conf.d/999-xdebug.ini
And add to the contents of xdebug.ini (in the same directory as php.ini):
xdebug.mode=develop,debug
I had the same problem and I'm also on macOS.
You must use the export command, like this:
export SAIL_XDEBUG_MODE=develop,debug

Persist Symfony upgrade in Docker container

I have a PHP-based Docker container with Composer and Symfony installed inside of it. But each time I start that container, a message from Symfony appears, proposing to download & install the last version (and to activate TLS), which I do (for both). So I think the upgrade doesn't persist, how can I solve this ? (thank you in advance)
Thank you for your answers, everyone. The docker-composer.yaml and php/Dockerfile are made from a French tutorial video, slightly modified due to improvements noted in the Youtube comment section: The video is called "Un environnement de développement Symfony 5 avec Docker et Docker-compose" from Yoandev Co. Here is the docker-compose.yaml :
version: "3.8"
services:
db:
image: mariadb
container_name: db_SF_tuto_2
restart: always
volumes:
- db-data2:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: admin
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
networks:
- dev2
phpmyadmin:
image: phpmyadmin
container_name: phpmyadmin_SF_tuto_2
restart: always
depends_on:
- db
ports:
- 8090:80
environment:
PMA_HOST: db
networks:
- dev2
maildev:
image: maildev/maildev
container_name: maildev_SF_tuto_2
command: bin/maildev --web 80 --smtp 25 --hide-extensions STARTTLS
ports:
- "8091:80"
restart: always
networks:
- dev2
www:
build: php
container_name: www_SF_tuto_2
ports:
- "8742:8000"
volumes:
- ./php/vhosts:/etc/apache2/sites-enabled
- ./:/var/www
restart: always
networks:
- dev2
networks:
dev2:
volumes:
db-data2:
… and php/Dockerfile :
FROM php:7.4-apache
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf \
\
&& apt-get update \
&& apt-get install -y --no-install-recommends \
locales apt-utils git libicu-dev g++ libpng-dev libxml2-dev libzip-dev libonig-dev libxslt-dev unzip \
\
&& echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
&& echo "fr_FR.UTF-8 UTF-8" >> /etc/locale.gen \
&& locale-gen \
\
&& curl -sS https://getcomposer.org/installer | php -- \
&& mv composer.phar /usr/local/bin/composer \
\
&& curl -sS https://get.symfony.com/cli/installer | bash \
&& mv /root/.symfony/bin/symfony /usr/local/bin \
\
&& docker-php-ext-configure \
intl \
&& docker-php-ext-install \
pdo_mysql gd opcache intl zip calendar xsl \
\
&& pecl install apcu && docker-php-ext-enable apcu
WORKDIR /var/www/
As you have discovered, container storage is temporary and any changes done in it will be discarded when the container is removed. Note that you can stop a running container and the changes will still be there the next time you launch it, but docker-compose down does remove it, so every time you boot up your symfony binary is being reloaded from the image.
If you want for the updates to persist you'll have to create a volume.
However, since your current installation directory already contains binaries from your base image I'd suggest installing to a different directory and mount that.
In your Dockerfile, change the installation target. Since its a new directory you need to add it to the current $PATH so the tools can be executed.
FROM php:7.4-apache
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf \
\
&& apt-get update \
&& apt-get install -y --no-install-recommends \
locales apt-utils git libicu-dev g++ libpng-dev libxml2-dev libzip-dev libonig-dev libxslt-dev unzip \
&& echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
&& echo "fr_FR.UTF-8 UTF-8" >> /etc/locale.gen \
&& locale-gen \
\
&& mkdir /opt/bin -p \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir /opt/bin --filename composer \
&& curl -sS https://get.symfony.com/cli/installer | bash -s - --install-dir /opt/bin \
\
&& docker-php-ext-configure \
intl \
&& docker-php-ext-install \
pdo_mysql gd opcache intl zip calendar xsl \
\
&& pecl install apcu && docker-php-ext-enable apcu
ENV PATH /opt/bin:$PATH
WORKDIR /var/www/
Now specify where to map the volume in the docker-compose.yml file:
www:
# ...
volumes:
# Specify the mount point.
# If you use short syntax here, a volume will be created every restart.
- phptools:/opt/bin
volumes:
# Declare a named volume so it can be remounted
phptools:
Run docker-compose build and docker-compose up.

Laravel docker image "Could not open input file: /var/www/html/artisan"

I'm attempting to build and run a Laravel docker image which was originally generated via Laravel sail. When using docker-compose up, it correctly runs and I am able to access the site. Running docker build docker/7.4/ -t <tagname> followed by docker run <tagname> results in the following error logs however:
I have tracked this error down to my supervisord.conf file, where it is trying to call /var/www/html/artisan serve, but is seemingly unable to resolve it.
supervisord.conf:
[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
[program:php]
command=/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
user=sail
environment=LARAVEL_SAIL="1"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
Here is also the Dockerfile I'm using, as well as the start-container script it runs
Dockerfile:
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 gosu curl zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2
RUN apt-get install -y gnupg ca-certificates
RUN 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 \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
&& apt-get update \
&& apt-get install -y yarn \
&& apt-get install -y mysql-client \
&& apt-get install -y postgresql-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 www-data sail
RUN useradd -ms /bin/bash --no-user-group -g www-data -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"]
start-container:
#!/usr/bin/env bash
if [ ! -z "$WWWUSER" ]; then
usermod -u $WWWUSER sail
fi
if [ ! -d /.composer ]; then
mkdir /.composer
fi
chmod -R ugo+rw /.composer
if [ $# -gt 0 ];then
exec gosu $WWWUSER "$#"
else
/usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
fi
docker-compose.yml:
version: '3'
services:
laravel.test:
build:
context: ./docker/7.4
dockerfile: Dockerfile
args:
WWWGROUP: 'www-data'
container_name: laravel
image: sail-7.4/app
ports:
- '${APP_PORT:-80}:80'
environment:
WWWUSER: 'sail'
LARAVEL_SAIL: 1
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
mysql:
image: 'mysql:8.0'
container_name: 'mysql'
restart: 'unless-stopped'
tty: 'true'
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'
SERVICE_TAGS: 'dev'
SERVICE_NAME: 'mysql'
volumes:
- 'sailmysql:/var/lib/mysql'
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping"]
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
I am fairly new to using docker, so the process is somewhat confusing to me. Any help on where to look for this or how to debug it would be greatly appreciated - as well as an explanation as to why it's unable to resolve the php artisan command in supervisord.conf
Looking at your Dockerfile, you don't have a copy statement which copies the your source code to the container. And in your docker compose you would would be sharing that code using volumes. Hence your code works fine in docker-compose up. But in case of docker run <image> that volume is not shared and hence the error
simply add COPY . /var/www/html above COPY start-container /usr/local/bin/start-container

Categories