Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run `docker-php-ext-install` FROM container other than php

I have a problem with Docker (docker-compose). I want to install some PHP extensions using docker-compose.yml, but I am unable to do this, because my .yml has FROM ubuntu and not FROM php. Is there any way I can achieve or access the docker-php-ext-install?

Dockerfile

FROM ubuntu:16.04

RUN apt -yqq update
RUN apt -yqq install nginx iputils-ping
RUN docker-php-ext-install pdo pdo_mysql mbstring

WORKDIR /usr/local/src

COPY docker/nginx/dev.conf /etc/nginx/conf.d/dev.conf
COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf

CMD ["nginx"]

docker-compose.yml

version: "2"
services:
  mariadb:
    image: mariadb
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=1
      - MYSQL_ROOT_PASSWORD=
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - "8080:80"
    restart: always
    environment:
      - PMA_HOST=mariadb
    links:
      - mariadb
  php:
    image: php:7.1.1-fpm
    ports:
      - "9000:9000"
    volumes:
      - .:/dogopic
    links:
      - mariadb
  nginx:
    build: .
    ports:
      - "8000:80"
    volumes:
      - .:/dogopic
    links:
      - php

Console output (fragment)

Step 5/9 : RUN docker-php-ext-install pdo pdo_mysql mbstring
 ---> Running in 445f8c82883d
/bin/sh: 1: docker-php-ext-install: not found
like image 871
Albert221 Avatar asked Feb 19 '17 20:02

Albert221


2 Answers

New solution

You need to create new Dockerfile for specific service, in this case php:

php/Dockerfile

FROM php:7.1.1-fpm
RUN apt -yqq update
RUN apt -yqq install libxml2-dev
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install xml

And then link to it in your docker-compose.yml file, just like this:

services:
  // other services
  php:
    build: ./php
    ports:
      - "9000:9000"
    volumes:
      - .:/dogopic
    links:
      - mariadb

Please look at build parameter - it points to directory in which is that new Dockerfile located.

Old solution

I walked around the problem. I've figured out that I can still run this docker-php-ext-install script using following command:

docker-compose exec <your-php-container> docker-php-ext-install pdo pdo_mysql mbstring

And because of the convenience I've created this simple Batch file to simplify composing containers just to one command: ./docker.bat

@ECHO OFF

docker-compose build
docker-compose exec php docker-php-ext-install pdo pdo_mysql mbstring
docker-compose up
like image 87
Albert221 Avatar answered Oct 19 '22 16:10

Albert221


docker-php-ext-install is not some native docker functionality. If you read php docker hub page carefully, you will see, that it's just a script provided to make the installation process easy:

We provide the helper scripts docker-php-ext-configure, docker-php-ext-install, and docker-php-ext-enable to more easily install PHP extensions.

If your image is based on ubuntu, not php, you might find docker-php-ext-install, for example, on github.

But since your Dockerfile is FROM ubuntu, I advise you to install php with apt-get:

FROM ubuntu:16.04

RUN apt -yqq update
RUN apt -yqq install nginx iputils-ping
RUN apt-get install -y php php-fpm pdo-mysql php-mbstring

Do not forget to set up nginx to use php-fpm. To do so, I personally use a start.sh script, which starts php-fpm and nginx in the container:

php-fpm -D
nginx -g "daemon off;"

And in the Dockerfile I run the script. not nginx:

COPY start.sh /tmp/start.sh
CMD ["/tmp/start.sh"]
like image 35
Alex Karshin Avatar answered Oct 19 '22 15:10

Alex Karshin