How to install PHP composer inside a docker container - php

I try to work out a way to create a dev environment using docker and laravel.
I have the following dockerfile:
FROM php:7.1.3-fpm
RUN apt-get update && apt-get install -y libmcrypt-dev \
mysql-client libmagickwand-dev --no-install-recommends \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& docker-php-ext-install mcrypt pdo_mysql
&& chmod -R o+rw laravel-master/bootstrap laravel-master/storage
Laravel requires composer to call composer dump-autoload when working with database migration. Therefore, I need composer inside the docker container.
I tried:
RUN curl -sS https://getcomposer.org/installer | php -- \
--install-dir=/usr/bin --filename=composer
But when I call
docker-compose up
docker-compose exec app composer dump-autoload
It throws the following error:
rpc error: code = 13 desc = invalid header field value "oci runtime error: exec failed: container_linux.go:247: starting container process caused \"exec: \\\"composer\\\": executable file not found in $PATH\"\n"
I would be more than happy for advice how I can add composer to the PATH within my dockerfile or what else I can do to surpass this error.
Thanks for your support.
Also: this is the gitub repository if you need to see the docker-compose.yml file or anything else.

In Dockerfile :
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer

I can install composer adding this line on my test dockerfile:
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Here is the dockerfile:
FROM php:7.1.3-fpm
RUN apt-get update && apt-get install -y libmcrypt-dev \
mysql-client libmagickwand-dev --no-install-recommends \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& docker-php-ext-install mcrypt pdo_mysql
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
It works for me, to test if the composer are installed i access to my container bash and execute:
composer --version
Composer version 1.6.5 2018-05-04 11:44:59

This is how i do it with Laravel 8.4 in 2021 to deploy it to CloudRun in Google Cloud:
Dockerfile
#Get Composer
FROM composer:2.0 as vendor
WORKDIR /app
COPY database/ database/
COPY composer.json composer.json
COPY composer.lock composer.lock
RUN composer install \
--no-interaction \
--no-plugins \
--no-scripts \
--no-dev \
--prefer-dist
COPY . .
RUN composer dump-autoload
// some more custom steps like
FROM node:14.9 as frontend
...
FROM php:7.4-fpm
...
// Copy Composer dependencies
# Copy Composer dependencies
COPY --from=vendor app/vendor/ ./vendor/
COPY . .
// Some more custom steps
...
End of my Dockerfile to launch app with cleared optimized cache
# Run Laravel commands
RUN php artisan optimize:clear
CMD php artisan serve --host=0.0.0.0 --port=8080
EXPOSE 8080

Create an executable of your composer file using
RUN curl -sS https://getcomposer.org/installer | php -- \
--install-dir=/usr/bin --filename=composer && chmod +x /usr/bin/composer

use composer in dockerfile using curl
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Dockerfile
FROM 8.1.4-fpm
RUN apt-get update && apt-get install -y \
git \
curl \
zip \
unzip
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
WORKDIR /var/www

We have basicly the same command running with the difference,
--install-dir=/usr/local/bin
Alternatively, you should add the composer bin files path to the $PATH variable.
export PATH=$PATH":/usr/bin"

I'd just like to suggest another way.
Dockerfile:
RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer

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'

My problem solved. I just stopped firewalld service on system

Related

In Dockerfile "php artisan storage:link" returns a non-zero code

