2017-09-18 1 views
0

これは生産上の問題です。Emberは、ペーパークリップとDockerを使用してRailsバックエンドからイメージアセットを取得しません

私は2つのDockerホストを持っています.1つはnginxコンテナ(Emberアプリケーションを提供)を実行し、もう1つはpostgresコンテナとrails-apiコンテナを実行します。 後者の2つのコンテナを最初のDockerホストに移動して、それらをすべて1つでホストできるようにしたいので、2番目のDockerホストを削除できます。 Rails-apiはクリップを使って写真をアップロードします。

Emberアプリケーションの制作ビルドでは、config/environment.jsにENV.host = 'dockerhost2.com:3000/'を、adapters/application.jsにhost: ENV.hostを追加して、レールのバックエンドを指しています。

私はそれを(2つのドッカーホストで)そのままにしておくと、奇妙なことにすべてうまく動作します。つまり、イメージがフロントエンドに配信されて表示されます。しかし、すべてのコンテナを1つのドッカーホストに移動すると、イメージ自体は取得できず、404を返すことはできません。

イメージURLは常に 'public/system/000/path/to/Image.jpg'です。私が物事を別々に(2人のドッカーのホスト上で) 'dockerhost1.com/public/system/000/path/to/Image.jpg'に行っても、私は理由がわからないが、レールアプリがポートで提供されているので3000と別のホストにインストールします。しかし、すべてのコンテナを1つのドッカーホストに結合すると、同じイメージURLが404を返し、 'dockerhost1.com:3000/public/system/000/path/to/Image.jpg'に行くと動作します。これは難解です。

すべてのコンテナを1つのドッカーマシンに置き、docker.machine.ip:3000を指すEmberアプリを構築すると、すべてが美しく動作します。 'docker.machine.ip/public/system/000/path/to/Image.jpg'に行くのは確かにイメージを見つけることはできますが、確かに、なぜ私は理解できません。

マイエンバードッキングウィンドウ-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" 

私はレールドッキングウィンドウ-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アプリで画像を取得して正しく表示するには?

+0

もしかしたら、名前空間を指定する予感がするのに役立ちますか? Emberアプリのパブリックフォルダを探しているようです。そうであるかどうかをテストするには、ファイルパスでEmberアプリに画像をドロップし、何が起こるかを確認します。 – handlebears

答えて

0

すでにドッカーを使用しているので、内部ネットワーク機能を使用しないでください。私は、それがホストマシンではなくコンテナを参照しているため、emberアプリケーションがlocalhost/domain1.comに接続する際に問題を抱えていると思われます。

ドッカーネットワークを作成し、両方のコンテナをその上に配置します。これにより、ローカルネットワーク上のコンテナが仮想的に接続されます。その後、名前でコンテナを参照できます。だから、あなたはそれを達成するためにはname-of-rails-container:3000を実行します。ポート3000をレールアプリに公開する必要はありません。

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

関連する問題