我正在按照此存储库中给出的configuration。 我决定将我的dockerconfiguration和实际代码保存在不同的仓库中 – 我使用Dockerfile克隆代码仓库。 我正在使用docker-machine(本地,使用Virtualbox驱动程序)和docker-compose setup。
代码回购的目录结构大致如下 – :
|-- bower.json |-- CONTRIBUTORS |-- defsec | |-- defsec | | |-- aws_settings.py | | |-- heroku_settings.py | | |-- __init__.py | | |-- settings.py | | |-- urls.py | | |-- views.py | | `-- wsgi.py | |-- manage.py | |-- quiz_restful | | |-- __init__.py | | |-- permissions.py | | |-- serializers.py | | |-- services.py | | |-- tests.py | | `-- views.py | `-- users | |-- __init__.py | |-- models.py | |-- permissions.py | |-- serializers.py | `-- views.py |-- extras |-- gulpfile.js |-- package.json |-- Procfile |-- README.md |-- requirements.txt |-- scripts | `-- postInstall.sh |-- static | |-- javascripts | | |-- app.js | | |-- controllers | | | `-- controllers.js | | |-- directives | | | `-- directives.js | | `-- services | | `-- services.js | |-- partials | | |-- eval.html | | |-- exam.html | | |-- exam-partials | | | |-- exam-view.html | | | `-- sidebar.html | | |-- login.html | | `-- register.html | `-- stylesheets | `-- styles.css |-- templates | |-- index.html | |-- javascripts.html | |-- navbar.html | `-- stylesheets.html
docker-compose.yml文件与上面列出的版本库几乎是一样的,与我在卷上安装django的细微区别是.:/root – 没有这个[8] System error: no file or directory错误被抛出。 这可能是因为/usr/src/app克隆之前/usr/src/app不存在(仅供参考, 这是原始文件)。 Dockerfile(用于django服务)具有以下内容:
FROM ubuntu:14.04 ENV DJANGO_CONFIGURATION Docker # First, we need to get git, and clone our repository # Additionally, get everything else here too, such as nodejs and npm RUN apt-get update RUN apt-get install -y ca-certificates git-core ssh nodejs npm python-pip libpq-dev python-dev RUN ln -s /usr/bin/nodejs /usr/bin/node ENV HOME /root # Add custom ssh keypair - usually Bitbucket deployment keys ADD ssh/ /root/.ssh/ # Fix permissions RUN chmod 600 /root/.ssh/* # Avoid first connection host confirmation RUN ssh-keyscan bitbucket.org > /root/.ssh/known_hosts # Clone the repo WORKDIR /usr/src/app RUN git clone [email protected]:username/defsec-exam-app.git # Install requirements WORKDIR /usr/src/app/defsec-exam-app RUN pip install -r requirements.txt RUN npm install -g bower RUN bower --allow-root install # Remember to perform migrations on your own, and also create DB when needed. # S3 Storage ... # DB Settings ... WORKDIR /usr/src/app/defsec-exam-app/defsec CMD ["gunicorn", "defsec.wsgi", "-w", "2", "-b", "0.0.0.0:8000", "--log-level", "-"]
最后, nginx.conf服务于静态文件如下:
worker_processes 1; events { worker_connections 1024; } http { server { listen 80; server_name example.org; access_log /dev/stdout; error_log /dev/stdout info; location /static/ { alias /usr/src/app/defsec-exam-app/static; } location /static/javascripts/ { default_type text/javascript; alias /usr/src/app/defsec-exam-app/static/javascripts/; } location /static/stylesheets/ { default_type text/css; alias /usr/src/app/defsec-exam-app/static/stylesheets/; } location /static/bower_components/ { alias /usr/src/app/defsec-exam-app/static/bower_components/; } location / { proxy_pass http://django:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } } }
然而,我不能让nginx服务于静态文件 – 所有这些都返回一个404.我想知道nginx和django容器服务(如docker-compose.yml定义的)之间的链接是不正确的, t看起来像。 我还检查了nginx容器中的/etc/hosts文件,用于链接创build/etc/hosts文件条目。
172.17.0.136 151ca02e891a 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.134 defsecdocker_django_1 eb900ed9600c 172.17.0.135 defsecdocker_nginx_1 eec99206076a 172.17.0.134 django eb900ed9600c defsecdocker_django_1 172.17.0.134 django_1 eb900ed9600c defsecdocker_django_1 172.17.0.135 nginx eec99206076a defsecdocker_nginx_1 172.17.0.135 nginx_1 eec99206076a defsecdocker_nginx_1 172.17.0.116 defsecdocker_postgres_1 172.17.0.134 defsecdocker_django_1 172.17.0.135 defsecdocker_nginx_1.bridge 172.17.0.136 defsecdocker_nginx_run_10.bridge 172.17.0.135 defsecdocker_nginx_1 172.17.0.136 defsecdocker_nginx_run_10 172.17.0.116 defsecdocker_postgres_1.bridge 172.17.0.134 defsecdocker_django_1.bridge
我不确定这是否正确,因为只有3个容器,但在主机文件中有很多条目,其中一些是重复的。 这是可重复的行为 – 我每次使用docker-compose构build和运行容器时都会得到这个确切的文件。 docker-compose日志为nginx确认404s。
任何指针将不胜感激。
看起来docker-composeconfiguration不正确。 nginx抛出这些404的原因是因为它没有访问/usr/src/app/defsec-exam-app/static 。
这是正确的docker-composeconfiguration – :
# Nginx nginx: build: ./nginx volumes_from: - django links: - django ports: - "80:80" # This defines a service for the Django app # Will include the Angular frontend django: build: . volumes: - .:/root - /usr/src/app expose: - "8000" links: - postgres # This defines a service for the Postgres database postgres: image: postgres:latest
volumes_from从django服务获取卷。 我已经暴露了usr/src/app作为一个卷。 这似乎是诀窍。 如果有的话,我愿意提供build议!
另外,这里是新的nginxconfiguration – :
worker_processes 1; events { worker_connections 1024; } http { server { listen 80; server_name example.org; access_log /dev/stdout; error_log /dev/stdout info; location /static/ { alias /usr/src/app/defsec-exam-app/static; } location /static/javascripts/ { default_type text/javascript; alias /usr/src/app/defsec-exam-app/static/javascripts/; } location /static/stylesheets/ { default_type text/css; alias /usr/src/app/defsec-exam-app/static/stylesheets/; } location /static/bower_components/ { types { text/css css; text/javascript js; } alias /usr/src/app/defsec-exam-app/static/bower_components/; } location /static/partials/ { types { text/html html; } alias /usr/src/app/defsec-exam-app/static/partials/; } location /static/admin/ { alias /usr/src/app/defsec-exam-app/static/admin/; } location /static/admin/css { default_type text/css; alias /usr/src/app/defsec-exam-app/static/admin/css; } location /static/admin/js { default_type text/javascript; alias /usr/src/app/defsec-exam-app/static/admin/js; } location /static/admin/img { types { image/png png; image/jpeg jpg; } alias /usr/src/app/defsec-exam-app/static/admin/img; } location / { proxy_pass http://django:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } } }
注意:我必须将django admin css / js / img分别添加到docker / deployment repository,以便django admin正常工作。 (django Dockerfile中的一个简单的ADD命令可以做到这一点)