在某些泊坞主机

时间:2017-10-26 09:31:04

标签: php docker nginx laravel-5

我尝试为laravel 5.5应用程序和nginx创建dockerfile。我使用类似于以下dockerfile:

FROM richarvey/nginx-php-fpm:1.3.7

# we cannot directly work in /var/www/html beaouse in richarvey/nginx-php-fpm is VOLUME directive so if we create
# files in this directory - they will 'disappear' - so we use /tmp dir. 
WORKDIR /tmp/project

# due to docker cache
COPY ./composer.json .
RUN composer install --no-scripts --no-autoloader

ADD . .
RUN composer dump-autoload --optimize
RUN php artisan key:generate

ADD ./config/server-nginx.conf /etc/nginx/sites-available/default.conf

WORKDIR /var/www/html

CMD if [ -f index.php ]; then \
        rm index.php &&\            
        mv /tmp/project/* /var/www/html/ && \
        mv /tmp/project/.* /var/www/html/ | : &&\
        php artisan config:clear &&\
        php artisan cache:clear ; \
    fi &&\
    echo "Try connect to db and set up schema..." && \
    php artisan migrate --seed --force &&\
    /start.sh

我的项目/ config / server-nginx.conf看起来像这样:

server {
    listen   80; ## listen for ipv4; this line is default and implied
    listen   [::]:80 default ipv6only=on; ## listen for ipv6


    root /var/www/html/public;
    index index.php index.html index.htm;

    server_name _;

    # Add stdout logging
    error_log /dev/stdout info;
    access_log /dev/stdout;


    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        include fastcgi_params; 

        ...            
    }

}

问题是我的macOs和ubuntu一切正常,但是我的客户端使用Docker Claud和DigitalOcean在容器运行后有以下问题(所以构建步骤很好,但是在容器运行之后它被docker杀死 - 所以在CMD dockerfile part):

Fatal error: Uncaught Error: Class 'Illuminate\Foundation\Application' not found in /var/www/html/vendor/autoload.php:14
Stack trace:
#0 /var/www/html/artisan(18): require()

1 个答案:

答案 0 :(得分:1)

所以当我们在某个目录(使用php项目)中使用composer ...然后我们移动/重命名该目录(mv ... bash时,有时会出现问题(! - 在某些主机上 - 为什么?) CMD dockerfile部分中的命令) - 所以如果我们这样做(在某些主机中),则文件autoload.php(由作曲家生成)will have not proper paths to php classes

但是在这种情况下我们使用dir tmp/project(并在里面调用composer)然后将其移动到/ var / www / html,因为我们不能直接在/ var / www / html中工作,因为在richarvey/nginx-php-fpm中是VOLUME指令,所以如果我们在这个目录中创建文件 - 它们将会消失' - 所以我们使用/ tmp dir。

如果我们希望通过ln /var/www/html/tmp/project进行关联并使用chown -R nginx:nginx /tmp/project,那么还会出现问题,因为它会进入无限循环而永远不会结束...... :((为什么?)。

是否将project/config/server-nginx.conf中的根目录更改为:

root /var/www/app/public;

然后将dockerfile中的workdir更改为:

WORKDIR /var/www/app

在dockerfile CMD部分添加

chown -R nginx:nginx /var/www/app/storage

仅将laravel的写入权限提供给存储目录(其中laravel保存工作数据)(如果我们使用chown -R nginx:nginx /var/www/app/storage它将更新'结束'(进入无限循环):()

通过这种方式,我们避免移动composer已编译的目录,所有主机都能解决所有问题:)