I made a docker LAMP Stack Container including PHP7.3 and some extensions that I need to run my web application on. Recently I needed to include the sqlsrv extension to establish a connection to a MS SQL Server, it worked well for 1 day and when I restarted my Docker Desktop it rebuilt itself and now it's not working anymore even if I try to delete the images and volumes of the container and rebuild it.
When I run docker-compose up I get these two errors :
PHP Startup: Unable to load dynamic library 'pdo_sqlsrv.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20180731/pdo_sqlsrv.so (/usr/local/lib/php/extensions/no-debug-non-zts-20180731/pdo_sqlsrv.so: cannot open shared object file: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20180731/pdo_sqlsrv.so.so (/usr/local/lib/php/extensions/no-debug-non-zts-20180731/pdo_sqlsrv.so.so: cannot open shared object file: No such file or directory))
PHP Startup: Unable to load dynamic library 'sqlsrv.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20180731/sqlsrv.so (/usr/local/lib/php/extensions/no-debug-non-zts-20180731/sqlsrv.so: cannot open shared object file: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20180731/sqlsrv.so.so (/usr/local/lib/php/extensions/no-debug-non-zts-20180731/sqlsrv.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
Here are my config files :
docker-compose.yml
version: '3.8'
volumes:
datafiles:
services:
mysql:
image: mysql:8.0.0
container_name: mysql8
environment:
- MYSQL_ROOT_PASSWORD=x
- MYSQL_TCP_PORT=x
volumes:
- datafiles:/var/lib/mysql
- "./scripts:/docker-entrypoint-initdb.d"
restart: always
phpmyadmin:
container_name: phpmyadmin
image: phpmyadmin/phpmyadmin:latest
restart: always
environment:
PMA_HOST: x
PMA_USER: x
PMA_PASSWORD: x
ports:
- "8081:80"
website:
container_name: php73
build:
context: .
dockerfile: Dockerfile
image: rootkitty/lamp-quietal-webapp:latest
env_file:
- .env
ports:
- 80:80
- 443:443
depends_on:
- mysql
Dockerfile the COPY php.ini permit to add
extension=sqlsrv.so
extension=pdo_sqlsrv.so
FROM php:7.3-apache
#Install git and MySQL extensions for PHP
ENV ACCEPT_EULA=Y
ENV MYSQL_DBHOST=x
ENV MYSQL_DBPORT=x
ENV MYSQL_DBUSER=x
ENV MYSQL_DBPASS=x
ENV MYSQL_DBNAME=x
# Install selected extensions and other stuff
RUN apt-get update \
&& apt-get -y --no-install-recommends install apt-utils libxml2-dev gnupg apt-transport-https \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
# Install git
RUN apt-get update \
&& apt-get -y install git \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
# Install MS ODBC Driver for SQL Server
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
&& curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& apt-get update \
&& apt-get -y --no-install-recommends install msodbcsql17 unixodbc-dev \
&& pecl install sqlsrv \
&& pecl install pdo_sqlsrv \
&& echo "extension=pdo_sqlsrv.so" >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/30-pdo_sqlsrv.ini \
&& echo "extension=sqlsrv.so" >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/30-sqlsrv.ini \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
RUN apt-get update && \
apt-get install -y \
git libzip-dev \
&& docker-php-ext-install zip
RUN docker-php-ext-install intl mysqli pdo pdo_mysql
RUN a2enmod rewrite
COPY scripts/php.ini /usr/local/etc/php
COPY www /var/www/html/
EXPOSE 80/tcp
EXPOSE 443/tcp
I followed the official Microsoft documentations to make up my Dockerfile :
https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15#debian17
https://learn.microsoft.com/en-us/sql/connect/php/installation-tutorial-linux-mac?view=sql-server-ver15#installing-on-debian
And gathered some codes on different GitHub pages. How can I achieve a proper sqlsrv installation on my docker container?
So, multiple things were not configured in the right way in my Dockerfile, here's the patch :
FROM php:7.3-apache
# Env variables
ENV ACCEPT_EULA=y
# Install selected extensions and other stuff
RUN apt-get update \
&& apt-get -y --no-install-recommends install apt-utils libxml2-dev gnupg apt-transport-https \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
# Install git
RUN apt-get update \
&& apt-get -y install git \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
#Install ODBC Driver
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
&& curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& apt-get update
# Install sqlsrv
RUN apt-get update
RUN apt-get install -y wget
RUN wget http://ftp.br.debian.org/debian/pool/main/g/glibc/multiarch-support_2.24-11+deb9u4_amd64.deb && \
dpkg -i multiarch-support_2.24-11+deb9u4_amd64.deb
RUN apt-get -y install msodbcsql17 unixodbc-dev
RUN pecl install sqlsrv pdo_sqlsrv
# Install webapp extension
RUN apt-get update && \
apt-get install -y \
git libzip-dev libicu-dev\
&& docker-php-ext-install zip
RUN docker-php-ext-install intl mysqli pdo pdo_mysql
RUN a2enmod rewrite
COPY scripts/php.ini /usr/local/etc/php
COPY www /var/www/html/
EXPOSE 80/tcp
EXPOSE 443/tcp
In fact I had to install multiarch-support for a reason that I still ignore despite it being a required package (if it's one ?). Then, I had to install the ODBC Drivers which I completely forgot in the first place.
From now everything seems to be working fine
Related
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" ]
I have a laravel/php docker image that I updated to PHP 8.1 - I am now trying to go back to our project version 7.3 and won't work.
here's my YAML
###############################################################################
# Generated on forwardforce.io #
###############################################################################
version: "3.1"
services:
postgres:
image: postgres:11.1-alpine
container_name: mtn-postgres
working_dir: /application
volumes:
- db:/var/lib/postgresql/data
- .:/application
ports:
- 5001:5432
environment:
- POSTGRES_USER=root
- POSTGRES_PASSWORD=root
- POSTGRES_DB=forge
webserver:
image: nginx:alpine
container_name: mtn-webserver
working_dir: /application
volumes:
- .:/application
- ./phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "8091:80"
tty: true
php-fpm:
build: phpdocker/php-fpm
container_name: mtn-php-fpm
working_dir: /application
environment:
XDEBUG_CONFIG: "remote_host=docker.for.mac.host.internal"
PHP_IDE_CONFIG: "serverName=MTN-Docker"
image: php:7.2-alpine
volumes:
- .:/application
- ./phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/7.2/fpm/conf.d/99-overrides.ini
volumes:
db:
and here's my Dockerfile
FROM php:7.4-fpm-alpine
WORKDIR "/application"
# Fix debconf warnings upon build
ARG DEBIAN_FRONTEND=noninteractive
# Install git
RUN apt-get update \
&& apt-get -y install libpng-dev \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
# Install selected extensions and other stuff
RUN apt-get update \
&& apt-get -y --no-install-recommends install php7.2-pgsql php7.2-gd php-xdebug php-ssh2 \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
# Install git
RUN apt-get update \
&& apt-get -y install git \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
# Install php-imagick
RUN apt-get update \
&& apt-get -y install php-imagick \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
# Install Node.js, Yarn and required dependencies
RUN apt-get update \
&& apt-get install -y curl gnupg build-essential \
&& curl --silent --location https://deb.nodesource.com/setup_10.x | bash - \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get remove -y --purge cmdtest \
&& apt-get update \
&& apt-get install -y nodejs yarn \
# remove useless files from the current layer
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/lib/apt/lists.d/* \
&& apt-get autoremove \
&& apt-get clean \
&& apt-get autoclean
RUN npm install -g cordova ionic
RUN npm i -D -E -g #angular/cli
I have deleted docker cache & containers and ran:
docker-compose up -d --force-recreate --build
But I do see "59bf1c3509f3 Already exists " in the build while it's running. And after it's finished I have the latest version of PHP 8.13
So could it be a different cache somewhere else I am not clearing? Or how can I force install of PHP 7.2 o 7.3
apt is the package manager for Debian based distribution. Use apk to manage software packages on Alpine Linux. See How to use this image.
I can't build any image with PHP-Memcached extension. All they give me an error messages and how many times I try it's not helpful. I can't even find any PHP Dockerfile which include memcached and it's work. Even the main page of PHP docker page have Dockerfile with PHP Memcached solution and it's also not working.
FROM php:5.6-cli
RUN apt-get update && apt-get install -y libmemcached-dev zlib1g-dev \
&& pecl install memcached-2.2.0 \
&& docker-php-ext-enable memcached
Here is my last try code
FROM php:7.4-fpm
ADD php.ini /usr/local/etc/php/conf.d/php.ini
RUN docker-php-ext-install pdo pdo_mysql
# for mysqli if you want
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN printf "deb http://archive.debian.org/debian/ jessie main\ndeb-src http://archive.debian.org/debian/ jessie main\ndeb http://security.debian.org jessie/updates main\ndeb-src http://security.debian.org jessie/updates main" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y libz-dev libmemcached-dev && \
pecl install memcached && \
docker-php-ext-enable memcached
Who knows about this something? Thanks, advice
Looks like I found the solution on my problem at last and it's connected with /etc/apt/source.list
deb http://ftp.us.debian.org/debian buster main
deb http://ftp.us.debian.org/debian buster-updates main
And then just add this COPY ./sources.list /etc/apt/sourcee.list line in your Dockerfile and it will work
FROM php:7.2-fpm
COPY ./sources.list /etc/apt/sourcee.list
I have separated memcached and phm-memcached. The first one is a container, and second is installed on Dockerfile for PHP.
My docker-compose file :
version: '3'
services:
# PHP
php:
build:
context: docker/php7-fpm
volumes:
// etc...
memcached:
image: memcached:latest
hostname: memcached
networks:
- stack
And in my Dockerfile for PHP:
FROM php:7-4-fpm
// install dependencies...
# php-memcached
RUN set -ex \
&& rm -rf /var/lib/apt/lists/* \
&& MEMCACHED="`mktemp -d`" \
&& curl -skL https://github.com/php-memcached-dev/php-memcached/archive/master.tar.gz | tar zxf - --strip-components 1 -C $MEMCACHED \
&& docker-php-ext-configure $MEMCACHED \
&& docker-php-ext-install $MEMCACHED \
&& rm -rf $MEMCACHED
And with this, in my symfony application, i can store data in memcached.
I am trying to setup an existing project with Docker. The project is in codeigniter and uses memcached as the driver to set the session.
I created a Docker environment with php:7.1.8-apache and installed all the neccesary packages.
I am now getting this error on the page
Warning Message: session_start(): Failed to read session data: user (path: localhost:11211:128)
I searched this on the internet a lot and tried out many things but nothing works.
I have a file in application/libraries/Session/drivers/Session_memcached_driver.php
This is the the piece of code from where the error is generating but i am not sure what exactly it is.
public function read($session_id)
{
if (isset($this->_memcached) && $this->_get_lock($session_id))
{
// Needed by write() to detect session_regenerate_id() calls
$this->_session_id = $session_id;
$session_data = (string) $this->_memcached->get($this->_key_prefix.$session_id);
$this->_fingerprint = md5($session_data);
return $session_data;
}
return $this->_fail();
}
Here are my Docker Configurations:
FROM php:7.1.8-apache
# AUTHOR
MAINTAINER Development
# INSTALLING PACKAGES
RUN apt-get update && apt-get install -y \
git \
pkg-config \
build-essential \
libmemcached-dev \
libmemcached-tools \
libicu-dev \
libmcrypt-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
libfreetype6 \
libfontconfig \
libxml2-dev \
vim \
nano \
mysql-client \
libldap2-dev \
wget
RUN apt-get clean
# Extension PHP
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-install intl
RUN docker-php-ext-install mbstring
RUN docker-php-ext-install bcmath
RUN docker-php-ext-install mcrypt
RUN docker-php-ext-install zip
RUN docker-php-ext-install exif
RUN docker-php-ext-install soap
RUN docker-php-ext-install opcache
RUN docker-php-ext-install iconv
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install gd
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
# APCu
RUN pecl channel-update pecl.php.net
RUN pecl install apcu
RUN echo "extension=apcu.so" > /usr/local/etc/php/conf.d/apcu.ini
# Enable PHP 7
RUN a2enmod rewrite && a2enmod headers && a2enmod expires
RUN a2enmod php7
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
# SETUP VIRTUAL HOST
COPY .docker/sites-available/default-vhost.conf /etc/apache2/sites-available/default-vhost.conf
COPY .docker/sites-available/my-vhost.conf /etc/apache2/sites-available/my-vhost.conf
RUN a2dissite 000-default.conf
RUN a2ensite default-vhost.conf
RUN a2ensite my-vhost.conf
# Composer
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer
# Memcached
RUN apt-get update
RUN apt-get install -y pkg-config build-essential libmemcached-dev
RUN git clone https://github.com/php-memcached-dev/php-memcached.git
RUN cd php-memcached && git checkout php7 && phpize && ./configure --disable-memcached-sasl && make && make install
RUN echo 'extension = memcached.so' > /usr/local/etc/php/conf.d/memcached.ini
# ALIASES
RUN echo "alias ll='ls -l'" >> /root/.bashrc
RUN echo "alias la='ls -l'" >> /root/.bashrc
# COPY THE WORKING DIRECTORY
COPY . /var/www/myproject
# MANAGE DIRECTORY PERMISSIONS
RUN chown -R www-data:www-data /var/www/myproject
# SERVER RESTART
RUN service apache2 restart
And this is docker-compose.yml settings
version: '3'
services:
app:
build:
context: .
dockerfile: .docker/Dockerfile
container_name: gaz-container
image: gaz-docker
ports:
- "80:80"
volumes:
- .:/var/www/gaz
links:
- memcached:memcached
- mysql:mysql
memcached:
image: memcached
ports:
- "11211:11211"
mysql:
container_name: mysql
image: mysql:5.6
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=password
Can anyone please direct me what could be the issue here?
OMG.
After doing lot of searching i finally managed to get this working.
Thanks to dukebody. This post helped me to get hints about what i was doing wrong.
https://stackoverflow.com/a/27657937/4342075
The thing is i am actually creating multiple docker containers as you can see in the question in docker-compose.yml file. One of which is memcached. And i was trying to use memcached in the main container which is app.
What i was doing wrong is, i was using localhost:11211 to access memcached.
I just changed
$config['sess_save_path'] = 'localhost:11211:128'
To
$config['sess_save_path'] = 'memcached:11211';
And guess what it worked!!!
I have been trying to install memcached in my php-5.6 container, however I am unable to get it working, as i don't see memcached extension in phpinfo() and plus for some reason it's complaining about that it can't find the memcache.so in the code.
there is my docker-file for php build
FROM php:5.6-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
&& docker-php-ext-install -j$(nproc) iconv mcrypt \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
RUN docker-php-ext-install mysqli mbstring pdo_mysql
# Download and Installing php libraries
RUN apt-get install -y memcached
RUN apt-get -y install php-pear php5-dev php5-memcached geoip-bin geoip-database libgeoip-dev php5-geoip
# Download and Installing php libraries
RUN pecl install geoip
# Download and Installing git and vim
RUN apt-get -y install git gcc
RUN pwd
RUN git clone --depth=1 git://github.com/phalcon/cphalcon.git
WORKDIR /var/www/html/cphalcon/build
RUN ./install
EXPOSE 9000
EXPOSE 11211
COPY ./php-fpm.d/www.conf /etc/php-fpm.d/www.conf
COPY ./php.ini /usr/local/etc/php/php.ini
COPY ./php-fpm.conf /etc/php-fpm.conf
COPY ./phalcon.ini /usr/local/etc/php/conf.d/phalcon.ini
COPY ./geoip.ini /usr/local/etc/php/conf.d/geoip.ini
COPY ./memcached.ini /usr/local/etc/php/conf.d/memcached.ini
And my docker compose file is
nginx:
build: ./.config/etc/nginx/
ports:
- 7000:80
links:
- php
- memcached:memcached
volumes_from:
- app
memcached:
image: memcached:latest
php:
build: ./.config/etc/php/
expose:
- 9000
links:
- mysql
- memcached:memcached
volumes_from:
- app
app:
image: php:5.6-fpm
#image: php:7.0-fpm
volumes:
- ./:/var/www/vhosts/example.com/httpdocs
command: "true"
The error i am getting on the code is
[36;1mnginx_1 | [0mPHP message: PHP Fatal error: Class 'memcache' not found in Unknown on line 0" while reading response header from upstream, client: 192.168.99.1, server: www.example.dev, request: "GET /search HTTP/1.1", upstream: "fastcgi://172.17.0.5:9000", host: "192.168.99.100:7000"
What is going wrong here?
The php images ship a custom-compiled PHP, but are based on a Debian Jessie image (and use Debian's repositories). With apt-get install php5-memcached, you install the memcached extension for the distribution's PHP package (which is installed along the way).
You need to install the memcached extension via PECL (and its build dependencies via APT):
RUN apt-get update
RUN apt-get install -y libz-dev libmemcached-dev && \
pecl install memcached && \
docker-php-ext-enable memcached