Запустите `docker-php-ext-install` из контейнера, отличного от php

У меня проблема с Docker (docker-compose). Я хочу установить некоторые расширения PHP, используя docker-compose.yml, но я не могу этого сделать, потому что мой .yml имеет FROM ubuntu, а не FROM php. Есть ли способ, которым я могу достичь или получить доступ к 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"]

докер-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

Консольный выход (фрагмент)

Step 5/9 : RUN docker-php-ext-install pdo pdo_mysql mbstring
 ---> Running in 445f8c82883d
/bin/sh: 1: docker-php-ext-install: not found

Ответ 1

Новое решение

Вам нужно создать новый Dockerfile для конкретной службы, в данном случае 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

А затем ссылка на него в вашем файле docker-compose.yml, вот так:

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

Пожалуйста, посмотрите на параметр build - он указывает на каталог, в котором находится этот новый Dockerfile.

Старое решение

Я обошел проблему. Я понял, что все еще могу запустить этот скрипт docker-php-ext-install, используя следующую команду:

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

И из-за удобства я создал этот простой пакетный файл, чтобы упростить создание контейнеров только одной командой: ./docker.bat

@ECHO OFF

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

Ответ 2

docker-php-ext-install не является некоторой нативной функциональностью docker. Если вы внимательно прочитаете страницу php docker hub, то увидите, что это всего лишь сценарий, облегчающий процесс установки:

Мы предоставляем вспомогательные сценарии docker-php-ext-configure, docker-php-ext-install и docker-php-ext-enable для упрощения установки расширений PHP.

Если ваш образ основан на ubuntu, а не на php, вы можете найти docker-php-ext-install, например, на github.

Но так как ваш Dockerfile - FROM ubuntu, я советую вам установить php с помощью 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

Не забудьте настроить nginx для использования php-fpm. Для этого я лично использую скрипт start.sh, который запускает php-fpm и nginx в контейнере:

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

И в Dockerfile я запускаю скрипт. не nginx:

COPY start.sh /tmp/start.sh
CMD ["/tmp/start.sh"]

Ответ 3

У меня та же проблема. Я получаю сообщение:

docker-php-ext-configure: not found

У меня есть этот файл в моем контейнере php.

Не знаю, почему это не работает!