build: make the dockerfile multi-staged

This commit is contained in:
pataar 2022-02-24 21:48:21 +01:00
parent 3ffd272e59
commit b7d68e8357
6 changed files with 94 additions and 103 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
/printer /printer
/printer_storage

View File

@ -1,13 +1,15 @@
version: "3.8" version: "3.8"
services: services:
printer: printer:
container_name: klipper-printer-simulavr container_name: printer
build: build:
context: docker context: .
dockerfile: Dockerfile dockerfile: docker/Dockerfile
image: klipper-printer-simulavr
volumes: volumes:
- ./printer:/home/printer - ./printer_storage/.moonraker_database:/home/printer/.moonraker_database:delegated
- ./printer_storage/gcode_files:/home/printer/gcode_files:delegated
- ./printer_storage/klipper_config:/home/printer/klipper_config:delegated
- ./printer_storage/klipper_logs:/home/printer/klipper_logs:delegated
ports: ports:
- "7125:7125" - "7125:7125"
networks: networks:

View File

@ -1,4 +1,4 @@
FROM python:3.10-slim-bullseye AS base FROM python:3.10-slim-bullseye AS builder
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
--no-install-recommends \ --no-install-recommends \
@ -6,7 +6,6 @@ RUN apt-get update && apt-get install -y \
### non specific packages ### non specific packages
git \ git \
sudo \ sudo \
supervisor \
swig \ swig \
virtualenv \ virtualenv \
### klipper ### klipper
@ -16,6 +15,7 @@ RUN apt-get update && apt-get install -y \
cmake \ cmake \
gcc-avr \ gcc-avr \
### moonraker ### moonraker
supervisor \
curl \ curl \
iproute2 \ iproute2 \
libcurl4-openssl-dev \ libcurl4-openssl-dev \
@ -30,18 +30,74 @@ RUN apt-get update && apt-get install -y \
### clean up ### clean up
&& apt-get -y autoremove \ && apt-get -y autoremove \
&& apt-get clean \ && apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
### add user "printer"
&& groupadd --force -g 1000 printer \ WORKDIR /build
### Prepare our applications
#### Klipper
RUN git clone --depth=1 https://github.com/klipper3d/klipper && \
rm -rf klipper/docs klipper/test klipper/.github && \
virtualenv -p python3 /build/klippy-env && \
/build/klippy-env/bin/pip install -r /build/klipper/scripts/klippy-requirements.txt && \
rm -rf lib
#### Simulavr
COPY docker/simulavr.config /usr/src
RUN git clone -b master git://git.savannah.nongnu.org/simulavr.git && \
# Build the firmware
cd klipper && \
cp /usr/src/simulavr.config .config && \
make PYTHON=python3 && \
cp out/klipper.elf /build/simulavr.elf && \
rm -f .config && make PYTHON=python3 clean && \
# Build simulavr
cd ../simulavr && \
make python && \
make build && \
make clean
#### Moonraker
RUN git clone --depth=1 https://github.com/Arksine/moonraker && \
rm -rf moonraker/docs moonraker/tests moonraker/.github && \
virtualenv -p python3 /build/moonraker-env && \
/build/moonraker-env/bin/pip install -r /build/moonraker/scripts/moonraker-requirements.txt
## --------- This is the runner image
FROM python:3.10-slim-bullseye AS runner
RUN apt-get update && apt-get install -y \
--no-install-recommends \
--no-install-suggests \
### non specific packages
git \
supervisor \
sudo \
swig \
### moonraker
curl \
iproute2 \
python3-libgpiod \
libcurl4-openssl-dev \
libjpeg-dev \
liblmdb-dev \
libopenjp2-7 \
libsodium-dev \
libssl-dev \
### clean up
&& apt-get -y autoremove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN groupadd --force -g 1000 printer \
&& useradd -rm -d /home/printer -g 1000 -u 1000 printer \ && useradd -rm -d /home/printer -g 1000 -u 1000 printer \
&& usermod -aG dialout,tty,sudo printer \ && usermod -aG dialout,tty,sudo printer \
&& echo 'printer ALL=(ALL:ALL) NOPASSWD:ALL' >> /etc/sudoers.d/printer && echo 'printer ALL=(ALL:ALL) NOPASSWD:ALL' >> /etc/sudoers.d/printer
### copy all required files ### copy all required files
COPY simulavr.config /usr/src COPY docker/supervisord.conf /etc/supervisor/supervisord.conf
COPY supervisord.conf /etc/supervisor/supervisord.conf COPY docker/service_control.sh /bin/service_control
COPY service_control.sh /bin/service_control COPY docker/start.sh /bin/start
COPY start.sh /bin/start
### make entrypoint executable ### make entrypoint executable
RUN chmod +x /bin/start RUN chmod +x /bin/start
@ -49,4 +105,13 @@ RUN chmod +x /bin/start
USER printer USER printer
WORKDIR /home/printer WORKDIR /home/printer
# Copy our prebuilt applications from the builder stage
COPY --from=builder --chown=printer:printer /build/klippy-env ./klippy-env
COPY --from=builder --chown=printer:printer /build/klipper ./klipper
COPY --from=builder --chown=printer:printer /build/moonraker ./moonraker
COPY --from=builder --chown=printer:printer /build/moonraker-env ./moonraker-env
COPY --from=builder --chown=printer:printer /build/simulavr ./simulavr
COPY ./example-configs/ ./example-configs/
ENTRYPOINT ["/bin/start"] ENTRYPOINT ["/bin/start"]

View File

