Docker question with SSR for Communicator SCS

Hello,

Working on dockerizing a Communicator SCS. I have the CSR version working no problem. I am working on the SSR version. I followed the documentation, followed the old youtube training video. Also tried different versions of the NVIDIA GLVND dockerfiles. I keep getting the glBindTexture error and am not sure what else to try. Suggestions are appreciated. Below is the capture of the output message (i manually started the ts3d_server and show the startup options at the end when it segvfaults):

using EGL for context creation.
initalized EGL Library v1.5
SDL version (compiled): 2.0.3
SDL version (linked): 2.0.10
GL Vendor: NVIDIA Corporation
GL Renderer: NVIDIA GeForce GTX 1060 6GB/PCIe/SSE2
GL Version: OpenGL ES 3.2 NVIDIA 535.230.02
GLSL Version: OpenGL ES GLSL ES 3.20
GL Extensions: GL_EXT_base_instance GL_EXT_blend_func_extended GL_EXT_blend_minmax GL_EXT_buffer_storage GL_EXT_clear_texture GL_EXT_clip_control GL_EXT_clip_cull_distance GL_EXT_color_buffer_float GL_EXT_color_buffer_half_float GL_EXT_conservative_depth GL_EXT_copy_image GL_EXT_depth_clamp GL_EXT_debug_label GL_EXT_discard_framebuffer GL_EXT_disjoint_timer_query GL_EXT_draw_buffers_indexed GL_EXT_draw_elements_base_vertex GL_EXT_EGL_image_array GL_EXT_EGL_image_storage GL_EXT_EGL_image_external_wrap_modes GL_EXT_float_blend GL_EXT_frag_depth GL_EXT_geometry_point_size GL_EXT_geometry_shader GL_EXT_gpu_shader5 GL_EXT_map_buffer_range GL_EXT_multi_draw_indirect GL_EXT_multisample_compatibility GL_EXT_multisampled_render_to_texture GL_EXT_multisampled_render_to_texture2 GL_EXT_multiview_texture_multisample GL_EXT_multiview_timer_query GL_EXT_occlusion_query_boolean GL_EXT_polygon_offset_clamp GL_EXT_post_depth_coverage GL_EXT_primitive_bounding_box GL_EXT_raster_multisample GL_EXT_render_snorm GL_EXT_robustness GL_EXT_separate_shader_objects GL_EXT_shader_group_vote GL_EXT_shader_implicit_conversions GL_EXT_shader_integer_mix GL_EXT_shader_io_blocks GL_EXT_shader_non_constant_global_initializers GL_EXT_shader_texture_lod GL_EXT_shadow_samplers GL_EXT_sparse_texture GL_EXT_sparse_texture2 GL_EXT_sRGB GL_EXT_sRGB_write_control GL_EXT_tessellation_point_size GL_EXT_tessellation_shader GL_EXT_texture_border_clamp GL_EXT_texture_buffer GL_EXT_texture_compression_bptc GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map_array GL_EXT_texture_filter_anisotropic GL_EXT_texture_filter_minmax GL_EXT_texture_format_BGRA8888 GL_EXT_texture_mirror_clamp_to_edge GL_EXT_texture_norm16 GL_EXT_texture_query_lod GL_EXT_texture_rg GL_EXT_texture_shadow_lod GL_EXT_texture_sRGB_R8 GL_EXT_texture_sRGB_decode GL_EXT_texture_storage GL_EXT_texture_view GL_EXT_draw_transform_feedback GL_EXT_unpack_subimage GL_EXT_window_rectangles GL_KHR_context_flush_control GL_KHR_debug GL_EXT_memory_object GL_EXT_memory_object_fd GL_NV_memory_object_sparse GL_KHR_parallel_shader_compile GL_KHR_no_error GL_KHR_robust_buffer_access_behavior GL_KHR_robustness GL_EXT_semaphore GL_EXT_semaphore_fd GL_NV_timeline_semaphore GL_KHR_shader_subgroup GL_KHR_texture_compression_astc_ldr GL_KHR_texture_compression_astc_sliced_3d GL_KHR_texture_compression_astc_hdr GL_NV_bgr GL_NV_bindless_texture GL_NV_blend_equation_advanced GL_NV_blend_equation_advanced_coherent GL_NVX_blend_equation_advanced_multi_draw_buffers GL_NV_blend_minmax_factor GL_NV_clip_space_w_scaling GL_NV_conditional_render GL_NV_conservative_raster GL_NV_conservative_raster_pre_snap_triangles GL_NV_copy_buffer GL_NV_copy_image GL_NV_draw_buffers GL_NV_draw_instanced GL_NV_draw_texture GL_NV_draw_vulkan_image GL_NV_EGL_stream_consumer_external GL_NV_explicit_attrib_location GL_NV_fbo_color_attachments GL_NV_fill_rectangle GL_NV_fragment_coverage_to_color GL_NV_fragment_shader_interlock GL_NV_framebuffer_blit GL_NV_framebuffer_mixed_samples GL_NV_framebuffer_multisample GL_NV_generate_mipmap_sRGB GL_NV_geometry_shader_passthrough GL_NV_instanced_arrays GL_NV_internalformat_sample_query GL_NV_gpu_shader5 GL_NV_image_formats GL_NV_memory_attachment GL_NV_occlusion_query_samples GL_NV_non_square_matrices GL_NV_pack_subimage GL_NV_packed_float GL_NV_packed_float_linear GL_NV_path_rendering GL_NV_path_rendering_shared_edge GL_NV_pixel_buffer_object GL_NV_polygon_mode GL_NV_read_buffer GL_NV_read_depth GL_NV_read_depth_stencil GL_NV_read_stencil GL_NV_sample_locations GL_NV_sample_mask_override_coverage GL_NV_shader_atomic_fp16_vector GL_NV_shader_noperspective_interpolation GL_NV_shader_subgroup_partitioned GL_NV_shadow_samplers_array GL_NV_shadow_samplers_cube GL_NV_sRGB_formats GL_NV_stereo_view_rendering GL_NV_texture_array GL_NV_texture_barrier GL_NV_texture_border_clamp GL_NV_texture_compression_latc GL_NV_texture_compression_s3tc GL_NV_texture_compression_s3tc_update GL_NV_timer_query GL_NV_viewport_array GL_NV_viewport_array2 GL_NV_viewport_swizzle GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_OES_compressed_ETC1_RGB8_texture GL_EXT_compressed_ETC1_RGB8_sub_texture GL_OES_depth24 GL_OES_depth32 GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_OES_copy_image GL_OES_draw_buffers_indexed GL_OES_draw_elements_base_vertex GL_OES_texture_border_clamp GL_OES_tessellation_point_size GL_OES_tessellation_shader GL_OES_texture_buffer GL_OES_geometry_point_size GL_OES_geometry_shader GL_OES_gpu_shader5 GL_OES_shader_io_blocks GL_OES_texture_view GL_OES_primitive_bounding_box GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_image_external_essl3 GL_OES_EGL_sync GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_get_program_binary GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_EXT_read_format_bgra GL_OES_sample_shading GL_OES_sample_variables GL_OES_shader_image_atomic GL_OES_shader_multisample_interpolation GL_OES_standard_derivatives GL_OES_surfaceless_context GL_OES_texture_cube_map_array GL_OES_texture_npot GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_stencil8 GL_OES_texture_storage_multisample_2d_array GL_OES_vertex_array_object GL_OES_vertex_half_float GL_OES_viewport_array GL_OVR_multiview GL_OVR_multiview2 GL_OVR_multiview_multisampled_render_to_texture GL_ANDROID_extension_pack_es31a
max vertex texture units: 32
max combined texture units: 192
max vertex uniform vectors: 1024
max fragment uniform vectors: 1024
max vertex attributes: 16
max render buffer size: 32768
max aliased point size: 2047
loading shader /opt/NLIGN/ThirdPartyLibs/hoops/communicator/server/bin/linux64/shader/ssr-post-v.glsl
loading shader /opt/NLIGN/ThirdPartyLibs/hoops/communicator/server/bin/linux64/shader/ssr-post-planar-f.glsl
loading shader /opt/NLIGN/ThirdPartyLibs/hoops/communicator/server/bin/linux64/shader/ssr-post-v.glsl
loading shader /opt/NLIGN/ThirdPartyLibs/hoops/communicator/server/bin/linux64/shader/ssr-post-planar-down-f.glsl
loading shader /opt/NLIGN/ThirdPartyLibs/hoops/communicator/server/bin/linux64/shader/ssr-post-v.glsl
loading shader /opt/NLIGN/ThirdPartyLibs/hoops/communicator/server/bin/linux64/shader/ssr-post-nv12-f.glsl
loading shader /opt/NLIGN/ThirdPartyLibs/hoops/communicator/server/bin/linux64/shader/ssr-post-v.glsl
loading shader /opt/NLIGN/ThirdPartyLibs/hoops/communicator/server/bin/linux64/shader/ssr-post-nv12-down-f.glsl
2025-03-21 12:30:31 Appended model search directory: /opt/NLIGN/ThirdPartyLibs/hoops/communicator/sandbox_linux/data
2025-03-21 12:30:31 Appended model search directory: /opt/NLIGN/ThirdPartyLibs/hoops/communicator/quick_start/converted_models/user/sc_models
2025-03-21 12:30:31 Appended model search directory: /opt/NLIGN/ThirdPartyLibs/hoops/communicator/quick_start/converted_models/authoring_samples_data
2025-03-21 12:30:31 Appended model search directory: /opt/NLIGN/ThirdPartyLibs/hoops/communicator/quick_start/converted_models/standard/sc_models
2025-03-21 12:30:31 Set workspace directory: /tmp/1E09-C2BE-2918-05F4
2025-03-21 12:30:31 StreamState::SetControlFlags: StreamInstancesOnDemand
2025-03-21 12:30:31 StreamState::SetStreamCutoffScale: 1.000000
2025-03-21 12:30:31 Stream init.
2025-03-21 12:30:31 i(0 0) d(0 0) b: 88 Kb: 0 bKib: 0 mKib: (0 0) ms(0 0 0) (0 0 0 0 0 0 0 0 0 0 0) vs(0 0) T: 0 F: 0 STREAM → E
2025-03-21 12:30:31 i(0 0) d(0 0) b: 16 Kb: 0 bKib: 0 mKib: (0 0) ms(0 0 0) (0 0 0 0 0 0 0 0 0 0 0) vs(0 0) T: 0 F: 0 STREAM → I
2025-03-21 12:30:31 i(0 0) d(0 0) b: 52 Kb: 0 bKib: 0 mKib: (0 0) ms(0 0 0) (0 0 0 0 0 0 0 0 0 0 0) vs(0 0) T: 0 F: 0 COMPUTE_INSTANCE_INC_BOUNDING → E
2025-03-21 12:30:31 i(0 0) d(0 0) b: 16 Kb: 0 bKib: 0 mKib: (0 0) ms(0 0 0) (0 0 0 0 0 0 0 0 0 0 0) vs(0 0) T: 0 F: 0 STREAM → I
Could not load OpenGL command: glBindTexture!
/ts3d.sh: line 1: 74 Segmentation fault (core dumped) /opt/NLIGN/ThirdPartyLibs/hoops/communicator/server/bin/linux64/ts3d_sc_server --id 1aac8b0b-66e1-493c-aaca-6c17d6a7a728 --sc-port 11000 --liveliness-endpoint http://127.0.0.1:11182/api/spawns/ --liveliness-update-frequency 5 --model-search-directories “/opt/NLIGN/ThirdPartyLibs/hoops/communicator/sandbox_linux/data;/opt/NLIGN/ThirdPartyLibs/hoops/communicator/quick_start/converted_models/user/sc_models;/opt/NLIGN/ThirdPartyLibs/hoops/communicator/quick_start/converted_models/authoring_samples_data;/opt/NLIGN/ThirdPartyLibs/hoops/communicator/quick_start/converted_models/standard/sc_models” --log-file /root/sa.log --log-style-delta false --log-file-category-mask 7 --initial-use-duration 60 --workspace-dir /tmp --ssr true --ssr-egl true --license-file /opt/NLIGN/ThirdPartyLibs/hoops/communicator/HoopsLicense.lic --sc-verbose-logging true

