diff --git a/.gitignore b/.gitignore index 1d89cbc..f1fa793 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -/printer \ No newline at end of file +/printer +/printer_storage \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 6077406..2eadcc3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,15 @@ version: "3.8" services: printer: - container_name: klipper-printer-simulavr + container_name: printer build: - context: docker - dockerfile: Dockerfile - image: klipper-printer-simulavr + context: . + dockerfile: docker/Dockerfile 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: - "7125:7125" networks: diff --git a/docker/Dockerfile b/docker/Dockerfile index 4e8a13d..06c1999 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,12 +1,10 @@ -FROM python:3.10-slim-bullseye AS base +FROM python:3.10-slim-bullseye AS builder RUN apt-get update && apt-get install -y \ --no-install-recommends \ --no-install-suggests \ ### non specific packages git \ - sudo \ - supervisor \ swig \ virtualenv \ ### klipper @@ -30,23 +28,86 @@ RUN apt-get update && apt-get install -y \ ### clean up && apt-get -y autoremove \ && apt-get clean \ - && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ - ### add user "printer" - && groupadd --force -g 1000 printer \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +WORKDIR /build + +### Prepare our applications +#### Klipper +RUN git clone https://github.com/klipper3d/klipper && \ + virtualenv -p python3 /build/klippy-env && \ + /build/klippy-env/bin/pip install -r /build/klipper/scripts/klippy-requirements.txt + +#### 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 https://github.com/Arksine/moonraker && \ + 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 \ + build-essential \ + supervisor \ + sudo \ + ### moonraker + curl \ + iproute2 \ + libcurl4-openssl-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 \ && usermod -aG dialout,tty,sudo printer \ && echo 'printer ALL=(ALL:ALL) NOPASSWD:ALL' >> /etc/sudoers.d/printer ### copy all required files -COPY simulavr.config /usr/src -COPY supervisord.conf /etc/supervisor/supervisord.conf -COPY service_control.sh /bin/service_control -COPY start.sh /bin/start +COPY docker/supervisord.conf /etc/supervisor/supervisord.conf +COPY docker/start.sh /bin/start +COPY docker/service_control.sh /bin/service_control ### make entrypoint executable RUN chmod +x /bin/start +RUN chmod +x /bin/service_control USER 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 --from=builder --chown=printer:printer /build/simulavr.elf ./simulavr.elf + +COPY ./example-configs/ ./example-configs/ + ENTRYPOINT ["/bin/start"] diff --git a/docker/start.sh b/docker/start.sh index 319f677..ddd33c1 100644 --- a/docker/start.sh +++ b/docker/start.sh @@ -1,82 +1,15 @@ #!/bin/bash [ ! -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 [ ! -d ~/klipper_config ] && mkdir klipper_config [ ! -d ~/klipper_logs ] && mkdir klipper_logs [ ! -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(){ cd ~/klipper_config || exit 1 - [ ! -f ~/klipper_config/printer.cfg ] && curl -O $printer_cfg - [ ! -f ~/klipper_config/moonraker.conf ] && curl -O $moonraker_conf + [ ! -f ~/klipper_config/printer.cfg ] && cp /home/printer/example-configs/printer.cfg . + [ ! -f ~/klipper_config/moonraker.conf ] && cp /home/printer/example-configs/moonraker.conf . cd ~ || exit 1 } @@ -86,13 +19,6 @@ regain_ownership(){ 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 regain_ownership