我对Docker和Nginx都很陌生,这可能是一个愚蠢的问题,但我如何指向我的nginx框来查看Rails公共文件?基本上,我有一个nginx框和一个应用程序框。我想知道在哪里放置这些文件,以便nginx框可以读取它们。
version: "3"
services:
api:
build: "./api"
env_file:
- .env-dev
ports:
- "3000:3000"
depends_on:
- db
volumes:
- .:/app/api
command: rails server -b "0.0.0.0"
nginx:
build: ./nginx
env_file: .env-dev
volumes:
- .:/app/nginx
depends_on:
- api
links:
- api
ports:
- "80:80"
...
Api dockerfile:
FROM ruby:2.4.1-slim
RUN apt-get update && apt-get install -qq -y \
build-essential \
libmysqlclient-dev \
nodejs \
--fix-missing \
--no-install-recommends
ENV INSTALL_PATH /api
RUN mkdir -p $INSTALL_PATH
WORKDIR $INSTALL_PATH
COPY Gemfile $INSTALL_PATH
RUN bundle install
COPY . .
EXPOSE 3000
Nginx Dockerfile:
FROM nginx
ENV INSTALL_PATH /nginx
RUN mkdir -p $INSTALL_PATH
COPY nginx.conf /etc/nginx/nginx.conf
# COPY ?
EXPOSE 80
nginx配置(这是正确复制的)
daemon off;
worker_processes: 1;
events { worker_connections: 1024; }
http {
sendfile on;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript
application/x-javascript
application/atom+xml;
# Rails Api
upstream api {
server http://api/;
}
# Configuration for the server
server {
# Running port
listen 80;
# Proxying the connections connections
location /api {
proxy_pass http://api;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /public/50x.html
error_page 404 /public/404.html
location = /50x.html {
root /api/public;
}
location = /404.html {
root /api/public
}
}
}
现在,当我转到localhost:80
时,它会显示通用的nginx文件夹。但是,我不确定如何将rails api / public /的公共目录链接到nginx容器。
我可以COPY path/to/rails/public path/nginx
吗? nginx希望在哪里找到这些文件?
修改
我相信我应该把它们放进/var/www/app_name
,对吗?
答案 0 :(得分:2)
我认为您想要实现的目标应该通过将容器'api'的容量装到容器'nginx'来完成,如下所示:
version: "3"
services:
api:
image: apiimg
volumes:
- apivol:/path/to/statics
nginx:
image: nginximg
volumes:
- apivol:/var/www/statics
volumes:
apivol: {}
因此,为所有容器apivol
声明了一个共享卷,该容器映射到Rails容器上的/path/to/statics
,并且映射到nginx容器中的/var/www/statics
。这样您就不需要手动将任何内容复制到nginx容器中。
答案 1 :(得分:1)
nginx上静态内容的默认位置为/etc/nginx/html
,但只要您记得添加
var/www/app_name
中
root /var/www/app_name
在静态内容的相应location
块中。