2015-06-24 39 views
9

Tôi đã theo dõi hướng dẫn docker-compose here (liên kết vùng chứa django và postgres). Mặc dù tôi đã có thể đi qua với các hướng dẫn tôi tuy nhiên không thể tiến hành lặp lại cùng một bằng cách sử dụng một container mysql. Sau đây là dockerfile tôi và Docker-compose.yml 'Liên kết các thùng chứa django và mysql bằng cách sử dụng docker-compose

db: 
    image: mysql 
web: 
    build: . 
    command: python manage.py runserver 0.0.0.0:8000 
    volumes: 
    - .:/code 
    ports: 
    - "8000:8000" 
    links: 
    - db:db 

' dockerfile

FROM python:2.7 
RUN mkdir /code 
WORKDIR /code 
RUN pip install mysql-python 
RUN pip install django 

Cả hai đều xây dựng tốt khi tôi làm docker-compose up nhưng có vẻ như các biến môi trường db không truyền cho thùng chứa django kể từ khi tôi chạy os.environ.keys() trong một trong các chế độ xem django của tôi, tôi không thể thấy bất kỳ biến môi trường DB_ * mong đợi nào. Vì vậy, mysql yêu cầu một thiết lập khác nhau hoặc tôi thiếu một cái gì đó. Cảm ơn bạn.

[EDIT] Docker soạn phiên bản

docker-compose version: 1.3.0 
CPython version: 2.7.9 
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013 

Docker phiên bản

Docker version 1.6.2, build 7c8fca2 
+0

gì phiên bản của Docker và Docker-soạn bạn đang sử dụng? Bạn có thể chia sẻ đầu ra của 'docker-compose up'?Bạn cũng có thể chia sẻ đầu ra của 'weber-compose run web env' theo gợi ý của @dnozay – Thomasleveil

+0

https://hub.docker.com/_/mysql/#environment-variables – user81269

+0

https://github.com/pahaz/ docker-compose-django-postgresql-radis-ví dụ - django + redis + postgres + nginx soạn ví dụ – pahaz

Trả lời

2

bạn không cần phải lo lắng về biến môi trường. Khi liên kết các thùng chứa với nhau, bạn chỉ cần sử dụng bí danh vùng chứa được xác định bởi liên kết như thể đó là tên máy chủ.

ví dụ nếu tập tin docker-compose.yml của bạn là:

db: 
    image: postgres 
web: 
    build: . 
    command: python manage.py runserver 0.0.0.0:8000 
    volumes: 
    - .:/code 
    ports: 
    - "8000:8000" 
    links: 
    - db:mydb 

Trong thiết lập django của bạn, bạn sẽ phải thiết lập các máy chủ cơ sở dữ liệu để mydb.

+1

Cảm ơn câu trả lời của bạn, vui lòng kiểm tra chỉnh sửa của tôi. Tôi đã thực hiện sai lầm của việc sử dụng postgres trong câu hỏi thay vì mysql trong docker-compose.yml.It là một lỗi dán sao chép. Tuy nhiên tôi đã thử cách tiếp cận của bạn và tôi nhận được máy chủ lưu trữ mysql không rõ 'mydb' – michaelmwangi

2

Trước tiên, bạn cần phải sửa đổi các tập tin cài đặt ...

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'NAME': 'postgres', 
     'USER': 'postgres', 
     'HOST': 'db', 
     'PORT': 5432, 
    } } 

Sau đó, nếu bạn sử dụng lệnh docker-compose đúng cách, các container phải được liên kết, và nó sẽ giải quyết hostname db đúng dựa trên links trong tệp docker-compose.yml.

Tuy nhiên, nếu bạn muốn kiểm tra môi trường ...

