我开始学习 DevOps,并在 AWS 上安装了这个小应用程序,它基本上只是检查与 rds 和 redis 的连接。但是redis没有获取端口、主机等设置。一开始我把变量放入ci.yml中,没有用。然后我尝试使用 .env 文件进行 docker-compose 并得到相同的结果。现在有点迷失,因为没有其他想法如何解决它。代码是正确的,因为它是由更有经验的朋友提供给我的。
问题出在 redis 变量上,即 $REDIS_PORT 和 $REDIS_HOST。日志:请求方法:GET请求URL:13.53.189.243:8001/test_connection文件“/usr/local/lib/python3.9/site-packages/redis/connection.py”,第1415行,在get_connection连接= self ._available_connections.pop() 异常类型:/test_connection/ 处的 TypeError 异常值:int()参数必须是字符串、类似字节的对象或数字,而不是“NoneType
”问题是没有变量发送到redis,当我使用
docker exec -it backend_redis_container env | grep REDIS
命令时,我看到了所有变量,但是在连接时出现以下错误:
TypeError at /test_connection/ int() argument must be a string, a bytes-like object or a number, not 'NoneType
settings.py
ROOT_URLCONF = 'backend_redis.urls'
ROOT_HOSTCONF = 'backend_redis.hosts'
DEFAULT_HOST = 'default'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'backend_redis.wsgi.application'
# Redis settings
REDIS_HOST = os.environ.get('REDIS_HOST')
REDIS_PORT = os.environ.get('REDIS_PORT')
REDIS_DB = os.environ.get('REDIS_DB')
REDIS_PASSWORD = os.environ.get('REDIS_PASSWORD')
# Database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
NoneType 意味着环境变量未定义,如果您也没有看到环境变量,则意味着您需要确保它们已正确设置。以下是根据您的设置执行此操作的方法:
确保您的 docker-compose.yml 包含以下内容:
env_file:
- .env
并且 .env 文件内容应包含:
REDIS_HOST=your_redis_host
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=your_password_if_any
如果您直接使用 docker 运行容器,则需要传递如下环境变量:
docker run -e REDIS_HOST=your_redis_host \
-e REDIS_PORT=6379 \
-e REDIS_DB=0 \
-e REDIS_PASSWORD=your_password \
your_django_image
就是这样。那么如果您应用任何先前的解决方案,则此命令
docker exec -it backend_redis_container env | grep REDIS
将为您列出 REDIS 变量。
您可以从redis设置和配置中获取所有这些变量,并确保您没有禁用REDIS的密码身份验证,否则您将只能使用IAM来访问它。