在Docker容器中安装除PHP之外的扩展,运行`docker-php-ext-install`命令。

21

我对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"]

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

控制台输出(片段)

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

看 https://dev59.com/1FoU5IYBdhLWcg3wYWIM - gile
我之前看过它,但我的问题不在于扩展依赖项,而在于 php 容器中存在 docker-php-ext-install 这个东西。 - Albert221
2个回答

31

新解决方案

您需要为特定服务创建新的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
实际上,在 docker-compose 上这样做有点像反模式。 - Kevin Kopf
每个RUN命令都会向Docker镜像堆栈添加一个层,因此尽可能地尝试合并运行命令。相当确定docker-php-ext-install脚本每次运行时都会构建和清理。因此,如果您可以在单个调用中传递pdo_mysql和xml,则速度会更快,我相信。 - David

17

docker-php-ext-install并不是docker原生功能。如果你仔细阅读PHP Docker Hub页面,你会发现它只是提供了一个脚本以使安装过程更加简单:

我们提供了helper scripts 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"]

我将您的回答标记为解决此特定问题的方案,但是您无法(或者我不知道如何)使用apt-get获取特定的PHP版本,因此我使用了其他方法。感谢! - Albert221
我自己是 Fedora 用户,但据我所知,你可以执行 apt-get install <package name>=<version> 或者至少执行 apt-get install -y php5.6。如果你在谷歌上搜索一下,解决方案肯定会呈现出来。 - Kevin Kopf
我该如何在我的Docker文件中添加辅助脚本docker-php-ext-configure和docker-php-ext-install? - flik
@flik 复制粘贴。从原始项目到你的项目。 - Kevin Kopf
我从 https://github.com/flik/php/tree/master/7.0/stretch/cli 复制了脚本,并将其粘贴到我的 Docker 文件中,但在执行时出现了一些依赖项错误。 - flik
@flik请考虑开一个相关的问题。这个问题已经快两年了,在评论中提供帮助没有任何意义。开一个新的问题,您至少可以在问题的细节上提供更多的细节,格式化您的代码并解释细节,而这在评论中是不可能的。 - Kevin Kopf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接