I can't understand why this is happening. I am trying to create a symlink but it fails. It only works if I ssh into the container after it has been created. When I build my project using Docker I get this error message:
Step 11/14 : RUN php artisan storage:link
---> Running in bbfd87dcdbf6
Could not open input file: artisan
ERROR: Service 'php-container' failed to build: The command '/bin/sh -c php artisan storage:link' returned a non-zero code: 1
But if I try to ssh into my container and run the same command then it works.
$ docker exec -it php-container /bin/bash
root#053d9cbd22eb:/var/www# php artisan storage:link
The [/var/www/public/storage] link has been connected to [/var/www/storage/app/public].
The links have been created.
Here is my Dockerfile
FROM php:7.4-fpm
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
libzip-dev \
libmcrypt-dev \
libonig-dev \
zlib1g-dev \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
graphviz \
curl
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-install gd
RUN docker-php-ext-install bcmath
# Permissions for Laravel
RUN chown -R www-data:www-data /var/www
RUN chmod -R 777 /var/www
# (!) This is not working.......
RUN php artisan storage:link
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD bash -c "composer install && chmod -R 777 /var/www && php artisan migrate --seed && php-fpm"
You must run composer install before php artisan command.
This is really important. you have error because artisan package not exist and actually vendor folder not created.
Finally you must change docker file to this :
CMD bash -c "composer install && chmod -R 777 /var/www && php artisan migrate --seed && php artisan storage:link

How to install pdo_odbc in Docker php image

I'm trying to connect to mssql with PDO and Laravel but I think I'm having issues installing the driver. There are no build errors, but I've looked around everywhere to try to find a solution, and they produce either an error or just does not work. When attempting to make a connection to a mssql server, it gives this error:
Illuminate\Database\QueryException: could not find driver (SQL: SELECT * FROM SAMPLE_VIEW_SM1 WHERE STUDENTS_ID=1) in file /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 664
Caused by
PDOException: could not find driver in file /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php on line 70
Here is my dockerfile:
FROM php:7.3-fpm-buster
ENV DEBIAN_FRONTEND=noninteractive
RUN rm /etc/apt/preferences.d/no-debian-php
RUN apt-get update -y && apt-get install -y \
openssl \
zip \
unzip \
git \
curl \
freetds-common \
freetds-bin \
unixodbc \
unixodbc-dev \
php-smbclient \
php7.3-sybase
RUN docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixodbc,/usr
RUN docker-php-ext-install pdo_odbc
RUN docker-php-ext-enable pdo_odbc
# Install node and dependencies
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs
RUN mkdir /cache
WORKDIR /cache
COPY package.json ./
COPY package-lock.json ./
RUN npm install
# Set file size limits
RUN echo "post_max_size=50M" >> /usr/local/etc/php/php.ini-production
RUN echo "upload_max_filesize=10M" >> /usr/local/etc/php/php.ini-production
RUN echo "memory_limit=6400M" >> /usr/local/etc/php/php.ini-production
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# Create application's working directory
WORKDIR /var/www
COPY . .
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install
RUN cp -r ./vendor/. /cache/vendor/
RUN chmod -R a+rwX /var/www/storage
RUN chmod -R +x ./entrypoint.sh
EXPOSE 9000
ENTRYPOINT [ "./entrypoint.sh" ]
I just published a solution related to this, I hope it serves you, greetings.
https://stackoverflow.com/a/68536444/5639865

dockerfile composer install does not work

I couldn't find a solution to this problem on the internet. I wrote a dockerfile file below.
FROM php:7.3.6-fpm
RUN docker-php-ext-install pdo_mysql
RUN apt-get update \
&& apt-get install -y sudo \
&& apt-get install -y \
curl \
sed \
zlib1g-dev \
git \
zip \
unzip \
nano
RUN cd ~
RUN sudo curl -sS https://getcomposer.org/installer | php -- --
install-dir=/usr/local/bin --filename=composer
RUN echo 'alias api="php api"' >> ~/.bashrc
RUN echo 'cd /var/www/html/app' >> ~/.bashrc
WORKDIR /var/www/html/app
COPY composer.json composer.json
COPY composer.lock composer.lock
RUN composer install
# Copy codebase
COPY . ./
running this code, installing dependencies with composer install doesn't seem to be a problem at all.
docker-compose up -d
and then
docker exec -it php /bin/bash
and then
cd app
vendor does not appear when I enter the directory with this command.I don't understand what the reason is. Can you help me how to solve the problem?

how to set permissions to cache and log symfony docker container