Hello @jeff.walrath,

As a way to further isolate the issue, are you able to reproduce the same error in a non-Docker build?

Thanks,
Tino

Tino,

Good call but I am still seeing the same problem. On my bare metal Linux box, I setup everything. I got it working fine when ssrUseEgl: false is set in the Config.js. When I switch this to ssrUseEgl: true, then I get the exact same error message I reported above. Note that the Docker container also runs on this same machine (for now) - so they are using the same GPU. This Linux box is not headless, but the container will eventually be deployed to a headless server. Thus, I believe I have to use the EGL settings for OpenGL (at least that is what I interpreted from the youtube training video https://www.youtube.com/watch?v=E6bce_iaeh0). That is why I am enabling the EGL flag in the Docker container.

Thanks.

-jeff

Thanks for doing the additional testing on your end, Jeff.

In the video you referenced, on timestamp ~28:42, Robert Tadlock, the video host, talks about installing the NVIDIA container toolkit as a prerequisite. Has this been installed in your Docker build?

Tino,

Ok here is what I have found. FYI - in my past experiences, I have always installed all the Docker and NVIDIA-docker stuff via ‘apt’. This particular machine I am using was setup by someone else where Docker was installed with ‘snap’. It appears that the NVIDIA toolkit is there, just in a different location (e.g. it is at /var/lib/snapd/hostfs). In my past experiences when NV-Container-toolkit is installed with ‘apt’ it was at /usr/local/nvidia. All the libs are also in that different snap dir (and the ldconfig has the proper locations)

I can do a nvidia-smi (just not the same way it is done in the youtube because I think that was installed via ‘apt’). When corrected for the path, nvidia-smi does run and produce the proper output for NVIDIA Container Toolkit. Will the different way of Docker install on the host cause this issue? Obviously some of the paths are different. So far that is the only issue I have found different from the youtube video.

var/lib/snapd/hostfs/usr/lib/x86_64-linux-gnu: (from /etc/ld.so.conf.d/nvcr-3192921805.conf:1)
libnvidia-glsi.so.535.230.02 → libnvidia-glsi.so.535.230.02
libnvidia-allocator.so.1 → libnvidia-allocator.so.535.230.02
libnvidia-ptxjitcompiler.so.1 → libnvidia-ptxjitcompiler.so.535.230.02
libnvidia-ml.so.1 → libnvidia-ml.so.535.230.02
libnvidia-fbc.so.1 → libnvidia-fbc.so.535.230.02
libGLESv2_nvidia.so.2 → libGLESv2_nvidia.so.535.230.02
libnvidia-pkcs11-openssl3.so.535.230.02 → libnvidia-pkcs11-openssl3.so.535.230.02
libnvidia-eglcore.so.535.230.02 → libnvidia-eglcore.so.535.230.02
libnvidia-tls.so.535.230.02 → libnvidia-tls.so.535.230.02
libnvidia-glvkspirv.so.535.230.02 → libnvidia-glvkspirv.so.535.230.02
libGLX_nvidia.so.0 → libGLX_nvidia.so.535.230.02
libnvidia-cfg.so.1 → libnvidia-cfg.so.535.230.02
libnvidia-opencl.so.1 → libnvidia-opencl.so.535.230.02
libnvidia-ngx.so.1 → libnvidia-ngx.so.535.230.02
libnvidia-rtcore.so.535.230.02 → libnvidia-rtcore.so.535.230.02
libnvoptix.so.1 → libnvoptix.so.535.230.02
libnvidia-egl-gbm.so.1 → libnvidia-egl-gbm.so.1.1.0
libnvidia-nvvm.so.4 → libnvidia-nvvm.so.535.230.02
libEGL_nvidia.so.0 → libEGL_nvidia.so.535.230.02
libnvidia-glcore.so.535.230.02 → libnvidia-glcore.so.535.230.02
libnvidia-opticalflow.so.1 → libnvidia-opticalflow.so.535.230.02
libGLESv1_CM_nvidia.so.1 → libGLESv1_CM_nvidia.so.535.230.02
libnvidia-encode.so.1 → libnvidia-encode.so.535.230.02
libnvcuvid.so.1 → libnvcuvid.so.535.230.02
libnvidia-pkcs11.so.535.230.02 → libnvidia-pkcs11.so.535.230.02
/sbin/ldconfig.real: /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 is the dynamic linker, ignoring

-jeff

Tino,

Just for kicks - I am going to reinstall Docker using the ‘apt’ approach instead of ‘snap’ and see if that works. Seems like a long shot, but I guess it is worth a shot.

-jeff

Tino,

Afraid changing to ‘apt’ installed docker did not change anything. I was able to call nvidia-smi just like in the youtube video and confirmed the NVIDIA Container toolkit is in fact working.

-jeff

Hi Jeff,

I’m the one that created the original docker/SSR video you linked to. Can you please tell me what version of HOOPS Communicator you’re running? I’m going to try and run with EGL on my linux machine and see if I can reproduce what you’re seeing.

Hi there rtadlock,

Appreciate the help.

Note that I am copying the HOOPS Communicator code (for an SC server) into the container due to restrictions on how customer wants the container delivered. In the video, the HOOPS code was outside the container (I don’t think that should matter). I am using the Config.js that works on the bare metal and only change ssrUseEgl to true in the container. I basically just copy the bare metal code into the container and change that one setting in Config.js. I use the same URL to connect to the server between bare metal and the container. I am trying to eliminate as many potential errors as possible per the help I have gotten so far.

We have the code organized slightly differently than the tarball, and it works on the bare metal with our organization other than the ssrUseEgl setting.

Note that I am running SCS on Linux box and hitting it from my Windows laptop using Chrome in both test cases (e.g. bare metal and container).

So I am using:

  1. HOOPS_Communicator_2024.8.0
  2. Docker 28.0.2
  3. Host computer OS: Ubuntu 22.04.5 LTS

Here is the docker startup for my image:

docker run --gpus all -p 11000-11032:11000-11032 -p 11180-11182:11180-11182 hoops_ssr

ts3d-node-server@1.0.0 start /opt/NLIGN/modelstreaming/server/linux64
node --expose-gc ./lib/Startup.js

3/21/2025, 6:01:34 PM:info: File logging enabled at /root/ts3d_communicator_logs/comm_server_2025_03_21_18_01_34_22.log
3/21/2025, 6:01:34 PM:info: Start Time Local: 3/21/2025, 6:01:34 PM, ISO: 2025-03-21T18:01:34.594Z
3/21/2025, 6:01:34 PM:info: file-server websocket proxy enabled: proxy-URI=ws://galactus:11180
3/21/2025, 6:01:34 PM:info: spawn-server websocket proxy enabled: proxy-URI=ws://galactus:11182
3/21/2025, 6:01:34 PM:info: Periodic GC enabled every 30 seconds
3/21/2025, 6:01:34 PM:info: HTTP file-server listening: port=11180, SSL=false
3/21/2025, 6:01:34 PM:info: Server help available via HTTP GET to endpoint api/help. ex:
3/21/2025, 6:01:34 PM:info: curl http://127.0.0.1:11182/api/help
3/21/2025, 6:01:34 PM:info: REST spawn-server listening: port=11182, SSL=false

Successfully started HOOPS Communicator Viewer Services. Press the ‘enter’ key to stop.
3/21/2025, 6:05:19 PM:info: ts3d_sc_server spawned: pid=33, id=1a760c29-a626-4b32-a14a-942057428596
3/21/2025, 6:05:19 PM:info: ts3d_sc_server ready to stream: id=1a760c29-a626-4b32-a14a-942057428596
3/21/2025, 6:05:21 PM:info: ts3d_sc_server died: pid=33, id=1a760c29-a626-4b32-a14a-942057428596
3/21/2025, 6:05:21 PM:warn: ts3d_sc_server failed: reason=‘exited because of signal=SIGSEGV, no exit-code’, id=1a760c29-a626-4b32-a14a-942057428596

These are some of the base images I tried:

Use this for the base OS

#FROM nvidia/cuda:12.8.1-runtime-ubuntu24.04
#FROM nvidia/opengl:1.1-glvnd-runtime-ubuntu16.04
#FROM nvidia/opengl:1.2-glvnd-runtime-ubuntu20.04
FROM nvidia/opengl:1.2-glvnd-runtime-ubuntu22.04

another test has the glvnd for NVIDIA

#FROM nvidia/cudagl:11.4.2-runtime-ubuntu20.04

Thanks

-jeff

Hi Jeff,

I’m not able to get SSR working with EGL on my Ubuntu machine (it appears you weren’t either) and I think this might be an issue with our EGL implementation rather something going on with docker/nvidia toolkit, etc. Tino and I will ask our development team for some guidance here and get back to you.

Thanks Robert. I appreciate all the support and help everyone has provided today.

Have a good weekend.

-jeff

1 Like

Hello,

I wanted to check on the status of this issue. Were there any suggestions or possible workarounds? Should I create a bug report?

Thanks.

-jeff

Hello @jeff.walrath,

After some additional investigation on our end, it does look like there is a bug with using EGL and SSR. This issue does not look like it is just Docker.

While the investigation is still ongoing, it would probably be best if you could create a support ticket. I believe you should have access to the Jira Support Portal. If not, I can create a support ticket on your behalf.

Thanks,
Tino

Hey Tino,

Thanks for the quick response. I have submitted a bug report as suggested. I referred back to this forum thread for more details while also pasting some of the info from here.

-jeff

1 Like