~/django-example: docker-compose run web env 
Starting djangoexample_db_1... 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
HOSTNAME=66ff09ed8632 
TERM=xterm 
DJANGOEXAMPLE_DB_1_PORT=tcp://172.17.0.35:5432 
DJANGOEXAMPLE_DB_1_PORT_5432_TCP=tcp://172.17.0.35:5432 
DJANGOEXAMPLE_DB_1_PORT_5432_TCP_ADDR=172.17.0.35 
DJANGOEXAMPLE_DB_1_PORT_5432_TCP_PORT=5432 
DJANGOEXAMPLE_DB_1_PORT_5432_TCP_PROTO=tcp 
DJANGOEXAMPLE_DB_1_NAME=/djangoexample_web_run_2/djangoexample_db_1 
DJANGOEXAMPLE_DB_1_ENV_affinity:container==52c78c810792b0e7b9a231eab7ab7a3d50c95b76faf0abb8ec38a7d1ff0c7e5f 
DJANGOEXAMPLE_DB_1_ENV_LANG=en_US.utf8 
DJANGOEXAMPLE_DB_1_ENV_PG_MAJOR=9.4 
DJANGOEXAMPLE_DB_1_ENV_PG_VERSION=9.4.4-1.pgdg70+1 
DJANGOEXAMPLE_DB_1_ENV_PGDATA=/var/lib/postgresql/data 
DB_PORT=tcp://172.17.0.35:5432 
DB_PORT_5432_TCP=tcp://172.17.0.35:5432 
DB_PORT_5432_TCP_ADDR=172.17.0.35 
DB_PORT_5432_TCP_PORT=5432 
DB_PORT_5432_TCP_PROTO=tcp 
DB_NAME=/djangoexample_web_run_2/db 
DB_ENV_affinity:container==52c78c810792b0e7b9a231eab7ab7a3d50c95b76faf0abb8ec38a7d1ff0c7e5f 
DB_ENV_LANG=en_US.utf8 
DB_ENV_PG_MAJOR=9.4 
DB_ENV_PG_VERSION=9.4.4-1.pgdg70+1 
DB_ENV_PGDATA=/var/lib/postgresql/data 
DB_1_PORT=tcp://172.17.0.35:5432 
DB_1_PORT_5432_TCP=tcp://172.17.0.35:5432 
DB_1_PORT_5432_TCP_ADDR=172.17.0.35 
DB_1_PORT_5432_TCP_PORT=5432 
DB_1_PORT_5432_TCP_PROTO=tcp 
DB_1_NAME=/djangoexample_web_run_2/db_1 
DB_1_ENV_affinity:container==52c78c810792b0e7b9a231eab7ab7a3d50c95b76faf0abb8ec38a7d1ff0c7e5f 
DB_1_ENV_LANG=en_US.utf8 
DB_1_ENV_PG_MAJOR=9.4 
DB_1_ENV_PG_VERSION=9.4.4-1.pgdg70+1 
DB_1_ENV_PGDATA=/var/lib/postgresql/data 
LANG=C.UTF-8 
PYTHON_VERSION=2.7.10 
PYTHON_PIP_VERSION=7.0.3 
PYTHONUNBUFFERED=1 
HOME=/root 
+0

Xin cảm ơn vì câu trả lời của bạn rất tiếc nhưng tôi đã tạo một lỗi dán sao chép, vui lòng xem tập tin docker-compose.yml đã chỉnh sửa của tôi. Cảm ơn bạn – michaelmwangi

5

Trong Django settings.py tập tin chắc chắn rằng bạn có một cái gì đó như:

DATABASES = { 
'default': { 
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': 'django1', 
    'USER': 'django', 
    'PASSWORD': 'password', 
    'HOST': 'db', 
    'PORT': 3306, 
    } 
} 

sau đó trong bạn docker-compose.yml tệp đảm bảo bạn có gì đó dọc theo các dòng:

db: 
    image: mysql 
    environment: 
    MYSQL_ROOT_PASSWORD: docker 
    MYSQL_DATABASE: docker 
    MYSQL_USER: docker 
    MYSQL_PASSWORD: docker 

sau đó theo Docker/hướng dẫn django bạn đang theo dõi chạy sau một lần nữa để xây dựng lại tất cả mọi thứ và những điều nên bắt đầu làm việc

docker-compose web django-admin.py startproject composeexample . 
+0

Tuyệt vời, nó đã giúp tôi cuối cùng. Vẫn không chắc chắn cách mà 'HOST: 'db'' hoạt động? – sam

+0

Hi Sam, HOST là tên miền đủ điều kiện hoặc địa chỉ IP của máy chủ cơ sở dữ liệu từ xa. Nếu bạn để trống giá trị nó có nghĩa là sử dụng một cơ sở dữ liệu trên localhost. Tôi cũng đã thành công với việc chỉ định localhost là 'HOST': '127.0.0.1' nhưng bạn sẽ có thể để trống nó. – AnotherLongUsername

Các vấn đề liên quan