我正在尝试在Docker部署我的Django项目和芹菜,我想将Redis用作后端。
django版本: 1.11.3
芹菜版本:4.1.0
我的docker-compose.yml
如下:
python:
image: python:latest
restart: always
expose:
- "8000"
volumes:
- ~/django/902Scratch/API:/home/django/API
- /var/sb2_files:/var/sb2_files
- /home/tuopinpin/JudgeServer/tests/test_case:/test_case
links:
- celery:celery
command: bash -c " cd /home/django/API && python manage.py runserver 0.0.0.0:8000"
ports:
- "0.0.0.0:8000:8000"
celery:
image: python:latest
restart: always
volumes:
- ~/django/902Scratch/API:/home/django/API
- /var/sb2_files:/var/sb2_files
user: nobody
depends_on:
- redis
links:
- redis:redis
command: bash -c " cd /home/django/API && celery -A API worker"
redis:
image: redis:alpine
restart: always
expose:
- '6379'
ports:
- '6379:6379'
django中的芹菜设置如下:
CELERY_BROKER_URL = 'redis://redis:6379/0'
CELERY_BROKER_TRANSPORT = 'redis'
CELERY_RESULT_BACKEND = "redis"
CELERY_BACKEND_URL = 'redis://redis:6379/1'
和celery -A proj report
返回以下设置:
celery_1 | software -> celery:4.1.0 (latentcall) kombu:4.1.0 py:3.6.5
celery_1 | billiard:3.5.0.3 redis:2.10.5
celery_1 | platform -> system:Linux arch:64bit, ELF imp:CPython
celery_1 | loader -> celery.loaders.app.AppLoader
celery_1 | settings -> transport:redis results:redis
celery_1 |
celery_1 | ABSOLUTE_URL_OVERRIDES: {
celery_1 | }
celery_1 | ADMINS: []
celery_1 | ALLOWED_HOSTS: ['*']
celery_1 | APPEND_SLASH: True
celery_1 | AUTHENTICATION_BACKENDS:
celery_1 | ('django.contrib.auth.backends.ModelBackend',)
celery_1 | AUTH_PASSWORD_VALIDATORS: '********'
celery_1 | AUTH_USER_MODEL: 'scratch_api.BaseUser'
celery_1 | AVATAR_AUTO_GENERATE_SIZES:
celery_1 | (160, 160)
celery_1 | AVATAR_CACHE_ENABLED: False
celery_1 | AVATAR_CHANGE_TEMPLATE: 'avatar/change_avatar.html'
celery_1 | AVATAR_CLEANUP_DELETED: True
celery_1 | AVATAR_DEFAULT_URL: 'img/user_img.png'
celery_1 | AVATAR_GRAVATAR_FIELD: 'username'
celery_1 | AVATAR_MAX_AVATARS_PER_USER: 1
celery_1 | AVATAR_PROVIDERS:
celery_1 | ('avatar.providers.PrimaryAvatarProvider',
celery_1 | 'avatar.providers.DefaultAvatarProvider')
celery_1 | BASE_DIR: '/home/django/API'
celery_1 | CACHES: {
celery_1 | 'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
celery_1 | CACHE_MIDDLEWARE_ALIAS: 'default'
celery_1 | CACHE_MIDDLEWARE_KEY_PREFIX: '********'
celery_1 | CACHE_MIDDLEWARE_SECONDS: 600
celery_1 | CELERY_BACKEND_URL: 'redis://redis:6379/0'
celery_1 | CELERY_BROKER_TRANSPORT: 'redis'
celery_1 | CELERY_BROKER_URL: 'redis://redis:6379/0'
celery_1 | CELERY_IMPORTS:
celery_1 | ('scratch_api.tasks',)
celery_1 | CELERY_RESULT_BACKEND: 'redis'
celery_1 | CKEDITOR_CONFIGS: {
celery_1 | 'default': { 'extraPlugins': 'codesnippet,uploadimage,widget,lineutils',
celery_1 | 'language': 'zh-Hans',
celery_1 | 'removePlugins': 'elementspath',
celery_1 | 'skin': 'moono',
celery_1 | 'toolbar': 'full'},
celery_1 | 'qa_ckeditor': { 'extraPlugins': 'codesnippet,uploadimage,widget,lineutils',
celery_1 | 'language': 'zh-Hans',
celery_1 | 'removePlugins': 'elementspath'}}
celery_1 | CKEDITOR_IMAGE_BACKEND: 'pillow'
celery_1 | CKEDITOR_UPLOAD_PATH: 'course/'
celery_1 | COMMENTS_APP: 'fluent_comments'
celery_1 | CORS_ALLOW_HEADERS:
celery_1 | ('Authorization',)
celery_1 | CORS_ALLOW_METHODS:
celery_1 | ('GET', 'POST')
celery_1 | CORS_ORIGIN_ALLOW_ALL: True
celery_1 | CRISPY_TEMPLATE_PACK: 'bootstrap3'
celery_1 | CSRF_COOKIE_AGE: 31449600
celery_1 | CSRF_COOKIE_DOMAIN: None
celery_1 | CSRF_COOKIE_HTTPONLY: False
celery_1 | CSRF_COOKIE_NAME: 'csrftoken'
celery_1 | CSRF_COOKIE_PATH: '/'
celery_1 | CSRF_COOKIE_SECURE: False
celery_1 | CSRF_FAILURE_VIEW: 'django.views.csrf.csrf_failure'
celery_1 | CSRF_HEADER_NAME: 'HTTP_X_CSRFTOKEN'
celery_1 | CSRF_TRUSTED_ORIGINS: []
celery_1 | CSRF_USE_SESSIONS: False
celery_1 | DATABASES: {
celery_1 | 'default': { 'ENGINE': 'django.db.backends.sqlite3',
celery_1 | 'NAME': '/home/django/API/db.sqlite3'}}
celery_1 | DATABASE_ROUTERS: '********'
celery_1 | DATA_UPLOAD_MAX_MEMORY_SIZE: 2621440
celery_1 | DATA_UPLOAD_MAX_NUMBER_FIELDS: 1000
celery_1 | DATETIME_FORMAT: 'N j, Y, P'
celery_1 | DATETIME_INPUT_FORMATS: ['%Y-%m-%d %H:%M:%S',
celery_1 | '%Y-%m-%d %H:%M:%S.%f',
celery_1 | '%Y-%m-%d %H:%M',
celery_1 | '%Y-%m-%d',
celery_1 | '%m/%d/%Y %H:%M:%S',
celery_1 | '%m/%d/%Y %H:%M:%S.%f',
celery_1 | '%m/%d/%Y %H:%M',
celery_1 | '%m/%d/%Y',
celery_1 | '%m/%d/%y %H:%M:%S',
celery_1 | '%m/%d/%y %H:%M:%S.%f',
celery_1 | '%m/%d/%y %H:%M',
celery_1 | '%m/%d/%y']
celery_1 | DATE_FORMAT: 'N j, Y'
celery_1 | DATE_INPUT_FORMATS: ['%Y-%m-%d',
celery_1 | '%m/%d/%Y',
celery_1 | '%m/%d/%y',
celery_1 | '%b %d %Y',
celery_1 | '%b %d, %Y',
celery_1 | '%d %b %Y',
celery_1 | '%d %b, %Y',
celery_1 | '%B %d %Y',
celery_1 | '%B %d, %Y',
celery_1 | '%d %B %Y',
celery_1 | '%d %B, %Y']
celery_1 | DEBUG: True
celery_1 | DEBUG_PROPAGATE_EXCEPTIONS: False
celery_1 | DECIMAL_SEPARATOR: '.'
celery_1 | DEFAULT_CHARSET: 'utf-8'
celery_1 | DEFAULT_CONTENT_TYPE: 'text/html'
celery_1 | DEFAULT_EXCEPTION_REPORTER_FILTER: 'django.views.debug.SafeExceptionReporterFilter'
celery_1 | DEFAULT_FILE_STORAGE: 'django.core.files.storage.FileSystemStorage'
celery_1 | DEFAULT_FROM_EMAIL: 'tuopinpin@www.tuopinpin.com'
celery_1 | DEFAULT_INDEX_TABLESPACE: ''
celery_1 | DEFAULT_TABLESPACE: ''
celery_1 | DISALLOWED_USER_AGENTS: []
celery_1 | EMAIL_BACKEND: 'django.core.mail.backends.smtp.EmailBackend'
celery_1 | EMAIL_HOST: 'smtpdm.aliyun.com'
celery_1 | EMAIL_HOST_PASSWORD: '********'
celery_1 | EMAIL_HOST_USER: 'tuopinpin@www.tuopinpin.com'
celery_1 | EMAIL_PORT: 25
celery_1 | EMAIL_SSL_CERTFILE: None
celery_1 | EMAIL_SSL_KEYFILE: '********'
celery_1 | EMAIL_SUBJECT_PREFIX: '[Django] '
celery_1 | EMAIL_TIMEOUT: None
celery_1 | EMAIL_USE_LOCALTIME: False
celery_1 | EMAIL_USE_SSL: False
celery_1 | EMAIL_USE_TLS: False
celery_1 | FILE_CHARSET: 'utf-8'
celery_1 | FILE_UPLOAD_DIRECTORY_PERMISSIONS: None
celery_1 | FILE_UPLOAD_HANDLERS: ['django.core.files.uploadhandler.MemoryFileUploadHandler',
celery_1 | 'django.core.files.uploadhandler.TemporaryFileUploadHandler']
celery_1 | FILE_UPLOAD_MAX_MEMORY_SIZE: 2621440
celery_1 | FILE_UPLOAD_PERMISSIONS: None
celery_1 | FILE_UPLOAD_TEMP_DIR: None
celery_1 | FIRST_DAY_OF_WEEK: 0
celery_1 | FIXTURE_DIRS: []
celery_1 | FLUENT_COMMENTS_EXCLUDE_FIELDS:
celery_1 | ('name', 'email', 'url', 'title')
celery_1 | FLUENT_COMMENTS_FORM_CLASS: 'API.comments.CommentForm'
celery_1 | FLUENT_COMMENTS_USE_EMAIL_NOTIFICATION: False
celery_1 | FORCE_SCRIPT_NAME: None
celery_1 | FORMAT_MODULE_PATH: None
celery_1 | FORM_RENDERER: 'django.forms.renderers.DjangoTemplates'
celery_1 | IGNORABLE_404_URLS: []
celery_1 | INSTALLED_APPS: ['django.contrib.admin',
celery_1 | 'django.contrib.auth',
celery_1 | 'django.contrib.contenttypes',
celery_1 | 'django.contrib.sessions',
celery_1 | 'django.contrib.messages',
celery_1 | 'django.contrib.staticfiles',
celery_1 | 'scratch_api.apps.ScratchApiConfig',
celery_1 | 'course.apps.CourseConfig',
celery_1 | 'rest_framework',
celery_1 | 'rest_framework.authtoken',
celery_1 | 'corsheaders',
celery_1 | 'django_tables2',
celery_1 | 'ckeditor',
celery_1 | 'ckeditor_uploader',
celery_1 | 'website',
celery_1 | 'dry_rest_permissions',
celery_1 | 'ordered_model',
celery_1 | 'production_process',
celery_1 | 'guardian',
celery_1 | 'fluent_comments',
celery_1 | 'threadedcomments',
celery_1 | 'crispy_forms',
celery_1 | 'django_comments',
celery_1 | 'django.contrib.sites',
celery_1 | 'OJ',
celery_1 | 'bootstrap4',
celery_1 | 'django_filters',
celery_1 | 'notifications',
celery_1 | 'qa',
celery_1 | 'mptt',
celery_1 | 'avatar',
celery_1 | 'taggit',
celery_1 | 'qr_code',
celery_1 | 'pinax.badges',
celery_1 | 'password_reset']
celery_1 | INTERNAL_IPS: []
celery_1 | LANGUAGES: [('zh-hans', '中文简体'), ('en', 'English')]
celery_1 | LANGUAGES_BIDI: ['he', 'ar', 'fa', 'ur']
celery_1 | LANGUAGE_CODE: 'zh-hans'
celery_1 | LANGUAGE_COOKIE_AGE: None
celery_1 | LANGUAGE_COOKIE_DOMAIN: None
celery_1 | LANGUAGE_COOKIE_NAME: 'django_language'
celery_1 | LANGUAGE_COOKIE_PATH: '/'
celery_1 | LOCALE_PATHS: []
celery_1 | LOGGING: {
celery_1 | }
celery_1 | LOGGING_CONFIG: 'logging.config.dictConfig'
celery_1 | LOGIN_REDIRECT_URL: '/t/index'
celery_1 | LOGIN_URL: '/accounts/login/'
celery_1 | LOGOUT_REDIRECT_URL: '/t/'
celery_1 | MANAGERS: []
celery_1 | MEDIA_ROOT: 'media/'
celery_1 | MEDIA_URL: '/media/'
celery_1 | MESSAGE_STORAGE: 'django.contrib.messages.storage.fallback.FallbackStorage'
celery_1 | MIDDLEWARE: ['django.middleware.security.SecurityMiddleware',
celery_1 | 'django.contrib.sessions.middleware.SessionMiddleware',
celery_1 | 'django.middleware.locale.LocaleMiddleware',
celery_1 | 'corsheaders.middleware.CorsMiddleware',
celery_1 | 'django.middleware.common.CommonMiddleware',
celery_1 | 'django.middleware.csrf.CsrfViewMiddleware',
celery_1 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
celery_1 | 'scratch_api.middleware.one_session_per_user_middleware',
celery_1 | 'django.contrib.messages.middleware.MessageMiddleware',
celery_1 | 'django.middleware.clickjacking.XFrameOptionsMiddleware']
celery_1 | MIDDLEWARE_CLASSES: ['django.middleware.common.CommonMiddleware',
celery_1 | 'django.middleware.csrf.CsrfViewMiddleware']
celery_1 | MIGRATION_MODULES: {
celery_1 | }
celery_1 | MONTH_DAY_FORMAT: 'F j'
celery_1 | NUMBER_GROUPING: 0
celery_1 | PASSWORD_HASHERS: '********'
celery_1 | PASSWORD_RESET_TIMEOUT_DAYS: '********'
celery_1 | PREPEND_WWW: False
celery_1 | PROFANITIES_LIST: '********'
celery_1 | REST_FRAMEWORK: {
celery_1 | 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication',),
celery_1 | 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',)}
celery_1 | ROOT_URLCONF: 'API.urls'
celery_1 | SECRET_KEY: '********'
celery_1 | SECURE_BROWSER_XSS_FILTER: False
celery_1 | SECURE_CONTENT_TYPE_NOSNIFF: False
celery_1 | SECURE_HSTS_INCLUDE_SUBDOMAINS: False
celery_1 | SECURE_HSTS_PRELOAD: False
celery_1 | SECURE_HSTS_SECONDS: 0
celery_1 | SECURE_PROXY_SSL_HEADER: None
celery_1 | SECURE_REDIRECT_EXEMPT: []
celery_1 | SECURE_SSL_HOST: None
celery_1 | SECURE_SSL_REDIRECT: False
celery_1 | SERVER_EMAIL: 'root@localhost'
celery_1 | SESSION_CACHE_ALIAS: 'default'
celery_1 | SESSION_COOKIE_AGE: 1209600
celery_1 | SESSION_COOKIE_DOMAIN: None
celery_1 | SESSION_COOKIE_HTTPONLY: False
celery_1 | SESSION_COOKIE_NAME: 'sessionid'
celery_1 | SESSION_COOKIE_PATH: '/'
celery_1 | SESSION_COOKIE_SECURE: False
celery_1 | SESSION_ENGINE: 'django.contrib.sessions.backends.db'
celery_1 | SESSION_EXPIRE_AT_BROWSER_CLOSE: True
celery_1 | SESSION_FILE_PATH: None
celery_1 | SESSION_SAVE_EVERY_REQUEST: False
celery_1 | SESSION_SERIALIZER: 'django.contrib.sessions.serializers.JSONSerializer'
celery_1 | SETTINGS_MODULE: 'API.settings'
celery_1 | SHORT_DATETIME_FORMAT: 'Y/m/d G:i:s'
celery_1 | SHORT_DATE_FORMAT: 'm/d/Y'
celery_1 | SIGNING_BACKEND: 'django.core.signing.TimestampSigner'
celery_1 | SILENCED_SYSTEM_CHECKS: []
celery_1 | SITE_ID: 2
celery_1 | STATICFILES_DIRS:
celery_1 | ('/home/django/API/static/',)
celery_1 | STATICFILES_FINDERS: ['django.contrib.staticfiles.finders.FileSystemFinder',
celery_1 | 'django.contrib.staticfiles.finders.AppDirectoriesFinder']
celery_1 | STATICFILES_STORAGE: 'django.contrib.staticfiles.storage.StaticFilesStorage'
celery_1 | STATIC_ROOT: None
celery_1 | STATIC_URL: '/static/'
celery_1 | TEMPLATES: [{'APP_DIRS': True,
celery_1 | 'BACKEND': 'django.template.backends.django.DjangoTemplates',
celery_1 | 'DIRS': ['/home/django/API/templates',
celery_1 | '/home/django/API/html'],
celery_1 | 'OPTIONS': {'context_processors': ['django.template.context_processors.debug',
celery_1 | 'django.template.context_processors.request',
celery_1 | 'django.contrib.auth.context_processors.auth',
celery_1 | 'django.contrib.messages.context_processors.messages',
celery_1 | 'django.template.context_processors.request']}}]
celery_1 | TEST_NON_SERIALIZED_APPS: []
celery_1 | TEST_RUNNER: 'django.test.runner.DiscoverRunner'
celery_1 | THOUSAND_SEPARATOR: ','
celery_1 | TIME_FORMAT: 'P'
celery_1 | TIME_INPUT_FORMATS: ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
celery_1 | TIME_ZONE: 'Asia/Shanghai'
celery_1 | USE_ETAGS: False
celery_1 | USE_I18N: True
celery_1 | USE_L10N: True
celery_1 | USE_THOUSAND_SEPARATOR: False
celery_1 | USE_TZ: True
celery_1 | USE_X_FORWARDED_HOST: False
celery_1 | USE_X_FORWARDED_PORT: False
celery_1 | WSGI_APPLICATION: 'API.wsgi.application'
celery_1 | X_FRAME_OPTIONS: 'SAMEORIGIN'
celery_1 | YEAR_MONTH_FORMAT: 'F Y'
celery_1 | is_overridden: <bound method Settings.is_overridden of <Settings "API.settings">>
celery_1 | task_serializer: 'json'
celery_1 | accept_content: ['json', 'pickle']
celery_1 |
但是,当我提交应返回结果的任务时,堆栈跟踪如下:
python_1 | Internal Server Error: /OJ/submit/
python_1 | Traceback (most recent call last):
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 439, in connect
python_1 | sock = self._connect()
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 494, in _connect
python_1 | raise err
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 482, in _connect
python_1 | sock.connect(socket_address)
python_1 | OSError: [Errno 99] Cannot assign requested address
python_1 |
python_1 | During handling of the above exception, another exception occurred:
python_1 |
python_1 | Traceback (most recent call last):
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/client.py", line 2165, in _execute
python_1 | return command(*args)
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 563, in send_command
python_1 | self.send_packed_command(self.pack_command(*args))
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 538, in send_packed_command
python_1 | self.connect()
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 442, in connect
python_1 | raise ConnectionError(self._error_message(e))
python_1 | redis.exceptions.ConnectionError: Error 99 connecting to localhost:6379. Cannot assign requested address.
python_1 |
python_1 | During handling of the above exception, another exception occurred:
python_1 |
python_1 | Traceback (most recent call last):
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 439, in connect
python_1 | sock = self._connect()
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 494, in _connect
python_1 | raise err
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 482, in _connect
python_1 | sock.connect(socket_address)
python_1 | OSError: [Errno 99] Cannot assign requested address
python_1 |
python_1 | During handling of the above exception, another exception occurred:
python_1 |
python_1 | Traceback (most recent call last):
python_1 | File "/usr/local/lib/python3.6/site-packages/kombu/connection.py", line 414, in _reraise_as_library_errors
python_1 | yield
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/app/base.py", line 736, in send_task
python_1 | self.backend.on_task_call(P, task_id)
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/backends/redis.py", line 189, in on_task_call
python_1 | self.result_consumer.consume_from(task_id)
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/backends/redis.py", line 75, in consume_from
python_1 | return self.start(task_id)
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/backends/redis.py", line 57, in start
python_1 | self._consume_from(initial_task_id)
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/backends/redis.py", line 82, in _consume_from
python_1 | self._pubsub.subscribe(key)
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/client.py", line 2229, in subscribe
python_1 | ret_val = self.execute_command('SUBSCRIBE', *iterkeys(new_channels))
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/client.py", line 2161, in execute_command
python_1 | self._execute(connection, connection.send_command, *args)
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/client.py", line 2172, in _execute
python_1 | connection.connect()
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 442, in connect
python_1 | raise ConnectionError(self._error_message(e))
python_1 | redis.exceptions.ConnectionError: Error 99 connecting to localhost:6379. Cannot assign requested address.
python_1 |
python_1 | During handling of the above exception, another exception occurred:
python_1 |
python_1 | Traceback (most recent call last):
python_1 | File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
python_1 | response = get_response(request)
python_1 | File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
python_1 | response = self.process_exception_by_middleware(e, request)
python_1 | File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
python_1 | response = wrapped_callback(request, *callback_args, **callback_kwargs)
python_1 | File "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
python_1 | return view_func(*args, **kwargs)
python_1 | File "/usr/local/lib/python3.6/site-packages/django/views/generic/base.py", line 68, in view
python_1 | return self.dispatch(request, *args, **kwargs)
python_1 | File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 489, in dispatch
python_1 | response = self.handle_exception(exc)
python_1 | File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 449, in handle_exception
python_1 | self.raise_uncaught_exception(exc)
python_1 | File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 486, in dispatch
python_1 | response = handler(request, *args, **kwargs)
python_1 | File "/home/django/API/OJ/ajax_views.py", line 30, in post
python_1 | task = judge.delay(submission.id)
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/app/task.py", line 413, in delay
python_1 | return self.apply_async(args, kwargs)
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/app/task.py", line 536, in apply_async
python_1 | **options
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/app/base.py", line 737, in send_task
python_1 | amqp.send_task_message(P, name, message, **options)
python_1 | File "/usr/local/lib/python3.6/contextlib.py", line 99, in __exit__
python_1 | self.gen.throw(type, value, traceback)
python_1 | File "/usr/local/lib/python3.6/site-packages/kombu/connection.py", line 419, in _reraise_as_library_errors
python_1 | sys.exc_info()[2])
python_1 | File "/usr/local/lib/python3.6/site-packages/vine/five.py", line 178, in reraise
python_1 | raise value.with_traceback(tb)
python_1 | File "/usr/local/lib/python3.6/site-packages/kombu/connection.py", line 414, in _reraise_as_library_errors
python_1 | yield
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/app/base.py", line 736, in send_task
python_1 | self.backend.on_task_call(P, task_id)
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/backends/redis.py", line 189, in on_task_call
python_1 | self.result_consumer.consume_from(task_id)
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/backends/redis.py", line 75, in consume_from
python_1 | return self.start(task_id)
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/backends/redis.py", line 57, in start
python_1 | self._consume_from(initial_task_id)
python_1 | File "/usr/local/lib/python3.6/site-packages/celery/backends/redis.py", line 82, in _consume_from
python_1 | self._pubsub.subscribe(key)
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/client.py", line 2229, in subscribe
python_1 | ret_val = self.execute_command('SUBSCRIBE', *iterkeys(new_channels))
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/client.py", line 2161, in execute_command
python_1 | self._execute(connection, connection.send_command, *args)
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/client.py", line 2172, in _execute
python_1 | connection.connect()
python_1 | File "/usr/local/lib/python3.6/site-packages/redis/connection.py", line 442, in connect
python_1 | raise ConnectionError(self._error_message(e))
python_1 | kombu.exceptions.OperationalError: Error 99 connecting to localhost:6379. Cannot assign requested address.
我很困惑,因为我将CELERY_BACKEND_URL
修改为redis://redis:6379/0
。Redis是Docker-Compose中的主机名,但似乎芹菜正在尝试连接到Localhost。我尝试在没有Docker的情况下部署所有这些,然后将CELERY_BACKEND_URL
重新修改为127.0.0.1,一切正常。我还尝试使用Python Docker和Celery Docker上的Python Redis库连接到Redis,并且在两个Dockers中都可以使用Redis。
我会尝试在同一docker网络中将它们设置为首先,然后检查它们是否可以互相看见,在您的Docker-Compose运行后尝试docker exec -it celery curl redis:6379
您可以检查的另一件事是用/0
和/1
检查docker exec -it redis curl localhost:6379
更多,但要检查的第一件事是您所有的服务都正确运行,并且您的容器可以互相看到
将python容器链接到redis容器,而不是芹菜容器。
在Django应用程序中创建任务时,它将任务写入Redis。然后,芹菜工人从Redis读取,反之亦然。