Ember不使用回形针和Docker从Rails后端检索图像资源

时间:2017-09-18 20:25:42

标签: ruby-on-rails docker ember.js docker-compose paperclip

这只是生产中的一个问题。

我有两个Docker主机,一个运行nginx容器(服务Ember应用程序),另一个运行postgres容器和rails-api容器。 我想将后两个容器移动到第一个Docker主机上,这样它们就可以全部托管在一个上,我可以删除第二个Docker主机。 Rails-api使用回形针上传照片。

在Ember应用程序生成版本中,我通过将ENV.host = 'dockerhost2.com:3000/'添加到a​​dapter / application.js中的config / environment.js和host: ENV.host来指向rails后端。

如果我保持原样(有2个泊坞主机),一切都很奇怪 - 也就是说,图像传送并显示在前端。但是,如果我将所有容器移动到一个泊坞主机,则无法检索图像本身并返回404。

图片网址始终为“public / system / 000 / path / to / Image.jpg”。当我把东西分开(在2个泊坞主机上)去'dockerhost1.com/public/system/000/path/to/Image.jpg'时工作得很好虽然我不明白为什么,因为rails应用程序在端口上服务3000并且在不同的主机上。但是当我将所有容器组合到1个docker主机上时,相同的图像URL返回404并且只有在我转到“dockerhost1.com:3000/public/system/000/path/to/Image.jpg”时才能工作。这很令人困惑。

当我将所有容器放到1个docker机器上并构建Ember应用程序以指向docker.machine.ip:3000时,本地一切都很好用。去'docker.machine.ip / public / system / 000 / path / to / Image.jpg'确实找到了这个图像,不可否认,我不明白为什么。

我的Ember docker-compose.yml

version: '2'
services:
  server:
    image: nginx
    volumes: 
      - ./dist:/usr/share/nginx/html
      - ./nginx-site.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"

我的rails docker-compose.yml

version: '2'
volumes:
  sarahdeyong-postgres:
  images:

services:
  rails: &defaults
    build: .
    image: romanhood/sarahdeyong-api:0.0.1
    volumes:
      - .:/myapp
      - images:/myapp/public/system/
    depends_on:
      - postgres
    entrypoint: ["bundle", "exec", "rails"]

  server:
    <<: *defaults
    tty: true
    stdin_open: true
    command: server -p 3000 -b '0.0.0.0'
    ports:
      - "3000:3000"

  postgres:
    image: postgres
    volumes:
      - sarahdeyong-postgres:/var/lib/postgresql/data
    ports:
      - "5432:5432"

和nginx-site.conf:

# pushState friendly!
# The setup:
#   * website name is `_`
#   * javascript app is located at `/app`

charset utf-8;

tcp_nopush on;
tcp_nodelay off;
client_header_timeout 10s;
client_body_timeout 10s;
client_max_body_size 128k;
reset_timedout_connection on;

gzip on;
gzip_types
    text/css
    text/javascript
    text/xml
    text/plain
    application/javascript
    application/x-javascript
    application/json
    application/xml
    application/rss+xml
    application/atom+xml
    font/truetype
    font/opentype
    image/svg+xml;

server {
  listen 80;
  server_name sarahdeyong;
  root /usr/share/nginx/html;


  # To make sure any assets can get through :)
  location / {
    try_files $uri @rewrites;
  }

  # If no asset matches, send it to your javascript app. Hopefully it's a route in the app!
  location @rewrites {
    rewrite ^(.+)$ /index.html last;
  }
}

如何在我的Ember应用程序中正确检索和显示我的图像?

1 个答案:

答案 0 :(得分:0)

由于您已经在使用docker,为什么不使用其内部网络功能。我怀疑ember应用程序无法连接回localhost / domain1.com,因为它指的是容器而不是主机。

创建一个泊坞网络并将两个容器放在其上。这实际上连接了本地网络上的容器。然后,您可以按名称引用容器。因此,在ember应用程序中,您只需name-of-rails-container:3000即可访问它。无需在rails应用程序上公开端口3000。

https://docs.docker.com/compose/networking/