php - Nginx 在 Windows 上使用 Docker 指向错误的目录

标签 php laravel docker nginx

我正在使用 Docker 设置 Laravel 应用程序,使用我在此处找到的 Docker 镜像配置:https://blog.pusher.com/docker-for-development-laravel-php/

现在,这在我的 Ubuntu 机器 (16.04) 上运行良好,但在 Window (10 Pro) 上我得到一个奇怪的错误。它首先提示找不到 composer.json文件。然后,对于我向 localhost:8000 提出的每个请求,我收到以下错误:

15#15: *1 open() "/var/www/public404" failed (2: No such file or directory), client: 172.17.0.1, server: , request: "GET / HTTP/1.1", host: "localhost:8000"

我对此很陌生,但似乎 nginx 指向 /var/www/public404 - 我不知道“404”是如何到达那里的。我感觉它与 try_files $uri = 404; 行有关。在 site.conf文件,但是,我真的不知道它是如何工作的,我也不想破坏它......奇怪的是,它适用于 Ubuntu,但不适用于 Windows(或者这根本不奇怪?)。

我使用 docker build . -t my-image构建图像和docker run -p 8000:80 --name="my-container" my-image使用图像运行容器。

所有配置文件的 EOL 设置为换行。有人知道我该如何解决这个问题吗?

Dockerfile

FROM nginx:mainline-alpine
LABEL maintainer="John Doe <john@doe>"

COPY start.sh /start.sh
COPY nginx.conf /etc/nginx/nginx.conf
COPY supervisord.conf /etc/supervisord.conf
COPY site.conf /etc/nginx/sites-available/default.conf

RUN apk add --update \
php7 \
php7-fpm \
php7-pdo \
php7-pdo_mysql \
php7-mcrypt \
php7-mbstring \
php7-xml \
php7-openssl \
php7-json \
php7-phar \
php7-zip \
php7-dom \
php7-session \
php7-tokenizer \
php7-zlib && \
php7 -r "copy('http://getcomposer.org/installer', 'composer-setup.php');" && \
php7 composer-setup.php --install-dir=/usr/bin --filename=composer && \
php7 -r "unlink('composer-setup.php');" && \
ln -s /etc/php7/php.ini /etc/php7/conf.d/php.ini

RUN apk add --update \
bash \
openssh-client \
supervisor

RUN mkdir -p /etc/nginx && \
mkdir -p /etc/nginx/sites-available && \
mkdir -p /etc/nginx/sites-enabled && \
mkdir -p /run/nginx && \
ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf && \
mkdir -p /var/log/supervisor && \
rm -Rf /var/www/* && \
chmod 755 /start.sh

RUN sed -i -e "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g" \
-e "s/variables_order = \"GPCS\"/variables_order = \"EGPCS\"/g" \
/etc/php7/php.ini && \
sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" \
-e "s/;catch_workers_output\s*=\s*yes/catch_workers_output = yes/g" \
-e "s/user = nobody/user = nginx/g" \
-e "s/group = nobody/group = nginx/g" \
-e "s/;listen.mode = 0660/listen.mode = 0666/g" \
-e "s/;listen.owner = nobody/listen.owner = nginx/g" \
-e "s/;listen.group = nobody/listen.group = nginx/g" \
-e "s/listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm.sock/g" \
-e "s/^;clear_env = no$/clear_env = no/" \
/etc/php7/php-fpm.d/www.conf

EXPOSE 443 80
WORKDIR /var/www

CMD ["/start.sh"]

start.sh

#!/bin/bash

# ----------------------------------------------------------------------
# Create the .env file if it does not exist.
# ----------------------------------------------------------------------

if [[ ! -f "/var/www/.env" ]] && [[ -f "/var/www/.env.example" ]];
then
cp /var/www/.env.example /var/www/.env
fi

# ----------------------------------------------------------------------
# Run Composer
# ----------------------------------------------------------------------

if [[ ! -d "/var/www/vendor" ]];
then
cd /var/www
composer update
composer dump-autoload -o
fi

# ----------------------------------------------------------------------
# Start supervisord
# ----------------------------------------------------------------------

exec /usr/bin/supervisord -n -c /etc/supervisord.conf

site.conf

server {
listen 80;

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

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

location ~ /\. {
deny all;
}

location ~ \.php$ {
try_files $uri = 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;
include fastcgi_params;
}

nginx.conf

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log off;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/sites-enabled/*.conf;
}

supervisord.conf

[unix_http_server]
file=/dev/shm/supervisor.sock

[supervisord]
logfile=/tmp/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=warn
pidfile=/tmp/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
user=root

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///dev/shm/supervisor.sock

[program:php-fpm7]
command = /usr/sbin/php-fpm7 --nodaemonize --fpm-config /etc/php7/php-fpm.d/www.conf
autostart=true
autorestart=true
priority=5
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true
priority=10
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

最佳答案

如上面评论中提到的,我只是忘记在docker run命令中添加-v参数,像这样:

docker run -p 8000:80 -v $PWD/src:/var/www --name="my-container" my-image

... $PWD/srcsrc 目录的完整路径。

关于php - Nginx 在 Windows 上使用 Docker 指向错误的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50772597/

相关文章:

spring-boot - 有没有办法自动创建 Docker Image?

php - SimplePie fatal error : Call to a member function get_base() on a non-object (Line 176)

使用for循环的递增日期的php代码在更新条件下不起作用

php - 每次变量改变时调用函数

php - laravel 表单请求 = 如果按钮被点击

php - Laravel 使用 Eloquent 多对多关系

laravel - 如何根据空值对表进行排序?

docker - 在 docker-compose 中将 secomp 设置为不受限制

php - 从数据库中阻止 .htaccess 或 PHP 中的 IP 地址?

docker - Gitlab运行程序未执行作业Docker镜像