this post was submitted on 26 Feb 2024
20 points (100.0% liked)

Nix / NixOS

2310 readers
1 users here now

Main links

Videos

founded 2 years ago
MODERATORS
 

I just switched one of my systems over to NixOS from Arch and so far it seems interesting. One question I had is regarding the nix-shell. So I get the basic concept of it and that it allows creating a shell that has packages installed with that shell making ideal for dev environments. I've even seen talks where the suggest nix-shells over docker/podman, my question is how is persistent data (like databases) handled?

you are viewing a single comment's thread
view the rest of the comments
[โ€“] vendion@lemmy.ml 1 points 1 year ago (1 children)

Okay, hopefully someone here can point out where I am going wrong with setting up my dev shell the way I want. I am currently using direnv and nix-direnv to manage the dev shell, and I found this blog post which shows a way to start and stop MySQL/Mariadb but I am having some weird issues with it.

Currently my flake looks like this:

{
  description = "A basic flake with a shell";
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  inputs.flake-utils.url = "github:numtide/flake-utils";

  outputs = { nixpkgs, flake-utils, ... }@inputs:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = nixpkgs.legacyPackages.${system};
      in
      {
        devShells.default = pkgs.mkShell {
          packages = with pkgs; [
            bashInteractive
            php
          ];

          buildInputs = [ pkgs.mariadb ];

          shellHook = ''
          export MYSQL_BASEDIR=${pkgs.mariadb}
          export MYSQL_HOME=$PWD/.direnv/mysql
          export MYSQL_DATADIR=$MYSQL_HOME/data
          export MYSQL_UNIX_PORT=$MYSQL_HOME/mysql.sock
          export MYSQL_PID_FILE=$MYSQL_HOME/mysql.pid
          alias mysql='mysql -u root'

          if [[ ! -d $MYSQL_HOME ]]; then
            mariadb-install-db --auth-root-authentication-method=normal \
              --datadir="$MYSQL_DATADIR" --basedir="$MYSQL_BASEDIR" \
              --pid-file="$MYSQL_PID_FILE"
          fi

          mariadbd --datadir=$MYSQL_DATADIR --pid-file=$MYSQL_PID_FILE \
            --socket=$MYSQL_UNIX_PORT --tmpdir='/tmp' 2>/dev/null &
          MYSQL_PID=$!
          '';
        };
      });
}

When I run it like this mariadbd starts just fine, but doesn't get backgrounded dispite the & making that shell session useless which is not what I want as I have to spawn a second shell just to do anything.

Even weirder is when I add the finish() function and the call to trap like in the blog post then mariadbd doesn't start (or starts and immedently gets killed).

mariadb doesn't get backgrounded? Are you sure? Are you able to type commands and see their output? Also, what happens when putting set -x at the start of your shell hook? You should see the last line printed e.g MYSQL_PID=12345

Anti Commercial-AI license