2017-07-18 1 views
0

Juste pour commencer, j'ai vu this. Mais il/elle utilise build, et j'utilise image.Servir des fichiers statiques avec nginx situé dans un autre conteneur docker

J'ai un fichier de docker-composer qui tire une image que j'ai faite précédemment sur mon serveur.

app: 
    restart: always 
    image: some-app-image:latest 

nginx config

location /static/ { 
    root /data/app/web_interface; <--- this exists in some-app-image container 
} 

Normalement, j'aurais un volume monté sur l'image de l'application qui contient les fichiers statiques.

Toutefois, cela devient redondant car le conteneur de l'application contient les fichiers statiques.

Tout ce que le conteneur nginx doit faire est "peer" dans le conteneur de l'application et servir ces fichiers statiques. Comme:

location /static/ { 
    root http://app:8000/web_interface; 
} 

ou

location /static/ { 
    root app/web_interface; 
} 

Toute chance il y a un moyen de servir des fichiers statiques situés dans un autre conteneur d'un conteneur de nginx?

+0

La configuration de votre conteneur est un peu floue.Un conteneur nginx fonctionne-t-il comme un proxy inverse servant déjà les données de votre conteneur 'app' (hôte virtuel)? Pourquoi le conteneur 'app' ne peut-il pas servir ses propres fichiers statiques? – Grimmy

+0

J'ai des fichiers statiques servant nginx car je ne veux pas que le serveur gunicorn les manipule. https://stackoverflow.com/a/13947418/5779280 –

+0

Juste pour être clair: Le conteneur de l'application exécute gunicorn et votre conteneur nginx sert que si un uwsgi_pass? – Grimmy

Répondre

1

Toutes les idées que j'ai eu dans le passé:

Partage un volume docker de l'application à nginx

Vous pouvez faire un volume Dockefile et copier dans les staticfiles de l'application lorsque le conteneur fonctionne. Ensuite, partagez le volume avec le conteneur nginx en utilisant volumes_from. C'est un peu moche et ne fonctionne pas du tout si votre application depends_on nginx. Je dirais que c'est certainement un no-go car il fonctionne terriblement lorsque l'échelle de votre conteneur app.

L'idée de mapper également les fichiers statiques de l'hôte dans le conteneur nginx n'est pas non plus optimale. Vous aurez une étape supplémentaire étrange pour les traiter.

conteneur statique séparé

Construire un autre conteneur de nginx servant uniquement les fichiers statiques sur un autre serveur virtuel. static.foo.bar.

Utilisez un CDN

Il y a des tonnes de CDNs là-bas que vous pouvez mettre vos staticfiles et la plupart des cadres ont des plugins pour gérer cela. J'ai des projets qui le font. Fonctionne très bien.

Utilisez uwsgi

Vous pouvez servir staticfiles avec uwsgi en utilisant --static-map. Voir docs. C'est ce que j'ai fini par faire car c'était un pas cher et facile ... et amical quand il s'agit de mise à l'échelle. Ensuite, vous devrez probablement utiliser http-socket donc uWSGI parle http à la place.

+0

Hey merci pour cette réponse. J'aime l'option CDN, mais nous devons nous déplacer assez rapidement et je pense que cela prendrait plus de temps à mettre en place que la solution uWSGI. J'ai toujours pensé que servir des fichiers statiques à partir du serveur d'application était un non-non. Je suppose que la méthode a évolué. –

+0

Je dirais que ce n'est pas optimal de servir des fichiers statiques à partir du serveur de l'application, mais ce n'est pas nécessairement mauvais. Si vous devez vous déplacer rapidement, c'est la façon sûre et facile. Cela fonctionne juste. php fait cela depuis des lustres. – Grimmy