FROM quay.io/fedora/fedora:44 # === install system packages === RUN --mount=type=cache,id=dnf-cache,target=/var/cache/libdnf5 \ dnf update -y && \ dnf -y --setopt=keepcache=1 --setopt=install_weak_deps=False install \ bash-completion git-core curl awk jq rg zip unzip which \ host-spawn wl-copy gcc helix helix-themes rsync python3 python3-pip dotnet-sdk-10.0 openssl-devel # === setup user === RUN useradd -ms /bin/bash user && \ echo 'user ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/user && \ mkdir -p /run/user/1000 && \ chown user:user /run/user/1000 # === Add host entry for podman & XDG open === RUN ln -s /usr/local/bin/host /usr/local/bin/podman && \ ln -s /usr/local/bin/host /usr/local/bin/xdg-open COPY config/bin /usr/local/bin # === languages & SDKs === # Golang RUN GO_VERSION=$(curl -sL "https://go.dev/VERSION?m=text" | head -n 1 | tr -d '\r\n') && \ curl -sL "https://go.dev/dl/${GO_VERSION}.linux-amd64.tar.gz" | tar xz -C /usr/local && \ ln -sf /usr/local/go/bin/go /usr/local/bin/go && \ ln -sf /usr/local/go/bin/gofmt /usr/local/bin/gofmt && \ export GOPATH=/usr/local/go && \ go install golang.org/x/tools/gopls@latest && \ ln -sf /usr/local/go/bin/gopls /usr/local/bin/gopls # Deno RUN export DENO_INSTALL=/usr/local/deno && \ curl -fsSL https://deno.land/install.sh | sh && \ ln -sf /usr/local/deno/bin/deno /usr/local/bin/deno # Rust RUN export RUSTUP_HOME=/usr/local/rust && \ export CARGO_HOME=/usr/local/rust && \ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path && \ ln -sf /usr/local/rust/bin/rustc /usr/local/bin/rustc && \ ln -sf /usr/local/rust/bin/cargo /usr/local/bin/cargo && \ ln -sf /usr/local/rust/bin/rustup /usr/local/bin/rustup && \ ln -sf /usr/local/rust/bin/rustfmt /usr/local/bin/rustfmt && \ ln -sf /usr/local/rust/bin/clippy /usr/local/bin/clippy && \ ln -sf /usr/local/rust/bin/rust-analyzer /usr/local/bin/rust-analyzer && \ rustup component add rustfmt clippy rust-analyzer && \ curl https://drager.github.io/wasm-pack/installer/init.sh -sSf | sh # cargo install cargo-generate && \ # cargo install cargo-expand # Dotnet RUN dotnet tool install --global dotnet-ef && \ mkdir -p /usr/local/bin/omnisharp && \ curl -L https://github.com/OmniSharp/omnisharp-roslyn/releases/latest/download/omnisharp-linux-x64-net6.0.tar.gz \ | tar xz -C /usr/local/bin/omnisharp && \ chmod +x /usr/local/bin/omnisharp/OmniSharp # PHP RUN --mount=type=cache,id=dnf-cache,target=/var/cache/libdnf5 \ dnf -y install https://rpm.henderkes.com/static-php-1-0.noarch.rpm && \ dnf -y module enable php-zts:static-8.5 && \ dnf install -y \ frankenphp \ php-zts-dom \ php-zts-xml \ php-zts-tokenizer \ php-zts-session \ php-zts-posix \ php-zts-fileinfo \ php-zts-simplexml \ php-zts-xmlreader \ php-zts-xmlwriter \ php-zts-soap \ php-zts-gd \ php-zts-pdo_mysql \ php-zts-pcntl \ php-zts-zip \ php-zts-exif \ php-zts-bcmath \ php-zts-mysqli \ php-zts-imagick \ php-zts-grpc && \ curl -fsSL https://getcomposer.org/installer | \ php -- --install-dir=/usr/local/bin --filename=composer # === install language servers, tools === RUN deno i -g -f -A --root /usr/local/bin npm:npm npm:bash-language-server npm:vscode-langservers-extracted npm:dockerfile-language-server-nodejs \ npm:typescript npm:typescript-language-server USER user WORKDIR /home/user RUN mkdir -p .config .local .cache COPY --chown=user:user config/bashrc .bashrc COPY --chown=user:user config/git .config/git/config COPY --chown=user:user config/helix/ .config/helix/ # === Cleanup build dependencies === USER root RUN dnf remove -y openssl-devel && dnf clean all && \ rm -rf /tmp/* && rm -rf /root/* USER user VOLUME /home/user