diff --git a/src/webui/Dockerfile b/src/webui/Dockerfile
index 68deddfd1123b9477a5b5637015f90dcc639539f..7760416be32b893ed5f2408b70e874fb89721e17 100644
--- a/src/webui/Dockerfile
+++ b/src/webui/Dockerfile
@@ -54,12 +54,25 @@ COPY --chown=webui:webui common_requirements.in common_requirements.in
 RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in
 RUN python3 -m pip install -r common_requirements.txt
 
+# Add common files into working directory
+COPY --chown=webui:webui src/common/. common/
+RUN rm -rf common/proto
+
+# Create proto sub-folder, copy .proto files, and generate Python code
+RUN mkdir -p common/proto
+WORKDIR /home/webui/teraflow/common/proto
+RUN touch __init__.py
+COPY --chown=webui:webui proto/*.proto ./
+RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto
+RUN rm *.proto
+RUN find . -type f -exec sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' {} \;
+WORKDIR /home/webui/teraflow
+
 COPY --chown=webui:webui src/webui/requirements.in requirements.in
 RUN pip-compile --quiet --output-file=requirements.txt requirements.in
 RUN pip install -r requirements.txt
 
 # Add files into working directory
-COPY --chown=webui:webui src/common/. common/
 COPY --chown=webui:webui src/context/__init__.py context/__init__.py
 COPY --chown=webui:webui src/context/client/. context/client/
 COPY --chown=webui:webui src/device/__init__.py device/__init__.py