我一直在尝试设置将托管NGINX服务器的本地docker容器.首先,这是我的Dockerfile:
# Set nginx base image
FROM nginx
# File Author / Maintainer
MAINTAINER myuser "myemail@mydomain.com"
# Copy custom configuration file from the current directory
COPY nginx.conf /etc/nginx/nginx.conf
我确实使用docker build命令构建了这个文件,当我列出图像时,我可以在列表中看到该图像.
现在,我尝试运行此新创建的映像,导致出现错误:
my-MacBook-Pro:nginx-docker me$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myrepo nginx-latest 0d73419e8da9 12 minutes ago 182.8 MB
hello-world latest c54a2cc56cbb 13 days ago 1.848 kB
nginx latest 0d409d33b27e 6 weeks ago 182.8 MB
my-MacBook-Pro:nginx-docker me$docker run -it myrepo:nginx-latest
2016/07/15 07:07:35 [emerg] 1#1: open() "/etc/nginx/logs/access.log" failed (2: No such file or directory)
nginx: [emerg] open() "/etc/nginx/logs/access.log" failed (2: No such file or directory)
日志文件的路径在我的nginx.conf中配置,如下所示:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 8080;
server_name localhost;
root /Users/me/Projects/Sandbox/my-app;
#charset koi8-r;
access_log logs/host.access.log main;
#
# Wide-open CORS config for nginx
#
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
# /api will server your proxied API that is running on same machine different port
# or another machine. So you can protect your API endpoint not get hit by public directly
location /api {
proxy_pass http://localhost:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header Access-Control-Allow-Origin *;
proxy_set_header Access-Control-Allow-Origin $http_origin;
}
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# deny access to .htaccess files,if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
include servers/*;
}
现在,当我尝试运行此NGINX映像时,出现以下错误:
2016/07/15 07:07:35 [emerg] 1#1: open() "/etc/nginx/logs/access.log" failed (2: No such file or directory)
nginx: [emerg] open() "/etc/nginx/logs/access.log" failed (2: No such file or directory)
我应该怎么做才能解决这个问题?还有那条路应该在哪里?我想它是在Docker公开的底层OS路径上吗?
最佳答案
Dockerfile中的基本映像是nginx(确切地说是nginx:latest).它具有来自Debian Nginx软件包的预配置nginx配置.您可以自己检查容器:docker run -it –rm nginx / bin / bash并查看文件和目录,以了解关于它的一些事实:
>它为nginx用户提供
>它提供/ var / log / nginx目录,但root拥有它
>它在任何人都可写的目录中提供access.log和error.log
(基本Nginx映像的Dockerfile是here)
您的配置:
>以Nginx的形式运行Nginx(是default)
>尝试将日志文件写入/ etc / nginx / logs
显然,此目录不存在,因为没有人创建它.如果存在,则应可由nginx用户写入.