Trying to set a laravel project with redis, mysql and mongodb. Using docker-compose to set docker containers, but 127.0.0.1 throws The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied. Chown'ing directory but owner of /var/www/html inside 'app' container is root, not www-data. How can I fix it?
Dockerfile
ARG PHP_VERSION
FROM php:7-fpm-alpine
ARG APP_ENV
ARG REMOTE_WORKING_DIR
RUN apk update && apk add --no-cache $PHPIZE_DEPS \
build-base shadow nano curl gcc git bash \
php7 \
...installing dependencies...
...redis & mongodb...
...php settings...
...installing composer...
RUN rm -rf /var/cache/apk/*
RUN apk add shadow && usermod -u 1000 www-data && groupmod -g 1000 www-data
COPY . $REMOTE_WORKING_DIR
RUN sudo chown -R www-data:www-data $REMOTE_WORKING_DIR
USER www-data
EXPOSE 9000
CMD ["php-fpm"]
docker-compose.yml
version: "3"
services:
app:
build:
context: ./docker/php
args:
APP_ENV: ${APP_ENV}
PHP_VERSION: ${PHP_VERSION}
REMOTE_WORKING_DIR: ${REMOTE_WORKING_DIR}
container_name: app
restart: always
env_file: .env
ports:
...
links:
- redis
networks:
...
volumes:
- ${LOCAL_WORKING_DIR}:${REMOTE_WORKING_DIR}
- ./docker/php/config/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
nginx:
...
volumes:
- ${LOCAL_WORKING_DIR}:${REMOTE_WORKING_DIR}
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./docker/nginx/conf.d/:/etc/nginx/conf.d/
- ./docker/nginx/ssl/:/etc/nginx/ssl/
ports:
...
depends_on:
- app
networks:
...
redis:
...
networks:
...
Related
I have the following set up and have tried all the ways that I can find to pass env variables to PHP but none of the them are working. Not sure what I have set up wrong. Ideally I want to be able to get the variable using $_SERVER['MY_ENV'], but I have also tried getenv('MY_ENV') with no success.
docker-compose.yml
version: '3.9'
services:
app:
restart: unless-stopped
build:
context: ./
dockerfile: Dockerfile
environment:
- MY_ENV=dev
command: php -S app:8000 -t public
ports:
- "8888:8000"
depends_on:
- db
volumes:
- ./:/var/www
links:
- db
networks:
- myapp
db:
image: mysql:5.7
restart: always
command: mysqld --sql_mode="" --default-authentication plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: laravel
MYSQL_USER: laravel
MYSQL_PASSWORD: secret
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
networks:
- myapp
networks:
myapp:
DockerFile
FROM php:7.2-fpm
RUN apt-get update -y && apt-get install -y openssl zip unzip git cron
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-install pdo pdo_mysql
COPY composer.lock composer.json /var/www/
WORKDIR /var/www
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
COPY --chown=www:www . /var/www
USER www
EXPOSE 9000
CMD ["php-fpm"]
So, I want to configure the swoole laravel project. I run a Dockerfile and it successfully run. Then I want to run compose file this give me error
There are no commands defined in the "swoole" namespace.
This is my first experience with swoole. And I don't understand what is the problem.
How can solve this problem?
This is a Dockerfile
FROM php:8.1-fpm-alpine
# Install laravel requirement PHP package
RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS libzip-dev sqlite-dev \
libpng-dev libxml2-dev oniguruma-dev libmcrypt-dev curl curl-dev libcurl postgresql-dev
RUN docker-php-ext-install -j$(nproc) gd bcmath zip pdo_mysql pdo_pgsql
RUN pecl install xdebug swoole && docker-php-ext-enable swoole
# Install composer
ENV COMPOSER_HOME /composer
ENV PATH ./vendor/bin:/composer/vendor/bin:$PATH
ENV COMPOSER_ALLOW_SUPERUSER 1
RUN curl -s https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer
# Install PHP_CodeSniffer
WORKDIR /app
COPY ./ ./
USER root
RUN chown -R www-data /app/storage
RUN chmod -R ug+w /app/storage
RUN chmod 777 -R /app/storage
RUN chmod 777 -R /app/public
RUN composer install
RUN php artisan optimize
CMD php artisan swoole:http start
EXPOSE 1215
And this is a docker-compose.yaml file
version: "3.7"
services:
app:
build:
args:
user: www-data
uid: 1000
context: ./
dockerfile: Dockerfile
image: topspot-swoole-image
container_name: topspot-swoole-container
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- topspot-network
nginx:
image: nginx:alpine
container_name: topspot-nginx
restart: unless-stopped
ports:
- 80:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- topspot-network
networks:
topspot-network:
driver: bridge
Solved
I solved it. Firstly install the swoole and publish to a local project. Then run the container and the composer saw the Swoole packages.
When I boot up a container with below configuration using Blimp (Docker Compose in a cloud), it throws an error Exited: OCI runtime create failed: container_linux.go:345: starting container process caused "chdir to cwd (\"/var/www/html\") set in config.json failed: permission denied": unknown. Booting with docker-compose works just fine.
The problem is with volume mounting as far as I know.
docker-compose.yml
version: '3'
services:
app:
container_name: app
build:
context: ./
dockerfile: Dockerfile
args:
user: mk
uid: 1000
tty: true
volumes:
- ./src:/var/www/html
nginx:
container_name: nginx
image: nginx:stable-alpine
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
- mysql
networks:
- default
mysql:
container_name: mysql
image: mysql:5.7
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
volumes:
- ./docker/mysql:/var/lib/mysql
networks:
- default
networks:
default:
driver: bridge
Dockerfile
FROM php:7.4-fpm
LABEL MAINTAINER="Mayur Shingrakhiya <mk.shingrakhiya#gmail.com>"
RUN mkdir -p /var/www/html
ARG user=mk
ARG uid=1000
RUN apt-get update && apt-get install -y git curl libpng-dev libonig-dev libxml2-dev zip unzip
RUN docker-php-ext-install bcmath exif gd mbstring opcache pcntl pdo_mysql
# Get the Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
ENV PHP_OPCACHE_VALIDATE_TIMESTAMPS="1"
ENV PHP_OPCACHE_MAX_ACCELERATED_FILES="10000"
ENV PHP_OPCACHE_MEMORY_CONSUMPTION="192"
ENV PHP_OPCACHE_MAX_WASTED_PERCENTAGE="10"
COPY ./docker/php/conf.d/opcache.ini /usr/local/etc/php/conf.d/opcache.ini
# Create a User
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user
RUN chmod -R 775 /var/www/html
WORKDIR /var/www/html
USER $user
You won't find anything related to Blimp as it is not yet publicly released.
Help will be appreciated.
can you try RUN chmod -R 777 /var/www/html and then see if u get this error ?
I have a PHP project which requires me to change the owner of the /storage folder:
This is my docker-compose.yml
version: '2'
services:
web:
build:
context: ./
dockerfile: ./docker/web.docker
volumes:
- ./:/var/www
ports:
- "8080:80"
links:
- app
app:
build:
context: ./
dockerfile: ./docker/app.docker
volumes:
- ./:/var/www
links:
- database
environment:
- "DB_PORT=3306"
- "DB_HOST=database"
- "REDIS_PORT=6379"
- "REDIS_HOST=cache"
app.docker
FROM php:7.1-fpm
RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client \
&& docker-php-ext-install mcrypt pdo_mysql bcmath
WORKDIR /var/www
RUN chown www-data:www-data -R /var/www/storage/
The thing is that when chown www-data:www-data is run, I guess the folder is still not mounted and therefore I get the following error:
chown: cannot access '/var/www/storage/': No such file or directory
How can I posibly solve this? Is there a hook to run commands after the shared folder has been mounted?
My php container does not have the permissions to write cache on the mounted volume.
docker-compose.yml:
version: '2'
volumes:
database_data:
driver: local
services:
php:
build: ./docker/php/
expose:
- 9000
volumes:
- ./public:/var/www/html
working_dir: /var/www/html
nginx:
image: nginx:latest
depends_on:
- php
ports:
- 80:80
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
volumes_from:
- php
docker/php/Dockerfile:
FROM php:7.0-fpm
RUN docker-php-ext-install pdo_mysql \
&& docker-php-ext-install json
# Permission fix
RUN usermod -u 1000 www-data
You need to adapt the uid & gif of www-data to match the ownership of the files.
Inside your php's Dockerfile:
RUN sed -ri 's/^www-data:x:82:82:/www-data:x:1000:50:/' /etc/passwd
RUN chown -R www-data:www-data /var/www/html
Do you use it under Mac? Try to append this line in your php Dockerfile:
RUN usermod -G staff www-data
Another approach is to use the chown flag when copying, as stated here.
COPY --chown=<user>:<group> ...