我尝试为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()
答案 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
已编译的目录,所有主机都能解决所有问题:)