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 容器上启用后无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
如何在 xampp linux 上启用 mcrypt php 扩展
启用 Mcrypt 的 PHP 7.2 上的 Laravel 4.2 仍然显示“需要 Mcrypt PHP 扩展”。在浏览器上
如何在 Mac OSX 10.9 上的 php 中启用 mcrypt?