从php以外的容器运行`docker-php-ext-install`

时间:2017-02-19 20:53:31

标签: docker docker-compose dockerfile php-extension

我遇到Docker(docker-compose)的问题。我想使用docker-compose.yml安装一些PHP扩展,但我无法执行此操作,因为我的.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

2 个答案:

答案 0 :(得分:23)

新解决方案

经过4个月的深入查看文档后,花了大量的时间花在研究陌生人的Dockerfiles之后,经过那么多不眠之夜......最后正确答案

您所要做的就是为特定服务创建新的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

答案 1 :(得分:8)

docker-php-ext-install不是一些原生的docker功能。如果您仔细阅读php docker hub页面,您会看到,它只是为简化安装过程而提供的脚本:

  

我们提供帮助脚本docker-php-ext-configuredocker-php-ext-installdocker-php-ext-enable,以便更轻松地安装PHP扩展。

如果您的图片基于ubuntu,而不是php,则可能会在github上找到docker-php-ext-install

但由于您的DockerfileFROM ubuntu,我建议您使用apt-get安装php:

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-fpmnginx

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

Dockerfile我运行脚本。不是nginx

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