Ich nutze dieses Dockerfile mit lokalem Build (bzw. etwas angepasst zu zusammen mit podman-compose, aber das Dockerfile habe ich gerade auch so getestet):
FROM node:18-bullseye
# Install system dependencies needed for PXT builds
RUN apt-get update && apt-get install -y \
git \
python3 \
python3-pip \
build-essential \
cmake \
mercurial \
ninja-build \
gcc-arm-none-eabi \
gdb-arm-none-eabi \
openocd \
wget \
curl \
vim \
less \
tree \
srecord \
&& rm -rf /var/lib/apt/lists/*
# Ensure 'python' points to 'python3' for legacy scripts
RUN ln -s /usr/bin/python3 /usr/bin/python
RUN pip3 install "markupsafe<2.1" "jinja2<3.1"
RUN pip3 install --prefer-binary --no-cache-dir yotta
# Set working directory
WORKDIR /workspace
# Install PXT CLI and common packages globally
RUN npm install -g pxt
# Option A) Mount directories and build in Startup script
# RUN mkdir -p /workspace/pxt-calliope \
# /workspace/pxt \
# /workspace/pxt-common-packages \
# /workspace/temp
# Option B) Clone the PXT Calliope repositorys and install dependencies
# local pxt: clone PXT repository (optional)
# Make sure to choose the desired branch or commit if needed
# RUN git clone https://github.com/microsoft/pxt.git /workspace/pxt
# RUN cd /workspace/pxt && \
# npm install
# npm run build
RUN git clone https://github.com/microsoft/pxt-calliope.git /workspace/pxt-calliope
RUN cd /workspace/pxt-calliope && \
npm install
# local pxt: link the cloned PXT repository
# RUN npm link ../pxt
ARG GITHUB_AUTHTOKEN
ENV GITHUB_AUTHTOKEN=${GITHUB_AUTHTOKEN}
ENV YOTTA_GITHUB_AUTHTOKEN=${GITHUB_AUTHTOKEN}
# Set environment variables for local builds
ENV PXT_FORCE_LOCAL=1
ENV PXT_NODOCKER=1
ENV PXT_DEBUG=1
ENV PATH="/workspace/node_modules/.bin:$PATH"
# Create a startup script
RUN echo '#!/bin/bash\n\
echo "=== PXT CLI Docker Environment ==="\n\
echo "Available commands:"\n\
echo " pxt builddaldts --clean # Build dal.d.ts"\n\
echo " pxt build # Build project"\n\
echo " pxt serve # Start dev server, e.g. pxt serve --hostname 0.0.0.0 --noBrowser"\n\
echo " npm install # Install dependencies"\n\
echo " pxt clean # Clean build artifacts"\n\
echo ""\n\
echo "Environment variables set:"\n\
echo " PXT_FORCE_LOCAL=1 (force local builds)"\n\
echo " PXT_NODOCKER=1 (disable Docker)"\n\
echo " PXT_DEBUG=1 (enable debug output)"\n\
echo ""\n\
echo "Available directories:"\n\
ls -la /workspace/\n\
echo ""\n\
cd /workspace/pxt-calliope || echo "pxt-calliope directory not mounted"\n\
echo "Current directory: $(pwd)"\n\
exec "$@"' > /entrypoint.sh && chmod +x /entrypoint.sh
# Set git config to avoid permission issues
RUN git config --global --add safe.directory '*'
RUN git config --global user.email "dev@example.com"
RUN git config --global user.name "PXT Developer"
ENTRYPOINT ["/entrypoint.sh"]
CMD ["/bin/bash"]
Für die Nutzung der Microsfot Cloud für den Buildprozess könnte man das Dockerfile etwas entschlacken.
Build
$: podman build --build-arg GITHUB_AUTHTOKEN=YOUR_TOKEN -t pxt-calliope .
Der erste Build klappt eventuell noch ohne Auth Token, aber man kommt recht schnell ins Limit und braucht dann ein Token (ohne weitere rechte, einfach public read): https://github.com/settings/tokens
Starten
podman run --rm -it -p 3232:3232 -p 3233:3233 pxt-calliope pxt serve --hostname 0.0.0.0 --noBrowser
Und dann den Link nicht mit 0.0.0.0, sondern mit Localhost öffnen: http://localhost:3232/index.html#
Der Befehl pxt serve
startet zwar einen Server, aber der ist eigentlich nur für den Lokalen zugriff gedacht und blockt zugriffe, die nicht localhost
als Host haben.
In pxt-core kann man die sperre zwar umgehen ( vgl. enable acces from local network · microsoft/pxt@20cae97 · GitHub ), das muss dann aber jeweils für die in pxt-calliope in der packages.json definierten Version angepasst werden. Außerdem ist das eben nicht für den produktiven Einsatz gedacht, also maximal für den Lokalen Test im eigenen Netzwerk.
Sobald man versucht den Server mit SSL abzusichern, stürzt er dann (zumindest bei meinen Versuchen) auch bei den ersten Aufrufen sehr schnell ab.
Die Alternative zu pxt serve
ist der Befehl pxt staticpkg
, damit bekommt man einen statischen Build, den man mit jedem HTTP/S Server einfach ausspielen kann. Nachteil ist nur, dass es Einschränkungen bei dem Laden von Erweiterungen gibt (ohne Internetzugriff ja sowieso) und der Server eben nicht neu builden kann, wenn das nötig ist.
Umgehen lässt sich das, wenn man Hex-Dateien mit benötigten Erweiterungen & Builds vorhält, die man vorher an einem vollwertigen MakeCode erstellt hat.
Es bleibt eine Bastellösung, aber vielleicht hilft es dir ja schon weiter (falls du nicht schon selbst so weit gekommen bist mittlerweile).