I have a Laravel / VueJS app that I am trying to dockerize.
At the end of the Dockerfile, I have
CMD php artisan serve --host=0.0.0.0 --port=80
my docker-compose:
version: '3'
services:
app:
image: xoco/kendozone:local-1.0.1
ports:
- "8181:80"
When I run:
docker-compose up
I get:
Recreating local_app_1 ... done
Attaching to local_app_1
app_1 | [03-May-2018 18:20:21] NOTICE: fpm is running, pid 1
app_1 | [03-May-2018 18:20:21] NOTICE: ready to handle connections
that seems to be ok
But when I try to access it on
localhost:8181
I get a ERR_EMPTY_RESPONSE
Any idea how to fix it ?
EDIT: Add Dockerfile
FROM php:7.2-fpm
LABEL version="1.0.0"
ENV node_version 8.4.0
ENV npm_version 5.7.1
ENV NVM_DIR /.nvm
ENV APP_DIR="/var/www"
ENV APP_PORT="80"
ENV DOCKER_FOLDER="docker/local"
RUN echo "deb http://ftp.de.debian.org/debian stretch main " >> /etc/apt/sources.list \
&& apt-get update -y
RUN apt-get install -y openssl zip unzip git gcc make automake \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
libmagickwand-dev vim --no-install-recommends
RUN apt-get purge --auto-remove -y g++ \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install pdo pdo_mysql mbstring zip -j$(nproc) iconv -j$(nproc) gd
WORKDIR $APP_DIR
COPY . $APP_DIR
RUN mkdir -p $APP_DIR/resources/assets/less/_main_full \
&& touch $APP_DIR/resources/assets/less/_main_full/main.less \
&& touch $APP_DIR/database/sqlite.db \
&& mv $DOCKER_FOLDER/.env.local .env \
&& chown -R www-data:www-data $APP_DIR
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install --no-interaction
RUN mkdir -p $NVM_DIR && chown -R www-data:www-data $NVM_DIR
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash \
&& [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" \
&& nvm install ${node_version}
ENV NODE_PATH $NVM_DIR/v$node_version/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$node_version/bin:$PATH
RUN npm install --save-exact imagemin-pngquant#5.0.*
RUN npm install
RUN npm run production
RUN php artisan key:generate
RUN php artisan migrate --seed
CMD php artisan serve --host=0.0.0.0 --port=$APP_PORT
Related
Info:
OS: Ubuntu 16.04
Docker version: 20.10.6
Commit: 63fc1fd
Project versions:
Laravel 5.8.33
Vue 2.6.10
My Laravel docker environment stopped working today.
After several tries I finally deleted all images and tried to rebuild environemt.
I get the same error:
+ apt-get install -yqq apt-utils libzip-dev zip unzip
E: Unable to correct problems, you have held broken packages.
ERROR: Service 'php-fpm' failed to build: The command '/bin/sh -c set -xe; apt-get update -yqq && pecl channel-update pecl.php.net && apt-get install -yqq apt-utils libzip-dev zip unzip && docker-php-ext-configure zip --with-libzip && docker-php-ext-install zip && php -m | grep -q 'zip'' returned a non-zero code: 100
Here is the code of my php-fpm Docker file.
Any idea what is wrong?
in Dockerfile
you can add:
FROM composer AS composer
COPY . /app
RUN rm composer.lock && composer install
--optimize-autoloader
--no-interaction
--no-progress
--ignore-platform-reqs
RUN apk add --no-cache php
php7-common
php7-fpm
php7-pdo
php7-opcache
php7-zip \
did you add
RUN apk add --no-cache php
php7-common
php7-fpm \
try this
FROM composer AS composer
COPY . /app
RUN rm composer.lock && composer install \
--optimize-autoloader \
--no-interaction \
--no-progress \
--ignore-platform-reqs
RUN chmod 777 -R storage
FROM alpine:3.13
LABEL Maintainer="Diki Rahman <diki#sawala.tech>"
RUN apk add --no-cache php \
php7-common \
php7-fpm \
php7-pdo \
php7-opcache \
php7-zip \
php7-phar \
php7-iconv \
php7-cli \
php7-curl \
php7-openssl \
php7-mbstring \
php7-tokenizer \
php7-fileinfo \
php7-json \
php7-xml \
php7-xmlwriter \
php7-simplexml \
php7-dom \
php7-pdo_mysql \
php7-pdo_pgsql \
php7-pdo_sqlite \
php7-tokenizer \
php7-pecl-redis \
nginx supervisor curl
COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf
COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf
COPY docker/php-fpm/fpm-pool.conf /etc/php7/php-fpm.d/www.conf
COPY docker/php/php.ini /etc/php7/conf.d/timezone.ini
COPY docker/supervisord/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY docker/docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x docker-entrypoint.sh
RUN mkdir -p /var/www/html
RUN mkdir -p /var/www/backend
RUN chown -R nginx.nginx /var/www/html && \
chown -R nginx.nginx /run && \
chown -R nginx.nginx /var/lib/nginx && \
chown -R nginx.nginx /var/log/nginx
WORKDIR /var/www/html
COPY --chown=nginx --from=composer /app /var/www/html
COPY --chown=nginx --from=composer /app /var/www/backend
EXPOSE 8080
ENTRYPOINT ["/docker-entrypoint.sh"]
HEALTHCHECK --timeout=10s CMD curl --silent --fail http://127.0.0.1:8080/fpm-ping
I'm trying to deploy a Laravel 5.5 app using Docker on Heroku. I'm coming up against the problem where Heroku dynamically assigns the $PORT value though, and I can't figure out where to tell Apache to use $PORT instead of port 80. Has anyone else had success deploying an app using Apache in Docker to Heroku with the $PORT specification?
To be specific, this is the error I get tailing the Heroku logs:
2019-01-31T14:01:17.605297+00:00 app[web.1]: (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
which I understand to mean that the container is trying to listen on Port 80, but the host is using $PORT instead of 80.
Here's my Dockerfile:
FROM php:7.1.5-apache
#install all the system dependencies and enable PHP modules
RUN apt-get update && apt-get install -y \
libicu-dev \
libpq-dev \
libmcrypt-dev \
git \
zip \
unzip \
&& rm -r /var/lib/apt/lists/* \
&& docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
&& docker-php-ext-install \
intl \
mbstring \
mcrypt \
pcntl \
pdo_mysql \
pdo_pgsql \
pgsql \
zip \
opcache
ENV PHPREDIS_VERSION 3.0.0
RUN mkdir -p /usr/src/php/ext/redis \
&& curl -L https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \
&& echo 'redis' >> /usr/src/php-available-exts \
&& docker-php-ext-install redis
#install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer
#set our application folder as an environment variable
ENV APP_HOME /var/www/html
#change uid and gid of apache to docker user uid/gid
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
#change the web_root to laravel /var/www/html/public folder
RUN sed -i -e "s/html/html\/public/g" /etc/apache2/sites-enabled/000-default.conf
# enable apache module rewrite
RUN a2enmod rewrite
#copy source files and run composer
COPY . $APP_HOME
# install all PHP dependencies
RUN composer install --no-interaction
#change ownership of our applications
RUN chown -R www-data:www-data $APP_HOME
And here's my Heroku Procfile:
web: vendor/bin/heroku-php-apache2 public/
And here's my heroku.yml:
build:
docker:
web: Dockerfile
Thanks!
Got it.
Using this SO post, I discovered I could insert a CMD statement at the end of my Dockerfile to sed replace the ports in my apache config files to the magical $PORT environment variable at run time.
New Dockerfile below:
#start with our base image (the foundation) - version 7.1.5
FROM php:7.1.5-apache
#install all the system dependencies and enable PHP modules
RUN apt-get update && apt-get install -y \
libicu-dev \
libpq-dev \
libmcrypt-dev \
git \
zip \
unzip \
&& rm -r /var/lib/apt/lists/* \
&& docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
&& docker-php-ext-install \
intl \
mbstring \
mcrypt \
pcntl \
pdo_mysql \
pdo_pgsql \
pgsql \
zip \
opcache
ENV PHPREDIS_VERSION 3.0.0
RUN mkdir -p /usr/src/php/ext/redis \
&& curl -L https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \
&& echo 'redis' >> /usr/src/php-available-exts \
&& docker-php-ext-install redis
#install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer
#set our application folder as an environment variable
ENV APP_HOME /var/www/html
#change uid and gid of apache to docker user uid/gid
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
#change the web_root to laravel /var/www/html/public folder
RUN sed -i -e "s/html/html\/public/g" /etc/apache2/sites-enabled/000-default.conf
# enable apache module rewrite
RUN a2enmod rewrite
#copy source files and run composer
COPY . $APP_HOME
# install all PHP dependencies
RUN composer install --no-interaction
#change ownership of our applications
RUN chown -R www-data:www-data $APP_HOME
#update apache port at runtime for Heroku
ENTRYPOINT []
CMD sed -i "s/80/$PORT/g" /etc/apache2/sites-enabled/000-default.conf /etc/apache2/ports.conf && docker-php-entrypoint apache2-foreground
I'm new to docker and I try to build a php-fpm container which should include sendmail as well
having the following configuration
# php-fpm
FROM php:7.2-fpm
RUN apt-get update && apt-get install -y sendmail sendmail-bin mailutils openssl git libcurl4-gnutls-dev libpng-dev libfreetype6-dev libjpeg62-turbo-dev zlib1g-dev libicu-dev g++ libxml2-dev libpq-dev \
# && git clone -b php7.2 https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis \
&& docker-php-ext-install pdo pdo_mysql pdo_pgsql pgsql intl curl json opcache xml zip mysqli mbstring \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& apt-get autoremove && apt-get autoclean \
&& rm -rf /var/lib/apt/lists/* \
RUN yes | pecl install xdebug \
# configure sendmail
COPY ./*.sh /usr/local/bin/
COPY ./php_mail.ini /usr/local/etc/php/conf.d/mail.ini
RUN chmod a+x /usr/local/bin/*.sh
ENTRYPOINT ["start_sendmail_mta.sh"]
RUN update-ca-certificates
ENV PHP_DATE_TIMEZONE="Europe/Berlin" \
PHP_LOG_ERRORS_MAX_LEN=1024 \
PHP_LOG_ERRORS="" \
PHP_MAX_EXECUTION_TIME=0 \
PHP_MAX_FILE_UPLOADS=20 \
PHP_MAX_INPUT_VARS=1000 \
PHP_MEMORY_LIMIT=128M \
PHP_POST_MAX_SIZE=8M \
#PHP_SENDMAIL_PATH="/usr/sbin/sendmail -t -i" \
PHP_SESSION_SAVE_HANDLER=files \
PHP_SESSION_SAVE_PATH="" \
PHP_UPLOAD_MAX_FILESIZE=2M \
PHP_XDEBUG_DEFAULT_ENABLE=0 \
PHP_XDEBUG_IDEKEY=''\
PHP_XDEBUG_PROFILER_ENABLE=0 \
PHP_XDEBUG_REMOTE_AUTOSTART=0 \
PHP_XDEBUG_REMOTE_CONNECT_BACK=0 \
PHP_XDEBUG_REMOTE_ENABLE=0 \
PHP_XDEBUG_REMOTE_HOST=0
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
&& php -r "unlink('composer-setup.php');"
CMD ["php-fpm"]
EXPOSE 9000
when I run docker-compose buildI get the following error
Service 'php-fpm' failed to build: The command '/bin/sh -c chmod a+x /usr/local/bin/*.sh' returned a non-zero code: 1
[![enter image description here][2]][2]
Why are the bash files not found in this case?
chmod: cannot access '/usr/local/bin/*.sh': No such file or directory
ERROR: Service 'php-fpm' failed to build: The command '/bin/sh -c chmod a+x /usr/local/bin/*.sh' returned a non-zero code: 1
if I run RUN ls -l /usr/local/bin I can not see any bash files
Just change copy ./*.sh to:
COPY sendmail.sh /usr/local/bin/
COPY ./php_mail.ini /usr/local/etc/php/conf.d/mail.ini
COPY start_sendmail_mta.sh /usr/local/bin
RUN chmod a+x /usr/local/bin/*.sh
I'm in the process of dockerizing our dev environement. The application consists among other things of a laravel app exposing a REST API. Authentication is done through laravel passport.
As this is intented for dev only, I'm installing composer dependencies, setting application encryption key, migrating datatabases and setting passport keys at run time. Everything is initialised correctly except for the passport keys. No matter how I tried to approach the problem I end up with the following error:
fpm_1 | In CryptKey.php line 45:
fpm_1 |
fpm_1 | Key path "file:///var/www/html/storage/oauth-public.key" does not exist or
fpm_1 | is not readable
This is the relevant part of my docker-compose file.
version: '3'
services:
fpm:
build: ./api/docker/fpm
restart: unless-stopped
volumes:
- ./api:/var/www/html
- /etc/passwd:/etc/passwd
user: "${UID}:${GID}"
My fpm dockerfile (./api/docker/fpm/Dockerfile)
FROM php:7.2.6-fpm
COPY ./init-app.sh /usr/local/bin/
COPY ./install-composer.sh /usr/local/bin/
RUN apt-get update && apt-get install -y --no-install-recommends libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev libpng-dev \
libzip-dev \
libzip4 \
git \
zip \
wget \
&& apt-get autoremove \
&& apt-get clean \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd \
&& docker-php-ext-configure zip --with-libzip=/usr/include/ \
&& docker-php-ext-install zip \
&& docker-php-ext-install pdo_mysql \
&& chmod +x /usr/local/bin/init-app.sh \
&& chmod +x /usr/local/bin/install-composer.sh \
&& /usr/local/bin/install-composer.sh \
&& rm /usr/local/bin/install-composer.sh \
&& wget https://raw.githubusercontent.com/vishnubob/wait-for-it/8ed92e8cab83cfed76ff012ed4a36cef74b28096/wait-for-it.sh \
&& chmod +x wait-for-it.sh \
&& mv wait-for-it.sh /usr/local/bin/
ENTRYPOINT [ "/usr/local/bin/init-app.sh" ]
CMD ["php-fpm"]
install-composer.sh installs composer into the container at build time.
init-app.sh:
#!/bin/sh
set -e
# Install composer dependencies
composer install
# Copy env file
cp .env.example .env
# Wait for DB to be up
/usr/local/bin/wait-for-it.sh db:3306 -t 0 --strict -- php artisan key:generate && php artisan migrate:refresh --seed
php artisan passport:install
# Run upstream entrypoint
# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- php-fpm "$#"
fi
exec "$#"
My user is correctly mapped inside the fpm container as I export $UID and $GID in .zshrc. Commenting out the passport:install line in my init-app.sh in order to let container boot correctly, I'm able to generate the keys by running docker exec -it php artisan passport:install just fine. But letting the container handle it fails.
Turns out, one of my database seeder, somehow required the key to be present. while I investigate, I fixed the problem by swapping instructions (the seeding and passport keys installation)
I have a container with for my laravel app with php:7.0.4-fpm as base image.
This is my dockerfile :
FROM php:7.0.4-fpm
RUN apt-get update && apt-get install -y cron nano libmcrypt-dev \
mysql-client libmagickwand-dev --no-install-recommends \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& docker-php-ext-install mcrypt pdo_mysql
COPY . /var/www
ADD crontab /etc/cron.d/laravel-cron
RUN chmod 0644 /etc/cron.d/laravel-cron
RUN touch /var/log/cron.log
RUN /usr/bin/crontab /etc/cron.d/laravel-cron
RUN cron
Cron is not running, I have to ssh in the container to launch it.
When I start it manually it works for som simple things like echoing a text every minute. But not for the php artisan schedule:run command. In the log I see :
Running scheduled command: '/usr/local/bin/php' 'artisan'
errors:insert > '/dev/null' 2>&1
errors:insert is the name of my task, but nothing is update in the website.
That's strange because when I run php artisan schedule:run command manually it works on the website.
So my question is : How to make cron work on a docker container to execute the php artisan schedule:run command ? Preferably written in a dockerfile and not manually via ssh.
I also have a strange message from the container :
ALERT: oops, unknown child (5094) exited with code 1.
Please open a bug report (https://bugs.php.net).
An alternative solution could be by running php artisan schedule:run with supervisor. In my case I have a schedule-run.conf in [project root]/.docker/php/workers:
[program:schedule-run]
process_name=%(program_name)s_%(process_num)02d
command=/bin/bash -c "while [ true ]; do (php /var/www/html/artisan
schedule:run --verbose --no-interaction &); sleep 60; done"
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/schedule.log
stopwaitsecs=60
replace your apt-get install -y cron by apt-get install -y supervisor
add ADD .docker/php/workers /etc/supervisor/conf.d and CMD ["/usr/bin/supervisord"] to your Dockerfile.
Though this is a late reply but I thought my solution might help others as I have faced this issue before.
I created separate docker container as Laravel Docker Cron for performing laravel schedules
Here my Dockerfile code
FROM ubuntu:latest
MAINTAINER docker#ekito.fr
ENV DEBIAN_FRONTEND=noninteractive
# install base packages
RUN apt-get update && apt-get -y install cron\
apt-utils \
curl \
# Install php 7.2
php7.2 \
php7.2-cli \
php7.2-json \
php7.2-curl \
php7.2-fpm \
php7.2-dev \
php7.2-gd \
php7.2-ldap \
php7.2-mbstring \
php7.2-bcmath \
php7.2-mysql \
php7.2-soap \
php7.2-sqlite3 \
php7.2-xml \
php7.2-zip \
php7.2-intl \
libldap2-dev \
libaio1 \
libaio-dev
# Install tools
RUN apt-get -y install openssl \
nano \
ghostscript \
iputils-ping \
locales \
rlwrap \
php-pear \
make \
unzip \
zip \
tar \
ca-certificates \
&& apt-get clean &&\
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Set locales
RUN locale-gen en_US.UTF-8 en_GB.UTF-8 de_DE.UTF-8 es_ES.UTF-8 fr_FR.UTF-8 it_IT.UTF-8 km_KH sv_SE.UTF-8 fi_FI.UTF-8
# Copy crontab file to the cron.d directory
COPY crontab /etc/cron.d/crontab
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/crontab
# Apply cron job
RUN crontab /etc/cron.d/crontab
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Run the command on container startup
CMD cron && tail -f /var/log/cron.log
crontab file will contain
* * * * * cd /var/www && php artisan schedule:run >> /var/log/cron.log 2>&1
# An empty line is required at the end of this file for a valid cron file.
Here is repo for this code click here