2 Commits

Author SHA1 Message Date
eb106e97e7 build: add qi lib to Docker
Uses Pyenv to build Python 2 from source, while keeping Debian for
needed packages. Might move to two build stages in the future.

ref: N25B-284
2025-11-18 17:12:30 +01:00
ec0e8e3504 build: add Docker container
Some changes (like `asound.conf`) are not portable and only work on my
machine. This will be fixed in the future.

ref: N25B-284
2025-11-14 14:15:00 +01:00
6 changed files with 72 additions and 13 deletions

9
.dockerignore Normal file
View File

@@ -0,0 +1,9 @@
.git
.githooks/
.idea/
.venv/
test/
typings/
.dockerignore
.gitignore
README.md

37
Dockerfile Normal file
View File

@@ -0,0 +1,37 @@
FROM debian:trixie AS build
WORKDIR /app
COPY requirements.txt .
RUN apt-get update; apt-get install -y portaudio19-dev libzmq3-dev make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl git libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev alsa-utils musl-dev
ENV HOME="/root"
RUN git clone --depth=1 https://github.com/pyenv/pyenv.git ${HOME}/.pyenv
ENV PYENV_ROOT="${HOME}/.pyenv"
ENV PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}"
ENV PYTHON_VERSION=2.7.18
RUN pyenv install ${PYTHON_VERSION}; pyenv global ${PYTHON_VERSION}
RUN python -m pip install virtualenv; python -m virtualenv .venv
RUN /usr/bin/env bash -c 'source .venv/bin/activate && pip install -r ./requirements.txt'
# RUN eval "$(pyenv init - bash)"; pyenv install 2.7; pyenv shell 2.7; python -m pip install virtualenv; python -m virtualenv .venv; source .venv/bin/activate; pip install -r requirements.txt
# FROM debian:trixie
#
# WORKDIR /app
#
# COPY --from=build /app/.venv /app/.venv
WORKDIR /app/.venv/lib/python2.7/site-packages
RUN /usr/bin/env bash -c 'apt-get install -y wget && wget https://community-static.aldebaran.com/resources/2.5.10/Python%20SDK/pynaoqi-python2.7-2.5.7.1-linux64.tar.gz && tar xvfz ./pynaoqi-python2.7-2.5.7.1-linux64.tar.gz && rm pynaoqi-python2.7-2.5.7.1-linux64.tar.gz'
RUN echo /app/.venv/lib/python2.7/site-packages/pynaoqi-python2.7-2.5.7.1-linux64/lib/python2.7/site-packages/ > pynaoqi-python2.7.pth
WORKDIR /app
COPY . .
ENV PYTHONPATH=src
CMD [ "/bin/bash", "-c", "source .venv/bin/activate && python -m robot_interface.main --qi-url tcp://172.17.0.1:43305" ]

9
asound.conf Normal file
View File

@@ -0,0 +1,9 @@
pcm.!default {
type hw
card 2
}
ctl.!default {
type hw
card 2
}

4
install_deps.sh Executable file
View File

@@ -0,0 +1,4 @@
#!/usr/bin/env sh
apk add portaudio-dev libzmq gcc musl-dev g++ alsa-utils
pip install -r requirements.txt

View File

@@ -45,7 +45,10 @@ class MainReceiver(ReceiverBase):
if message["endpoint"] == "negotiate/ports":
return MainReceiver._handle_port_negotiation(message)
return {"endpoint": "negotiate/error", "data": "The requested endpoint is not implemented."}
return {
"endpoint": "negotiate/error",
"data": "The requested endpoint is not implemented.",
}
def handle_message(self, message):
if message["endpoint"] == "ping":

View File

@@ -1,6 +1,5 @@
from abc import ABCMeta
import zmq
import os
class SocketBase(object):
@@ -19,7 +18,7 @@ class SocketBase(object):
self.socket = None # Set later by `create_socket`
self.bound = None # Set later by `create_socket`
def create_socket(self, zmq_context, socket_type, port, options=[], bind=True):
def create_socket(self, zmq_context, socket_type, port, options=[], bind=False):
"""
Create a ZeroMQ socket.
@@ -43,17 +42,19 @@ class SocketBase(object):
self.socket = zmq_context.socket(socket_type)
for option, arg in options:
self.socket.setsockopt(option,arg)
self.socket.setsockopt(option, arg)
self.bound = bind
host = os.environ.get("CB_HOST", "localhost")
if bind:
self.socket.bind("tcp://*:{}".format(port))
self.socket.bind("tcp://{}:{}".format(host, port))
else:
self.socket.connect("tcp://localhost:{}".format(port))
self.socket.connect("tcp://{}:{}".format(host, port))
def close(self):
"""Close the ZeroMQ socket."""
if not self.socket: return
if not self.socket:
return
self.socket.close()
self.socket = None
@@ -65,8 +66,4 @@ class SocketBase(object):
https://utrechtuniversity.youtrack.cloud/articles/N25B-A-14/RI-CB-Communication#negotiation
:rtype: dict
"""
return {
"id": self.identifier,
"port": self.port,
"bind": not self.bound
}
return {"id": self.identifier, "port": self.port, "bind": not self.bound}