@ -1,82 +1,15 @@
#!/bin/bash #!/bin/bash
[ ! -e /bin/systemctl ] && sudo -S ln -s /bin/true /bin/systemctl [ ! -e /bin/systemctl ] && sudo -S ln -s /bin/true /bin/systemctl
klipper_git="https://github.com/klipper3d/klipper"
moonraker_git="https://github.com/Arksine/moonraker"
simulavr_git="git://git.savannah.nongnu.org/simulavr.git"
simulavr_cfg="/usr/src/simulavr.config"
printer_cfg="https://raw.githubusercontent.com/th33xitus/klipper-printer-simulavr-docker/master/example-configs/printer.cfg"
moonraker_conf="https://raw.githubusercontent.com/th33xitus/klipper-printer-simulavr-docker/master/example-configs/moonraker.conf"
cd ~ || exit 1 cd ~ || exit 1
[ ! -d ~/klipper_config ] && mkdir klipper_config [ ! -d ~/klipper_config ] && mkdir klipper_config
[ ! -d ~/klipper_logs ] && mkdir klipper_logs [ ! -d ~/klipper_logs ] && mkdir klipper_logs
[ ! -d ~/gcode_files ] && mkdir gcode_files [ ! -d ~/gcode_files ] && mkdir gcode_files
setup_klipper(){
[ -d ~/klipper ] && return
echo "##### Cloning Klipper ..."
git clone $klipper_git
echo "##### Done!"
}
build_klipper_env(){
[ -d ~/klippy-env ] && return
echo "##### Building Klipper virtualenv ..."
virtualenv -p python3 ~/klippy-env
~/klippy-env/bin/pip install -r ~/klipper/scripts/klippy-requirements.txt
echo "##### Done!"
}
setup_moonraker(){
[ -d ~/moonraker ] && return
echo "##### Cloning Moonraker ..."
git clone $moonraker_git
echo "##### Done!"
}
build_moonraker_env(){
[ -d ~/moonraker-env ] && return
echo "##### Building Moonraker virtualenv ..."
virtualenv -p python3 ~/moonraker-env
~/moonraker-env/bin/pip install -r ~/moonraker/scripts/moonraker-requirements.txt
echo "##### Done!"
}
build_firmware(){
[ -f ~/simulavr.elf ] && return
echo "##### Building Klipper firmware ..."
[ ! -d ~/klipper ] && setup_klipper
cd ~/klipper || exit 1
cp $simulavr_cfg .config && make PYTHON=python3
cp out/klipper.elf ~/simulavr.elf
rm -f .config && make clean
cd ~ || exit 1
echo "##### Done!"
}
setup_simulavr(){
[ -d ~/simulavr ] && return
echo "##### Cloning Simulavr ..."
git clone $simulavr_git
echo "##### Done!"
}
build_simulavr(){
file="${HOME}/simulavr/build/pysimulavr/_pysimulavr.*.so"
# shellcheck disable=SC2086
[ "$(ls $file 2> /dev/null)" ] && return
echo "##### Building Simulavr ..."
cd ~/simulavr || exit 1
make clean && make python && make build
echo "##### Done!"
}
download_configs(){ download_configs(){
cd ~/klipper_config || exit 1 cd ~/klipper_config || exit 1
[ ! -f ~/klipper_config/printer.cfg ] && curl -O $printer_cfg [ ! -f ~/klipper_config/printer.cfg ] && cp /home/printer/example-configs/printer.cfg .
[ ! -f ~/klipper_config/moonraker.conf ] && curl -O $moonraker_conf [ ! -f ~/klipper_config/moonraker.conf ] && cp /home/printer/example-configs/moonraker.conf .
cd ~ || exit 1 cd ~ || exit 1
} }
@ -86,13 +19,6 @@ regain_ownership(){
sudo chown -R printer:printer ~/gcode_files sudo chown -R printer:printer ~/gcode_files
} }
setup_klipper
build_klipper_env
setup_moonraker
build_moonraker_env
build_firmware
setup_simulavr
build_simulavr
download_configs download_configs
regain_ownership regain_ownership

View File

@ -17,15 +17,15 @@ serverurl=unix:///tmp/supervisor.sock
[unix_http_server] [unix_http_server]
file=/tmp/supervisor.sock file=/tmp/supervisor.sock
[program:simulavr] # [program:simulavr]
command=bash -c 'sleep 10 && /home/printer/klipper/scripts/avrsim.py -m atmega644 -s 20000000 -b 250000 /home/printer/simulavr.elf' # command=bash -c 'sleep 10 && /home/printer/klipper/scripts/avrsim.py -m atmega644 /home/printer/simulavr.elf'
environment=PYTHONPATH=/home/printer/simulavr/build/pysimulavr/ # environment=PYTHONPATH=/home/printer/simulavr/build/pysimulavr/
user=printer # user=printer
process_name=simulavr # process_name=simulavr
directory=/home/printer # directory=/home/printer
autostart=true # autostart=true
autorestart=true # autorestart=true
redirect_stderr=true # redirect_stderr=true
[program:klipper] [program:klipper]
command=/home/printer/klippy-env/bin/python /home/printer/klipper/klippy/klippy.py /home/printer/klipper_config/printer.cfg -l /home/printer/klipper_logs/klippy.log -a /tmp/klippy_uds command=/home/printer/klippy-env/bin/python /home/printer/klipper/klippy/klippy.py /home/printer/klipper_config/printer.cfg -l /home/printer/klipper_logs/klippy.log -a /tmp/klippy_uds

View File

@ -247,9 +247,6 @@ gcode:
#*# <---------------------- SAVE_CONFIG ----------------------> #*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated. #*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*# #*#
#*# [probe]
#*# z_offset = 0
#*#
#*# [bed_mesh default] #*# [bed_mesh default]
#*# version = 1 #*# version = 1
#*# points = #*# points =