web-dev-qa-db-fra.com

Exécutez `docker-php-ext-install` depuis un conteneur autre que php

J'ai un problème avec Docker (docker-compose). Je souhaite installer des extensions PHP utilisant docker-compose.yml, mais je ne suis pas en mesure de le faire, car mon .yml a FROM ubuntu et pas FROM php. Existe-t-il un moyen d'atteindre ou d'accéder à 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

Sortie console (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
15
Albert221

Nouvelle solution

Vous devez créer un nouveau Dockerfile pour un service spécifique, dans ce cas 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

Et puis lien vers lui dans votre docker-compose.yml fichier, comme ceci:

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

Veuillez regarder le paramètre build - il pointe vers le répertoire dans lequel se trouve ce nouveau Dockerfile.

Ancienne solution

J'ai contourné le problème. J'ai compris que je pouvais toujours exécuter ce docker-php-ext-install script utilisant la commande suivante:

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

Et en raison de la commodité, j'ai créé ce fichier batch simple pour simplifier la composition des conteneurs en une seule commande: ./docker.bat

@ECHO OFF

docker-compose build
docker-compose exec php docker-php-ext-install pdo pdo_mysql mbstring
docker-compose up
23
Albert221

docker-php-ext-install n'est pas une fonctionnalité native de docker. Si vous lisez attentivement php docker hub page, vous verrez que ce n'est qu'un script fourni pour faciliter le processus d'installation:

Nous fournissons les scripts d'aide docker-php-ext-configure, docker-php-ext-install, et docker-php-ext-enable pour installer plus facilement PHP.

Si votre image est basée sur ubuntu, et non php, vous pourriez trouver docker-php-ext-install, par exemple, sur github .

Mais puisque votre Dockerfile est FROM ubuntu, Je vous conseille d'installer php avec 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

N'oubliez pas de configurer nginx pour utiliser php-fpm. Pour ce faire, j'utilise personnellement un start.sh script, qui démarre php-fpm et nginx dans le conteneur:

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

Et dans le Dockerfile je lance le script. pas nginx:

COPY start.sh /tmp/start.sh
CMD ["/tmp/start.sh"]
9
Alex Karshin