You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

92 lines
3.3 KiB

# syntax=docker/dockerfile:1
#
# Developer station: Neovim (LazyVim) with nvim-dap configured to connect
# to a codelldb DAP server running on the "remote" container.
#
# Builds the newest Neovim from source (Alpine uses musl, so prebuilt
# glibc binaries don't run here) and layers on LazyVim, Catppuccin, and
# the nvim-dap plugin stack. codelldb itself lives on the remote container.
#
# Build (run from repository root):
# docker build -t dap-debug-dev -f devstation/Dockerfile .
#
# Pin a specific Neovim release:
# docker build --build-arg NVIM_REF=v0.12.3 -t dap-debug-dev -f devstation/Dockerfile .
###############################################################################
# Stage 1 - build the newest Neovim from source
###############################################################################
FROM alpine:latest AS nvim-builder
ARG NVIM_REF=stable
RUN apk add --no-cache \
build-base cmake coreutils curl gettext-tiny-dev git \
linux-headers ninja unzip \
&& git clone --depth 1 --branch "${NVIM_REF}" https://github.com/neovim/neovim.git /tmp/neovim \
&& make -C /tmp/neovim \
CMAKE_BUILD_TYPE=Release \
CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=/opt/nvim" \
&& make -C /tmp/neovim install \
&& strip /opt/nvim/bin/nvim
###############################################################################
# Stage 2 - runtime image with LazyVim and DAP configuration
###############################################################################
FROM alpine:latest
ENV HOME=/home/dev \
TERM=xterm-256color \
PATH="/opt/nvim/bin:${PATH}"
RUN addgroup -g 1000 dev \
&& adduser -D -u 1000 -G dev -h /home/dev -s /bin/ash dev
# LazyVim runtime dependencies + C++ toolchain for reading/browsing code.
# clang-extra-tools provides clangd for LSP code navigation.
RUN apk add --no-cache \
git curl ca-certificates \
ripgrep fd fzf \
build-base cmake ccmake \
gdb strace \
clang-extra-tools \
bash unzip less \
ncurses-terminfo \
tree-sitter-cli
# Neovim built in stage 1.
COPY --from=nvim-builder /opt/nvim /opt/nvim
# C++ demo project — source for editing, browsing, and setting breakpoints.
COPY --chown=dev:dev common/project/ /project/
USER dev
WORKDIR /project
RUN mkdir -p build \
&& cd build \
&& cmake -DCMAKE_BUILD_TYPE=Debug .. \
&& make -j"$(nproc)" \
&& ln -sf /project/build/compile_commands.json /project/compile_commands.json
# ---------------------------------------------------------------------------
# LazyVim configuration
# ---------------------------------------------------------------------------
# LazyVim starter configuration (https://github.com/LazyVim/starter).
RUN git clone --depth 1 https://github.com/LazyVim/starter "${HOME}/.config/nvim" \
&& rm -rf "${HOME}/.config/nvim/.git"
# Plugin specs — theme, LSP, and DAP configuration.
# See devstation/nvim-config/lua/plugins/ for the source files.
COPY --chown=dev:dev devstation/nvim-config/lua/plugins/ "${HOME}/.config/nvim/lua/plugins/"
# Pre-install plugins so the editor is ready to use on the first launch.
RUN timeout 600 nvim --headless "+Lazy! sync" +qa || true
# Pre-compile LazyVim's treesitter parsers.
COPY --chown=dev:dev devstation/scripts/precompile-treesitter.lua /tmp/precompile-treesitter.lua
RUN timeout 900 nvim --headless -c "luafile /tmp/precompile-treesitter.lua" \
&& rm -f /tmp/precompile-treesitter.lua
CMD ["nvim"]