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

php mcrypt not working after enabling it on docker container

我正在尝试通过 docker 在 AWS Elastic Beanstalk 上使用 Laravel 安装 nginx+php-fpm。我已经能够成功地启动并 运行ning,但是 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
        }
      ]
    }
  ]
}

和我的 post-脚本,即容器旋转后的 运行(放置在 .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"

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

例如:

FROM php:5-fpm

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

然后将此图像推送到 docker 集线器。

您还可以设置 automated build,这样 docker 中心会为您构建此映像。

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

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