49929


お世話になっております  
docker-compose初心者です  
不透明な点、不足点等あればご指摘お願いいたします

参考にした記事  
<https://sleepless-se.net/2018/06/12/dockerdjango>

利用したリポジトリ  
<https://gitlab.com/sleepless-se/django-uwsgi-nginx-https>

環境  
CentOS Linux release 7.5.1804 (Core)  
Django==2.1.2  
djangorestframework==3.9.0  
docker==3.5.1  
docker-compose==1.23.0

私は今、docker-composeを使ってDjangoをHTTPS化してデプロイしようと試みています  
参考にした記事のリポジトリを利用してWebアプリのHTTPS化は成功しました  
しかし、Nginxからstaticフォルダーが参照できておらず、CSS等が適用できていない状態です

記事を見るとnginx-app.confを設定するようですが、自分の環境での書き方がわからず悩んでいます

Djangoのアプリはappの中にプロジェクトの中身を全て入れてあります  
appのディレクトリの場所は以下の通りです  
/home/centos/django-uwsgi-nginx-https/django-uwsgi-nginx/app

現在以下のようにappの直下にstaticフォルダがある状態です  
app  
├── db.sqlite3  
├── manage.py  
├── project  
├── requirements.txt  
├── static  
├── templates

記事では以下のようにnginx-app.confを設定するとあります

location /static {  
alias /code/app/プロジェクト名/static;  
}

ですが私のstaticフォルダはapp直下のため、以下のように書いたのですが機能しませんでした

location /static {  
alias /code/app/static;  
}

docker-compose.ymlは以下の通りです(ドメインは記載を変えています)  

[code]

    version: '3'
    services:
      https-portal:
        image: steveltn/https-portal:1
        ports:
          - '80:80'
          - '443:443'
        environment:
          DOMAINS: 'example.com -> http://django:8080'
          STAGE: 'production' #'local'
        # volumes:
        #   - /data/ssl_certs:/var/lib/https-portal
    
      django:
        build: ./django-uwsgi-nginx
        volumes:
        - ./django-uwsgi-nginx/app:/code/app
        ports:
          - '8080:8080'
[/code]

nginxからstaticフォルダーが参照できるには書き方が違うのか  
それとも他になにか原因が考えられるのか  
わかる方いらっしゃいましたらよろしくお願いします


CC BY-SA 4.0
2018-11-03T03:34:55.597
49917
2018-11-03T13:40:28.157
2018-11-03T11:44:40.070
question
nginx docker django docker-compose
docker-composeでnginxからstaticフォルダーが参照できるnginx-app.confの設定


`docker-compose.yml`について、`volumes`の設定が`#`でコメントアウトされているのはわざとでしょうか？
このコメントアウトを外さないとアプリが動作しないと思います。参考にした記事のほうではコメントアウトが外されています。

[code]

    #volumes:
    #- ./django-uwsgi-nginx/app:/code/app
    
[/code]

nginxの設定ですが、以下のようにすれば動くのではないかと思います。

[code]

    location /static {
        alias /code/app/static;
    }
    
[/code]

* * *

以降は解説です。Dockerコンテナ内で動くアプリは、外部から隔離されたファイルシステムが見えています。ですから、コンテナの外（ホスト側）に存在するファイルは何らかの方法でコンテナの内側から見えるようにしてあげる必要があります。

その方法の一つが`volumes`の設定で、質問文にある`docker-compose.yml`の設定は外側の`./django-uwsgi-
nginx/app`がコンテナ内での`/code/app`に対応するようにしてくださいという意味になります。

そして、nginxの設定ですが、nginxはコンテナ内で動作しているため、コンテナ内のファイルシステム上のパスを教えてあげる必要があります。質問文にある`/home/centos/django-
uwsgi-nginx-https/django-uwsgi-
nginx/app/static`というのはおそらくホスト側のパスでしょうから、これはコンテナ内のnginxには見えません。

今回、`./django-uwsgi-nginx/app`（これは`/home/centos/django-uwsgi-nginx-
https/django-uwsgi-
nginx/app`のことですよね）がコンテナ内での`/code/app`に対応するように設定しました。ということは、`/home/centos/django-
uwsgi-nginx-https/django-uwsgi-
nginx/app/static`は`/code/app/static`に対応するはずです。ですから、上述のように`/code/app/static`をnginxに設定してあげることでnginxからstaticディレクトリが参照できるようになると思います。


CC BY-SA 4.0
2018-11-03T08:43:53.500
49929
2018-11-03T08:43:53.500
30079
49917
answer


今回はnginx-app.confのstaticフォルダの指定を間違えていた点もそうですが  
STATIC_ROOTを設定していなかったため、virtualenvのテスト環境では動作しても  
dockerのデプロイ環境では動かないという初歩的ミスがありました

デプロイ環境のためにはSTATIC_ROOTにcollectstaticが静的ファイルを集めるディレクトリの指定が必要だと理解していなかったのが原因です

ただDjangoの管理ページのCSSが適用していないのでまた原因を探る必要があります  
拙い文章で分かりづらかったと思うのですが、丁寧に解説までしてくださり本当にありがとうございました


CC BY-SA 4.0
2018-11-03T13:40:28.157
49939
2018-11-03T13:40:28.157
49917
answer