【问题标题】:use redis and mongo alongside postgres in docker在 docker 中将 redis 和 mongo 与 postgres 一起使用
【发布时间】:2019-01-03 07:35:51
【问题描述】:

我正在学习在我的一个具有以下技术堆栈的项目中使用 docker

django

redis

mysql - 生产

sqlite - 开发

魔神

我可以配置一个简单的 docker,它涵盖了 django 相关和 mysql,但不知道如何粘合 redis 和 mongod。我在互联网上看到了各种方式,但根据我已经制定的配置,我应该如何很好地适应它们。

这就是我所做的

docker-compose.yml

version: '3'

services:

  db:
    image: mysql

  web:
    build:
      context: .
      dockerfile: docker/python/Dockerfile
    command: bash -c "sleep 3; python /code/manage.py migrate --noinput && python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

Dockerfile

# python image (https://hub.docker.com/_/python/)
FROM python:3.6

# Environment Variables
ENV PYTHONBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1


COPY ./requirements/requirements.txt /code/requirements.txt

RUN pip install -r /code/requirements.txt


RUN chmod ug+x /code/initialize.sh

COPY . /code/

WORKDIR /code

EXPOSE 8000

initialize.sh

#!/bin/bash
# This script initializes the Django project. It will be executed (from
# supervisord) every time the Docker image is run.

# If we're not in production, create a temporary dev database
if [ "$DJANGO_PRODUCTION" != "true" ]; then
    echo "DJANGO_PRODUCTION=false; creating local database..."
    # Wait until the MySQL daemon is running
    while [ "$(pgrep mysql | wc -l)" -eq 0 ] ; do
        echo "MySQL daemon not running; waiting one second..."
        sleep 1
    done
    # Wait until we can successfully connect to the MySQL daemon
    until mysql -uroot -pdevrootpass -e ";" ; do
        echo "Can't connect to MySQL; waiting one second..."
        sleep 1
    done
    echo "MySQL daemon is running; creating database..."
    mysql -uroot -e "CREATE DATABASE appDB; CREATE USER milan@localhost; SET PASSWORD FOR milan@localhost=PASSWORD('milan'); GRANT ALL PRIVILEGES ON appDB.* TO milan@localhost IDENTIFIED BY 'milan'; FLUSH PRIVILEGES;" -pdevrootpass;
else
    echo "DJANGO_PRODUCTION=true; no local database created"
fi

# Initialize Django project
python /code/manage.py collectstatic --noinput
python /code/manage.py makemigrations
python /code/manage.py migrate --noinput

# Create a Django superuser named `root` if it doesn't yet exist
echo "Creating Django superuser named 'root'..."
if [ "$DJANGO_PRODUCTION" != "true" ]; then
    # We're in the dev environment
    if [ "$ROOT_PASSWORD" == "" ]; then
        # Root password environment variable is not set; so, load it from config.ini
        echo "from ConfigParser import SafeConfigParser; parser = SafeConfigParser(); parser.read('/code/config.ini'); from django.contrib.auth.models import User; print 'Root user already exists' if User.objects.filter(username='root') else User.objects.create_superuser('root', 'admin@example.com', parser.get('general', 'ROOT_PASSWORD'))" | python /code/manage.py shell
    else
        # Root password environment variable is set; so, use it
        echo "import os; from django.contrib.auth.models import User; print 'Root user already exists' if User.objects.filter(username='root') else User.objects.create_superuser('root', 'admin@example.com', os.environ['ROOT_PASSWORD'])" | python /code/manage.py shell
    fi
else
    # We're in production; use root password environment variable
    echo "import os; from django.contrib.auth.models import User; print 'Root user already exists' if User.objects.filter(username='root') else User.objects.create_superuser('root', 'admin@example.com', os.environ['ROOT_PASSWORD'])" | python /code/manage.py shell
fi

所以我的问题是如何在这里粘合 redis 和 mongo?

P.S 如果我没有最佳实践方式,请告诉我。

【问题讨论】:

    标签: python mysql django docker redis


    【解决方案1】:

    最常见的做法是每个容器有一个进程,即将 redis 和 mongo 添加到 docker-file

    version: '3'
    
    services:
    
      db:
        image: mysql
    
      web:
        build:
          context: .
          dockerfile: docker/python/Dockerfile
        command: bash -c "sleep 3; python /code/manage.py migrate --noinput && python manage.py runserver 0.0.0.0:8000"
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
    
      redis:
        image: "redis:2.8"
    
      mongodb:
        image: mongo:latest
    

    关于 sqlite,您可以将共享卷与计算机/实例一起用于 db 文件本身。

    【讨论】:

    • 你只拉取了redis和mongod的镜像。我不需要定义运行 redis-server 和 mongod 的命令吗?
    • 你错了,redis 和 mongo Dockerfiles 包含启动进程的 CMD 层。评论前先试试
    猜你喜欢
    • 2014-03-10
    • 2021-01-25
    • 2013-11-21
    • 2019-01-09
    • 2019-12-25
    • 2021-11-22
    • 1970-01-01
    • 2016-07-09
    • 2015-08-17
    相关资源
    最近更新 更多