【问题标题】:Run `docker-php-ext-install` FROM container other than php从 php 以外的容器运行 docker-php-ext-install
【发布时间】:2017-07-09 00:49:52
【问题描述】:

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

【问题讨论】:

标签: docker docker-compose dockerfile php-extension


【解决方案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

【讨论】:

  • 实际上,在docker-compose 上执行此操作听起来像是一种反模式。
  • 每个 RUN 命令都会向 Docker 映像堆栈添加一个层,因此请尽可能尝试组合运行命令。很确定 docker-php-ext-install 脚本每次运行时都会构建和清理。因此,如果您可以在一次调用中传递 pdo_mysql 和 xml,我相信这会快很多。
【解决方案2】:

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

【讨论】:

  • 我将您的答案标记为对这个特定问题的解决方案,但您不能(或者我不知道如何)使用 apt-get 获得特定的 PHP 版本,因此我使用了其他东西.不过谢谢!
  • 我自己是 Fedora 用户,但据我所知,您可以使用 apt-get install &lt;package name&gt;=&lt;version&gt; 或至少 apt-get install -y php5.6。如果你用谷歌搜索它,解决方案肯定会出现。
  • 如何在我的 docker 文件中添加帮助脚本 docker-php-ext-configure、docker-php-ext-install ?
  • @flik 复制粘贴。从原始项目到您的项目。
  • 我从 github.com/flik/php/tree/master/7.0/stretch/cli 复制脚本并粘贴到我的 docker 文件中,但在执行某些依赖项时出现错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2021-09-06
  • 2021-05-06
相关资源
最近更新 更多