【问题标题】:PHP Docker Vendor Autoload.php not found未找到 PHP Docker 供应商 Autoload.php
【发布时间】:2019-10-08 09:04:04
【问题描述】:

我正在尝试为 PHP 服务设置 Dockerfile。 PHP 脚本是在 docker 容器中使用 Nginx 服务器提供的,但它给了我 vendor/autoload.php not found 错误。

我已尝试多次更改 Dockerfile,但 vendor/autoload.php 错误仍然存​​在。

这是 Dockerfile

FROM composer as builder

RUN mkdir -p /usr/app/php-services
WORKDIR /usr/app/php-services
#copy composer file
COPY composer.json .


RUN composer install

#copy php-scripts to /usr/app/php-services
COPY . .


FROM nginx:alpine

COPY --from=builder /usr/app/php-services /usr/app/php-services
COPY ./phpdocker/nginx/nginx.conf /etc/nginx/conf.d/default.conf

#check if vendor has autoload file and it exists!!!
RUN ls /usr/app/php-services/vendor

EXPOSE 8000


脚本应该可以正常运行,但每当我运行 docker logs 时,它都会显示。

这是 nginx.conf 文件

server {
listen 8000;


access_log /var/log/nginx/application.access.log;


root /usr/app/php-services;

location / {
    try_files $uri /index.php$is_args$args;
}

location ~ \.php$ {
    fastcgi_pass php-fpm:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    include fastcgi_params;
}
}

我几乎尝试了所有方法,但实际上不知道为什么会发生这种情况。我在这里做错了什么?我的 nginx.conf 文件有问题吗?

【问题讨论】:

    标签: php docker nginx composer-php dockerfile


    【解决方案1】:

    抱歉上次回复,我误解了这个问题。

    但是,我能够构建一个类似的容器,但无法重现该错误。您添加的 php 脚本可能不在本文中。通过使用 Dockerfile + nginx.conf 的修改副本,我能够获得类似的容器构建。我还在 Docker 文件中添加了一些用于故障排除的调试,并创建了一个启动/构建脚本。

    我编辑了 Dockerfile 以获得以下内容。如果您需要,这将添加设置 755 权限,列出一些有问题的目录和您的日志。如果需要,将该输出发布到 cmets。

    FROM composer as builder
    RUN mkdir -p /usr/app/php-services 
    WORKDIR /usr/app/php-services
    COPY composer.json . 
    RUN composer install
    #copy php-scripts to /usr/app/php-services
    COPY . .
    COPY php.ini /usr/app/php-services
    FROM nginx:alpine
    COPY --from=builder /usr/app/php-services /usr/app/php-services
    COPY nginx.conf /etc/nginx/conf.d/default.conf 
    COPY php.ini .
    #check if vendor has autoload file and it exists!!!
    RUN chmod 755 -R /usr/app/php-services;ls -lrt /etc/nginx/ /var/log /usr/app/php-services/  /usr/app/php-services/vendor /usr/app/php-services/vendor/twitter.php;/var/log/nginx/application_php_errors.log | tee -a shellcheck.log
        #CMD ["ls -la /usr/app/php-services/vendor"]
    EXPOSE 8000
    

    然后编辑 nginx.conf 以具有以下内容。添加了解析器信息(不确定这是否适用于您),包括上游属性、try_files,包括用于 fastcgi 的 sn-ps。

        server {
    listen 8000;
    resolver 127.0.0.11;
    set $upstream php-fpm:9000;
    access_log /var/log/nginx/application.access.log;
    root /usr/app/php-services;
    location / {
    try_files $uri /index.php$is_args$args;
    }
    location ~ \.php$ {
    try_files $uri =404;
    include snippets/fastcgi-php.conf;
    fastcgi_pass  $upstream;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    include fastcgi_params;
    }
    }
    

    然后创建了一个 shell 脚本来启动构建并报告一些调试信息。将此添加到 docker 主机上的 Dockerfile 旁边,使用 chmod +x run-container.sh 使其可执行,然后使用 ./run-container.sh $PORTNUM 运行它。即./run-container.sh 8000

        #!/bin/bash
    docker build . -t php-services:v3 
    docker run -d -p $1:8000 php-services:v3
    CONTAINER=`docker ps -a | head -2 | tail -1| awk '{print $1}'`
    echo "Your container is: $CONTAINER"
    docker ps -a | head -2 | tail -1| awk '{print $1}'
    docker cp $CONTAINER:/var/log/nginx/ .
    docker cp $CONTAINER:/shellcheck.log .
    docker cp $CONTAINER:/etc/nginx/fastcgi.conf .
    docker ps -a  | grep $CONTAINER
    docker logs  $CONTAINER
    

    如果这对你有用,请告诉我,由于某种原因,你期待一个 twitter.php,而我没有,也不是问题。这是您从该文件夹复制到容器中的内容吗?

    【讨论】:

    • 嗨,我添加了 ENTRYPOINT ["/usr/app/php-services/vendor"] 但它说权限被拒绝。如果我没有错误的入口点用于执行任何脚本但“/usr/app/php-services/vendor”是一个目录,这将如何工作?
    • 嘿,你是对的,我看到了一些问题。我想得很快,但没有自己尝试。我现在要构建它,有一个基本的 hello world 与基本的 php.ini 一起工作,因为您没有附加运行确切的容器。 [root@docker 052319]# docker ps -a | grep 3f 3f5f3beca266 php-services:v3 "nginx -g 'daemon of ..." 9 分钟前 Up 9 分钟 80/tcp, 0.0.0.0:8000->8000/tcp eloquent_stonebraker [root@docker 052319]#
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2018-11-10
    • 2015-08-31
    相关资源
    最近更新 更多