使用Docker

时间:2018-04-08 13:15:30

标签: python mysql django docker docker-compose

我很难部署使用docker容器使用mySQL数据库的Django项目。

我能够创建两个容器,但web容器在创建错误后立即退出代码1 - Not able to find tg_db database

我的理解是,当我运行docker-compose up -d来启动两个容器时,它使用MYSQL_DATABASE=tg_db环境变量来创建名为 tg_db 的数据库,该数据库被使用和标识为django设置。或者,我可以运行命令docker-compose run web python3 manage.py migrate来运行docker-compose,它将在其上创建数据库和迁移。如果不是这样,请告诉我。

以下是使用的文件:

settings.py

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'tg_db',
    'USER': 'root',
    'PASSWORD': 'password',
    'HOST': 'db',
    'PORT': '3306',
    'OPTIONS': {'init_command': 'SET default_storage_engine=INNODB;'}
},}  

Dockerfile

    # Start with a python image
    FROM python:3

    # Some stuff that everyone has been copy-pasting
    # since the dawn of time.
    ENV PYTHONUNBUFFERED 1

    # Install things
    RUN apt-get update

    # Make folders and locations for project

    RUN mkdir /code
    COPY . /code
    WORKDIR /code/project/t_backend

    # Install requirements

    RUN pip install -U pip
    RUN pip install -Ur requirements.txt

当我WORKDIR /code/project/t_backend坐在那里时,Woking目录设置为manage.py,Dockerfile和docker-compose.yml文件与项目文件夹位于同一个地方。

docker-compose.yml

version: '3'

services:

  db:
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_DATABASE=tg_db
      - MYSQL_ROOT_PASSWORD=password
    volumes:
      - ./dbdata:/var/lib/mysql

  web:
    build: .
    command: bash -c "python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

提前谢谢!

1 个答案:

答案 0 :(得分:0)

所以,让我一步一步地描述你的案例。

1。这是data['rand_between'] = [np.random.randint(s, e) for s,e in zip(data['start'], data['end'])] 文件中输入print (data) start end rand_between 0 1 10 8 1 2 20 3 2 3 30 23 3 4 40 35 4 5 50 30 5 6 60 28 6 7 70 60 7 8 80 14 8 9 90 85 9 10 100 83 而非docker-compose.yaml的拼写错误。

执行了

2。 MYSQL_DATABSE=tg_db并启动了两个容器。当然,从未创建数据库MYSQL_DATABASE=tg_db

3. 根据docker-compose up -d文件,主机上的文件夹tg_db将安装到容器内的docker-compose.yaml。因此,当在上一步中创建容器时,所有mysql数据都写入容器中的文件夹./dbdata和主机上的/var/lib/mysql文件夹。由于步骤1中的拼写错误,此数据没有/var/lib/mysql数据库:

./dbdata

4. Typo已更正(设置了正确的环境变量名称)并重新创建了堆栈:

tg_db

但是当完成此操作时,带有上一次尝试数据的$ ls -la dbdata/ total 176196 drwxrwxr-x 5 guest-ryx1oj guest-ryx1oj 4096 Apr 8 21:18 . drwxrwxr-x 3 np np 4096 Apr 8 21:17 .. -rw-r----- 1 guest-ryx1oj guest-ryx1oj 56 Apr 8 21:17 auto.cnf -rw------- 1 guest-ryx1oj guest-ryx1oj 1675 Apr 8 21:17 ca-key.pem -rw-r--r-- 1 guest-ryx1oj guest-ryx1oj 1107 Apr 8 21:17 ca.pem -rw-r--r-- 1 guest-ryx1oj guest-ryx1oj 1107 Apr 8 21:17 client-cert.pem -rw------- 1 guest-ryx1oj guest-ryx1oj 1679 Apr 8 21:17 client-key.pem -rw-r----- 1 guest-ryx1oj guest-ryx1oj 662 Apr 8 21:18 ib_buffer_pool -rw-r----- 1 guest-ryx1oj guest-ryx1oj 79691776 Apr 8 21:18 ibdata1 -rw-r----- 1 guest-ryx1oj guest-ryx1oj 50331648 Apr 8 21:18 ib_logfile0 -rw-r----- 1 guest-ryx1oj guest-ryx1oj 50331648 Apr 8 21:17 ib_logfile1 drwxr-x--- 2 guest-ryx1oj guest-ryx1oj 4096 Apr 8 21:17 mysql drwxr-x--- 2 guest-ryx1oj guest-ryx1oj 4096 Apr 8 21:17 performance_schema -rw------- 1 guest-ryx1oj guest-ryx1oj 1679 Apr 8 21:17 private_key.pem -rw-r--r-- 1 guest-ryx1oj guest-ryx1oj 451 Apr 8 21:17 public_key.pem -rw-r--r-- 1 guest-ryx1oj guest-ryx1oj 1107 Apr 8 21:17 server-cert.pem -rw------- 1 guest-ryx1oj guest-ryx1oj 1679 Apr 8 21:17 server-key.pem drwxr-x--- 2 guest-ryx1oj guest-ryx1oj 12288 Apr 8 21:17 sys 文件夹再次装入容器docker-compose down docker compose up -d 并覆盖在容器启动期间创建的数据。当然,已安装文件夹中的数据没有./dbdata数据库。

<强>解决方案:

请删除主机上/var/lib/mysql文件夹中的所有数据(我希望它只是一段时间的测试,因此数据并不重要且可以删除)并重新创建堆栈再次:

tg_db