I want to make a minor change in openedx image, because of the low network condition in china, I need to change the apt source mirror.
But when I run docker build -t in tutorâs build/openedx directory, it says
Error response from daemon: Dockerfile parse error line 86: unknown instruction: {{
And I donât know what {{ patch⌠}} mean and how it works, how to build my own docker image with the dockerfile in tutor. Please help me with some instructions. Thanks very much!
Hi @teruun! Funny how things seem obvious to me when in fact this kind of information is documented nowhere
Please first take a look at the following post which explains how tutor works: Logic of config.yml and JSON config files
So, to answer your question: the files in tutor/templates
are Jinja2 template files that are rendered in the $(tutor config printroot)/env
folder. This is why these files contain {{ some_variable_name }}
stuff.
As for {{ patch "..." }}
instructions: these are places that can be customised by plugins. See the relevant docs: https://docs.tutor.overhang.io/plugins.html#patches
Does that answer your question?
I created an issue to remind me to improve the docs on this specific topic: https://github.com/overhangio/tutor/issues/273
In your case, it will be difficult to improve the base openedx docker image without forking the project. It would be easier for you if you could easily modify the base docker image (âubuntu:16.04â), for instance with a configuration variable. You would then be able to point to your own China-optimized ubuntu image. Please let me know how you manage to solve this problem.
Hi, thank you regis, i substituted the âubuntu:16.04â with my own china-optimized ubuntu and now it can download things rather quickly. I installed a shadowsocks client in it, changed the apt source with aliyunâs source mirror, and everytime when tutor needs to download things with git, I invoked the shadowsocks.
And I also added a new language folder under â/openedx/localeâ path in the openedx image.
A problem is the shadowsocks client canât run in detached mode, so I have to edit your dockerfile and everytime git clone occurs, I have to run shadowsocks first. Docker ubuntu seems donât support systemd.
Hi, regis, thanks again. after I used my own docker image, the development mode lms and cms is working find but the forum no longer works, and the production mode also having an error: tutor_local_openedx-assets_1 exited with code 0
Below is the error message displayed in discussion forum. Any idea how to fix this?
Environment:
Request Method: GET
Request URL: http://localhost:8000/courses/course-v1:edX+DemoX+Demo_Course/discussion/forum/Django Version: 1.11.21
Python Version: 2.7.12
Installed Applications:
[âdjango.contrib.authâ,
âdjango.contrib.contenttypesâ,
âdjango.contrib.humanizeâ,
âdjango.contrib.messagesâ,
âdjango.contrib.redirectsâ,
âdjango.contrib.sessionsâ,
âdjango.contrib.sitesâ,
âdjango.contrib.staticfilesâ,
âdjceleryâ,
âopenedx.core.djangoapps.common_initialization.apps.CommonInitializationConfigâ,
âlms_initialization.apps.LMSInitializationConfigâ,
âopenedx.core.djangoapps.common_viewsâ,
âsimple_historyâ,
âconfig_modelsâ,
âopenedx.core.djangoapps.config_model_utilsâ,
âwaffleâ,
âopenedx.core.djangoapps.service_statusâ,
âstatusâ,
âedxmako.apps.EdxMakoConfigâ,
âpipelineâ,
âstatic_replaceâ,
âwebpack_loaderâ,
âweb_fragmentsâ,
âopenedx.core.djangoapps.plugin_apiâ,
âopenedx.core.djangoapps.contentserverâ,
âopenedx.core.djangoapps.site_configurationâ,
âopenedx.core.djangoapps.video_configâ,
âopenedx.core.djangoapps.video_pipelineâ,
âcoursewareâ,
âstudent.apps.StudentConfigâ,
âstatic_template_viewâ,
âstaticbookâ,
âtrackâ,
âeventtracking.django.apps.EventTrackingConfigâ,
âutilâ,
âlms.djangoapps.certificates.apps.CertificatesConfigâ,
âdashboardâ,
âlms.djangoapps.instructor_taskâ,
âopenedx.core.djangoapps.course_groupsâ,
âbulk_emailâ,
âbrandingâ,
âsupportâ,
âopenedx.core.djangoapps.external_authâ,
âdjango_openid_authâ,
âproviderâ,
âprovider.oauth2â,
âedx_oauth2_providerâ,
âoauth2_providerâ,
âopenedx.core.djangoapps.oauth_dispatch.apps.OAuthDispatchAppConfigâ,
âthird_party_authâ,
âoauth_providerâ,
âopenedx.core.djangoapps.auth_exchangeâ,
âwikiâ,
âdjango_notifyâ,
âcourse_wikiâ,
âmpttâ,
âsekizaiâ,
âwiki.plugins.linksâ,
âcourse_wiki.plugins.markdownedxâ,
âdjango.contrib.adminâ,
âdebugâ,
âopenedx.core.djangoapps.util.apps.UtilConfigâ,
âdjango_comment_clientâ,
âdjango_comment_commonâ,
âdiscussion_apiâ,
ânotesâ,
âedxnotesâ,
âsplashâ,
ârest_frameworkâ,
âopenedx.core.djangoapps.user_apiâ,
âshoppingcartâ,
ânotification_prefsâ,
ânotifier_apiâ,
âcourse_modes.apps.CourseModesConfigâ,
âenrollmentâ,
âentitlements.apps.EntitlementsConfigâ,
âbulk_enrollâ,
âlms.djangoapps.verify_student.apps.VerifyStudentConfigâ,
âopenedx.core.djangoapps.dark_langâ,
âmicrosite_configuration.apps.MicrositeConfigurationConfigâ,
ârss_proxyâ,
âopenedx.core.djangoapps.embargoâ,
âcourse_action_stateâ,
âedx_jsmeâ,
âdjango_countriesâ,
âmobile_apiâ,
âsocial_djangoâ,
âsurvey.apps.SurveyConfigâ,
âlms.djangoapps.lms_xblock.apps.LMSXBlockConfigâ,
âsubmissionsâ,
âopenassessmentâ,
âopenassessment.assessmentâ,
âopenassessment.fileuploadâ,
âopenassessment.workflowâ,
âopenassessment.xblockâ,
âedxvalâ,
âopenedx.core.djangoapps.content.course_overviews.apps.CourseOverviewsConfigâ,
âopenedx.core.djangoapps.content.block_structure.apps.BlockStructureConfigâ,
âlms.djangoapps.course_blocksâ,
âopenedx.core.djangoapps.coursegraph.apps.CoursegraphConfigâ,
âmailingâ,
âcorsheadersâ,
âopenedx.core.djangoapps.cors_csrfâ,
âlms.djangoapps.commerce.apps.CommerceConfigâ,
âopenedx.core.djangoapps.credit.apps.CreditConfigâ,
âlms.djangoapps.teamsâ,
âxblock_djangoâ,
âopenedx.core.djangoapps.programs.apps.ProgramsConfigâ,
âopenedx.core.djangoapps.catalogâ,
âopenedx.core.djangoapps.self_pacedâ,
âsorl.thumbnailâ,
âmilestonesâ,
âgating.apps.GatingConfigâ,
âstatici18nâ,
âopenedx.core.djangoapps.api_adminâ,
âopenedx.core.djangoapps.verified_track_contentâ,
âlearner_dashboardâ,
âbadges.apps.BadgesConfigâ,
âdjango_sites_extensionsâ,
âemail_marketing.apps.EmailMarketingConfigâ,
ârelease_utilâ,
âcelery_utilsâ,
âopenedx.core.djangoapps.crawlersâ,
âdatabase_fixupsâ,
âopenedx.core.djangoapps.waffle_utilsâ,
âlms.djangoapps.course_goalsâ,
âopenedx.features.course_bookmarksâ,
âopenedx.features.course_experienceâ,
âopenedx.features.course_searchâ,
âopenedx.features.enterprise_support.apps.EnterpriseSupportConfigâ,
âopenedx.features.learner_profileâ,
âopenedx.features.learner_analyticsâ,
âopenedx.features.portfolio_projectâ,
âopenedx.features.course_duration_limitsâ,
âopenedx.features.content_type_gatingâ,
âexperimentsâ,
âdjango_filtersâ,
ârest_framework_swaggerâ,
âcsrf.apps.CsrfAppConfigâ,
âedx_sgaâ,
âorganizationsâ,
âenterpriseâ,
âconsentâ,
âintegrated_channels.integrated_channelâ,
âintegrated_channels.degreedâ,
âintegrated_channels.sap_success_factorsâ,
âintegrated_channels.xapiâ,
âdjango_object_actionsâ,
uâopenedx.core.djangoapps.password_policy.apps.PasswordPolicyConfigâ,
uâopenedx.core.djangoapps.ace_common.apps.AceCommonConfigâ,
uâlms.djangoapps.discussion.apps.DiscussionConfigâ,
uâopenedx.core.djangoapps.schedules.apps.SchedulesConfigâ,
uâlms.djangoapps.grades.apps.GradesConfigâ,
uâopenedx.core.djangoapps.user_authn.apps.UserAuthnConfigâ,
uâopenedx.core.djangoapps.plugins.apps.PluginsConfigâ,
uâopenedx.core.djangoapps.zendesk_proxy.apps.ZendeskProxyConfigâ,
uâopenedx.core.djangoapps.credentials.apps.CredentialsConfigâ,
uâopenedx.core.djangoapps.bookmarks.apps.BookmarksConfigâ,
uâlms.djangoapps.instructor.apps.InstructorConfigâ,
uâopenedx.features.journals.apps.JournalsConfigâ,
uâopenedx.core.djangoapps.theming.apps.ThemingConfigâ,
uâedx_proctoring.apps.EdxProctoringConfigâ,
uâcompletion.apps.CompletionAppConfigâ,
âdebug_toolbarâ,
âdebug_toolbar_mongoâ]
Installed Middleware:
[âopenedx.core.lib.x_forwarded_for.middleware.XForwardedForMiddlewareâ,
âcrum.CurrentRequestUserMiddlewareâ,
âedx_django_utils.cache.middleware.RequestCacheMiddlewareâ,
âedx_django_utils.monitoring.middleware.MonitoringCustomMetricsMiddlewareâ,
âmobile_api.middleware.AppVersionUpgradeâ,
âopenedx.core.djangoapps.header_control.middleware.HeaderControlMiddlewareâ,
âmicrosite_configuration.middleware.MicrositeMiddlewareâ,
âdjango_comment_client.middleware.AjaxExceptionMiddlewareâ,
âdjango.middleware.common.CommonMiddlewareâ,
âdjango.contrib.sites.middleware.CurrentSiteMiddlewareâ,
âedx_rest_framework_extensions.auth.jwt.middleware.JwtAuthCookieMiddlewareâ,
âdjango_sites_extensions.middleware.RedirectMiddlewareâ,
âopenedx.core.djangoapps.safe_sessions.middleware.SafeSessionMiddlewareâ,
âopenedx.core.djangoapps.cache_toolbox.middleware.CacheBackedAuthenticationMiddlewareâ,
âstudent.middleware.UserStandingMiddlewareâ,
âopenedx.core.djangoapps.contentserver.middleware.StaticContentServerâ,
âopenedx.core.djangoapps.user_api.middleware.UserTagsEventContextMiddlewareâ,
âdjango.contrib.messages.middleware.MessageMiddlewareâ,
âtrack.middleware.TrackMiddlewareâ,
âcorsheaders.middleware.CorsMiddlewareâ,
âopenedx.core.djangoapps.cors_csrf.middleware.CorsCSRFMiddlewareâ,
âopenedx.core.djangoapps.cors_csrf.middleware.CsrfCrossDomainCookieMiddlewareâ,
âdjango.middleware.csrf.CsrfViewMiddlewareâ,
âsplash.middleware.SplashMiddlewareâ,
âopenedx.core.djangoapps.geoinfo.middleware.CountryMiddlewareâ,
âopenedx.core.djangoapps.embargo.middleware.EmbargoMiddlewareâ,
âopenedx.core.djangoapps.lang_pref.middleware.LanguagePreferenceMiddlewareâ,
âopenedx.core.djangoapps.dark_lang.middleware.DarkLangMiddlewareâ,
âdjango.middleware.locale.LocaleMiddlewareâ,
âdjango_comment_client.utils.ViewNameMiddlewareâ,
âcodejail.django_integration.ConfigureCodeJailMiddlewareâ,
âratelimitbackend.middleware.RateLimitMiddlewareâ,
âopenedx.core.djangoapps.session_inactivity_timeout.middleware.SessionInactivityTimeoutâ,
âdjango.middleware.clickjacking.XFrameOptionsMiddlewareâ,
âcourseware.middleware.CacheCourseIdMiddlewareâ,
âcourseware.middleware.RedirectMiddlewareâ,
âcourse_wiki.middleware.WikiAccessMiddlewareâ,
âopenedx.core.djangoapps.theming.middleware.CurrentSiteThemeMiddlewareâ,
âwaffle.middleware.WaffleMiddlewareâ,
âopenedx.features.enterprise_support.middleware.EnterpriseMiddlewareâ,
âedx_django_utils.cache.middleware.TieredCacheMiddlewareâ,
âedx_rest_framework_extensions.middleware.RequestMetricsMiddlewareâ,
âedx_rest_framework_extensions.auth.jwt.middleware.EnsureJWTAuthSettingsMiddlewareâ,
âopenedx.core.djangoapps.site_configuration.middleware.SessionCookieDomainOverrideMiddlewareâ,
âdjango_comment_client.utils.QueryCountDebugMiddlewareâ,
âdebug_toolbar.middleware.DebugToolbarMiddlewareâ]Traceback:
File â/openedx/venv/local/lib/python2.7/site-packages/django/core/handlers/exception.pyâ in inner
41. response = get_response(request)File â/openedx/venv/local/lib/python2.7/site-packages/django/core/handlers/base.pyâ in _legacy_get_response
249. response = self._get_response(request)File â/openedx/venv/local/lib/python2.7/site-packages/django/core/handlers/base.pyâ in _get_response
187. response = self.process_exception_by_middleware(e, request)File â/openedx/venv/local/lib/python2.7/site-packages/django/core/handlers/base.pyâ in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)File â/openedx/venv/local/lib/python2.7/site-packages/django/utils/decorators.pyâ in inner
185. return func(*args, **kwargs)File â/openedx/venv/local/lib/python2.7/site-packages/django/contrib/auth/decorators.pyâ in _wrapped_view
23. return view_func(request, *args, **kwargs)File â/openedx/edx-platform/lms/djangoapps/discussion/views.pyâ in wrapped_view
188. return view_func(request, course_key, *args, **kwargs)File â/openedx/edx-platform/lms/djangoapps/discussion/views.pyâ in forum_form_discussion
282. return tab_view.get(request, course_id, âdiscussionâ)File â/openedx/venv/local/lib/python2.7/site-packages/django/utils/decorators.pyâ in _wrapper
67. return bound_func(*args, **kwargs)File â/openedx/venv/local/lib/python2.7/site-packages/django/utils/decorators.pyâ in _wrapped_view
149. response = view_func(request, *args, **kwargs)File â/openedx/venv/local/lib/python2.7/site-packages/django/utils/decorators.pyâ in bound_func
63. return func.get(self, type(self))(*args2, **kwargs2)File â/openedx/venv/local/lib/python2.7/site-packages/django/utils/decorators.pyâ in _wrapper
67. return bound_func(*args, **kwargs)File â/openedx/edx-platform/common/djangoapps/util/views.pyâ in inner
49. response = view_func(request, *args, **kwargs)File â/openedx/venv/local/lib/python2.7/site-packages/django/utils/decorators.pyâ in bound_func
63. return func.get(self, type(self))(*args2, **kwargs2)File â/openedx/venv/local/lib/python2.7/site-packages/django/utils/decorators.pyâ in _wrapper
67. return bound_func(*args, **kwargs)File â/openedx/edx-platform/openedx/features/enterprise_support/api.pyâ in inner
313. return view_func(request, course_id, *args, **kwargs)File â/openedx/venv/local/lib/python2.7/site-packages/django/utils/decorators.pyâ in bound_func
63. return func.get(self, type(self))(*args2, **kwargs2)File â/openedx/edx-platform/lms/djangoapps/courseware/views/views.pyâ in get
523. return CourseTabView.handle_exceptions(request, course, exception)File â/openedx/edx-platform/lms/djangoapps/courseware/views/views.pyâ in get
521. return super(CourseTabView, self).get(request, course=course, page_context=page_context, **kwargs)File â/openedx/venv/local/lib/python2.7/site-packages/web_fragments/views.pyâ in get
26. fragment = self.render_to_fragment(request, **kwargs)File â/openedx/edx-platform/lms/djangoapps/courseware/views/views.pyâ in render_to_fragment
656. return tab.render_to_fragment(request, course, **kwargs)File â/openedx/edx-platform/common/lib/xmodule/xmodule/tabs.pyâ in render_to_fragment
294. return self.fragment_view.render_to_fragment(request, course_id=unicode(course.id), **kwargs)File â/openedx/edx-platform/lms/djangoapps/discussion/views.pyâ in render_to_fragment
704. base_context = _create_base_discussion_view_context(request, course_key)File â/openedx/edx-platform/lms/djangoapps/discussion/views.pyâ in _create_base_discussion_view_context
405. user_info = cc_user.to_dict()File â/openedx/edx-platform/lms/lib/comment_client/models.pyâ in to_dict
59. self.retrieve()File â/openedx/edx-platform/lms/lib/comment_client/models.pyâ in retrieve
64. self._retrieve(*args, **kwargs)File â/openedx/edx-platform/lms/lib/comment_client/user.pyâ in _retrieve
152. metric_tags=self._metric_tags,File â/openedx/edx-platform/lms/lib/comment_client/utils.pyâ in perform_request
70. timeout=config.connection_timeoutFile â/openedx/venv/local/lib/python2.7/site-packages/requests/api.pyâ in request
60. return session.request(method=method, url=url, **kwargs)File â/openedx/venv/local/lib/python2.7/site-packages/requests/sessions.pyâ in request
533. resp = self.send(prep, **send_kwargs)File â/openedx/venv/local/lib/python2.7/site-packages/requests/sessions.pyâ in send
646. r = adapter.send(request, **kwargs)File â/openedx/venv/local/lib/python2.7/site-packages/requests/adapters.pyâ in send
516. raise ConnectionError(e, request=request)Exception Type: ConnectionError at /courses/course-v1:edX+DemoX+Demo_Course/discussion/forum/
Exception Value: SOCKSHTTPConnectionPool(host=âforumâ, port=4567): Max retries exceeded with url: /api/v1/users/3?complete=True&request_id=8c4c4059-9134-490f-9483-de32d89bb047 (Caused by NewConnectionError(â<urllib3.contrib.socks.SOCKSConnection object at 0x7f79af3706d0>: Failed to establish a new connection: [Errno 111] Connection refusedâ,))
I found that I was in an older version of tutor, Iâll try upgrading tutor. Sorry for disturbing.