php mcrypt 在 docker 容器上启用后无法正常工作

Posted

技术标签:

【中文标题】php mcrypt 在 docker 容器上启用后无法正常工作【英文标题】:php mcrypt not working after enabling it on docker container 【发布时间】:2017-06-04 05:54:01 【问题描述】:

我正在尝试通过 docker 在 AWS Elastic Beanstalk 上使用 Laravel 安装 nginx+php-fpm。我已经能够成功启动并运行它,但是 Laravel 给了我一个错误:Mcrypt PHP extension required.

我已经能够通过容器中的命令 docker-php-ext-install 安装 mcrypt,但是在安装它并验证它已安装并启用(通过 php-fpm -m |grep mcrypt)之后,我仍然收到 Mcrypt PHP extension required. 错误。每当我尝试重新启动 php-fpm 进程或重新启动容器时,elastic beanstalk 都会启动一个全新的容器,我必须重新安装 mcrypt(基本上是清除板岩)。

我正在尝试为这一切制作一个自动化脚本,有没有简单的方法可以做到这一点?

这是我的 Dockerrun.aws.json 文件:


  "AWSEBDockerrunVersion": 2,
  "volumes": [
    
      "name": "php-app",
      "host": 
        "sourcePath": "/var/app/current/src"
      
    ,
    
      "name": "nginx-conf",
      "host": 
        "sourcePath": "/var/app/current/nginx/conf.d"
      
    
  ],
  "containerDefinitions": [
    
      "name": "php-app",
      "image": "php:5-fpm",
      "essential": true,
      "memory": 128,
      "mountPoints": [
        
          "sourceVolume": "php-app",
          "containerPath": "/var/www/html"
        
      ]
    ,
    
      "name": "nginx-proxy",
      "image": "nginx",
      "essential": true,
      "memory": 128,
      "portMappings": [
        
          "hostPort": 80,
          "containerPort": 80
        
      ],
      "links": [
        "php-app"
      ],
      "mountPoints": [
        
          "sourceVolume": "php-app",
          "containerPath": "/var/www/html"
        ,
        
          "sourceVolume": "awseb-logs-nginx-proxy",
          "containerPath": "/var/log/nginx"
        ,
        
          "sourceVolume": "nginx-conf",
          "containerPath": "/etc/nginx/conf.d",
          "readOnly": true
        
      ]
    
  ]

以及我在容器旋转后运行的后置脚本(放置在 .ebextensions 中):

commands:
  create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_delayed_job.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      DOCKER_ID=`docker ps -q --filter "ancestor=php:5-fpm"`
      docker exec -i $DOCKER_ID bash -c "apt-get update"
      docker exec -i $DOCKER_ID bash -c "apt-get install -y libmcrypt-dev"
      docker exec -i $DOCKER_ID bash -c "docker-php-ext-install mcrypt pdo pdo_mysql"

【问题讨论】:

您没有提及您要安装的 Laravel 版本。 mcrypt PHP 扩展被认为是废弃软件,不应使用,openssl_ 做得更好。您最好的解决方案是安装不依赖于mcrypt 的较新版本的 Laravel(我不确定哪个版本的 Laravel 依赖于mcrypt,如果有的话)。如果您不需要 mcrypt,那么您的问题就会消失,并且您似乎可以通过使用更新版本的 Laravel(例如 5.3)来解决它,如果这对您来说是可能的话。 我使用的是 Laravel 4.2 最好不要使用mcrypt,它已经废弃了近十年了。因此,它已被弃用,并将在 PHP 7.2 中从核心中删除并进入 PECL。它不支持标准 PKCS#7 (née PKCS#5) 填充,仅支持甚至不能用于二进制数据的非标准空填充。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。请考虑使用 defuse 或 RNCryptor,它们提供了完整的解决方案,正在维护并且是正确的。 【参考方案1】:

您必须创建自己的映像并将其公开托管在 hub.docker.com 上。 Docker 容器在主命令停止时退出,因此容器启动后无法重新启动 php-fpm 进程。

例如:

FROM php:5-fpm

RUN apt-get update
RUN apt-get install -y php5-mcrypt

然后将此图像推送到 docker hub。

你也可以设置一个automated build,这样 docker hub 就会为你构建这个镜像。

然后像这样更新您的构建定义图像:

"name": "php-app",
"image": "jamesnine/php:5-fpm",
"essential": true,

【讨论】:

我就是这么想的。谢谢。 不客气。请注意,我只记得您必须在apt-get install 处添加-y 标志,否则构建失败。 这可能有点迂腐,但对于初学者来说,正确使用术语可能很重要:您不会在 hub.docker.com 上托管容器,而是在 图像。您根据图像启动一个新容器。目前该容器需要工作(这并不理想),所以这个答案展示了如何制作一个好的图像,这将产生一个完整的容器。快速输入,所以很可能我也搞砸了一些术语,但是区别图像 容器在这里可能很重要!

以上是关于php mcrypt 在 docker 容器上启用后无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 安装上启用 Mcrypt

如何在 xampp linux 上启用 mcrypt php 扩展

启用 Mcrypt 的 PHP 7.2 上的 Laravel 4.2 仍然显示“需要 Mcrypt PHP 扩展”。在浏览器上

如何在 Mac OSX 10.9 上的 php 中启用 mcrypt?

如何在 php docker 容器上安装/启用 pdo-odbc 驱动程序?

使用 mcrypt 启用或编译 PHP?