I have a Dockerfile for my Symfony application but the container doesn't have write permissions into the cache and logs directories.
I tried with the Symfony docs for permissions, but it is not working. I already set the container user to root, but the problem is the same.
Here is my Dockerfile:
FROM trafex/alpine-nginx-php7:ba1dd422
RUN apk --update add git php7-sockets php7-bcmath php7-pdo_mysql php7-pdo && rm /var/cache/apk/* \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY ./docker/nginx/nginx.conf /etc/nginx/nginx.conf
COPY . /var/www/html
RUN composer install \
--ignore-platform-reqs \
--no-interaction \
--no-plugins \
--no-scripts \
--prefer-dist
EXPOSE 8080
How can I set the correct permissions to run it?
From the Dockerfile of the docker image it seems like the user running both NGINX and PHP-FPM is nobody.
So you should be able to make it all work giving this user the rights on those files
FROM trafex/alpine-nginx-php7:ba1dd422
RUN apk --update add git php7-sockets php7-bcmath php7-pdo_mysql php7-pdo && rm /var/cache/apk/* \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY ./docker/nginx/nginx.conf /etc/nginx/nginx.conf
COPY . /var/www/html
RUN chown -R nobody:nobody /var/www/html
RUN composer install \
--ignore-platform-reqs \
--no-interaction \
--no-plugins \
--no-scripts \
--prefer-dist
EXPOSE 8080
But better yet, you should use the same syntax as they use in the original image
FROM trafex/alpine-nginx-php7:ba1dd422
RUN apk --update add git php7-sockets php7-bcmath php7-pdo_mysql php7-pdo && rm /var/cache/apk/* \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY ./docker/nginx/nginx.conf /etc/nginx/nginx.conf
COPY --chown=nobody . /var/www/html
RUN composer install \
--ignore-platform-reqs \
--no-interaction \
--no-plugins \
--no-scripts \
--prefer-dist
EXPOSE 8080

custom make install in Docker file

Not able to run make install from docker file, not sure where I am going wrong.
Getting below error message when docker-compose build is run in ubuntu
Step 6/10 : RUN make install
---> Running in c8f67e8de3b5
make: *** No rule to make target 'install'. Stop.
ERROR: Service 'web' failed to build:
The command '/bin/sh -c make install' returned a non-zero code: 2
I have the below structure where server is laravel project and in root there is a docker-compose.yml file.
Below is the structure of server folder
docker-compose.yml file
version: '3'
services:
web:
image: api_server
container_name: api_server
build:
context: ./server/release
ports:
- 9000:80
volumes:
- ./server:/var/www/app
Dockerfile
FROM php:7.3.1-apache-stretch
RUN apt-get update -yqq && \
apt-get install -y apt-utils zip unzip && \
apt-get install -y nano && \
apt-get install -y libzip-dev libpq-dev libpng-dev&& \
a2enmod rewrite && \
docker-php-ext-install gd mbstring && \
docker-php-ext-install pdo_pgsql && \
docker-php-ext-install pgsql && \
docker-php-ext-configure zip --with-libzip && \
docker-php-ext-install zip && \
rm -rf /var/lib/apt/lists/*
RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer
COPY default.conf /etc/apache2/sites-enabled/000-default.conf
WORKDIR /var/www/app
RUN make install
RUN chown -R www-data:www-data /var/www/app/
RUN chmod -R 777 /var/www/app/storage
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
EXPOSE 80
server/Makefile
install:
# some other commands
composer install
refresh:
# For testing
php artisan migrate:refresh
php artisan db:seed
make run:
php artisan migrate:status
php artisan serve
Basically if I comment RUN make install and RUN chmod -R 777 /var/www/app/storage commands from Dockerfile it works. To test i'll get into the container and run the above 2 commands manually then it works by showing the default laravel page.
So I feel trying to run the above 2 commands from Dockerfile i guess source code isn't available at that point.

Categories