问题 使用docker-compose链接django和mysql容器


我一直在关注docker-compose教程 这里 (链接django和postgres容器)。虽然我能够完成教程但是我无法继续重复相同的操作 使用mysql容器。 以下是我的dockerfile和docker-compose.yml `

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

当我这样做时,他们都很好 docker-compose up 但是,当我运行时,似乎db环境变量没有传递给django容器 os.environ.keys() 在我的一个django视图中,我看不到任何预期的DB_ *环境变量。 所以mysql需要不同的设置或我错过了什么。 谢谢。

[编辑] Docker撰写版本

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

Docker版本

Docker version 1.6.2, build 7c8fca2

5577
2018-06-24 20:00


起源

您使用的是什么版本的Docker和docker-compose?你能分享一下的输出吗? docker-compose up?你也可以分享输出 docker-compose run web env 正如@dnozay所建议的那样 - Thomasleveil
hub.docker.com/_/mysql/#environment-variables - user81269
github.com/pahaz/docker-compose-django-postgresql-radis-example  - django + redis + postgres + nginx撰写的例子 - pahaz


答案:


Django settings.py 文件确保你有类似的东西:

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

然后在你的 泊坞窗,compose.yml 文件确保你有以下几点:

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

然后根据docker / django教程,您将再次运行以下内容来重建所有内容,并且应该开始工作

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

8
2018-01-22 13:14



太棒了,终于帮到了我。还是不确定那是怎么回事 HOST: 'db' 工作? - sam
嗨Sam,HOST是完全限定的域名,或远程数据库主机的IP地址。如果将值保留为空,则表示在localhost上使用数据库。我也成功将localhost指定为'HOST':'127.0.0.1',但你应该可以把它留空。 - AnotherLongUsername
为什么我们需要 MYSQL_ROOT_PASSWORD ?应用程序不需要root密码,对吧? - Omkar Deshpande


你不需要担心环境变量。将容器链接在一起时,只需使用链接定义的容器别名,就好像它是主机名一样。

例如,如果你的 docker-compose.yml 文件是:

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

在django设置中,您必须将数据库主机设置为 mydb


2
2018-06-24 23:56



谢谢你的回答,请检查我的编辑。我犯了错误,在问题中使用postgres而不是在docker-compose.yml中使用mysql。这是一个复制粘贴错误。然而,我尝试了你的方法,我得到了未知的mysql服务器主机'mydb' - michaelmwangi
现在有一天你甚至不需要使用 links。每 docs.docker.com/compose/compose-file/#links :“不需要链接来启用服务进行通信 - 默认情况下,任何服务都可以通过该服务的名称访问任何其他服务。” - Jorge Orpinel
语法是什么。:/ code意味着什么?在这里我不明白使用。和:是否将当前目录挂载到/ code? - milan
. 是为了 当前目录,docker-compose.yml文件所在的文件。 : 只是一个分隔符。 /code 是容器内的路径,将在其上安装本地当前目录的内容 - Thomasleveil


首先,您需要修改设置文件...

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

然后,如果你使用了 docker-compose 正确命令,应该链接容器,它应该解析主机名 db 正确地基于 links 在里面 docker-compose.yml 文件。

不过,如果你想检查环境......

~/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

2
2018-06-25 00:14



嗨,谢谢您的回答很抱歉,但我已经复制粘贴错误,请参阅我编辑的docker-compose.yml文件。谢谢 - michaelmwangi
现在有一天你甚至不需要使用 links。每 docs.docker.com/compose/compose-file/#links :“不需要链接来启用服务进行通信 - 默认情况下,任何服务都可以通过该服务的名称访问任何其他服务。” - Jorge Orpinel