NixOS 선언적 컨테이너와 로컬 시스템 경로(docker-compose 볼륨 기능과 동일) 간에 파일을 동기화하는 방법은 무엇입니까?

NixOS 선언적 컨테이너와 로컬 시스템 경로(docker-compose 볼륨 기능과 동일) 간에 파일을 동기화하는 방법은 무엇입니까?

내 로컬 워크스테이션에 NixOS 22.11이 설치되어 있습니다.

나는 사용한다추가 컨테이너시스템을 다시 구축하지 않고도 명령형 컨테이너와 같은 선언적 NixOS 컨테이너를 실행할 수 있는 패키지입니다.

데모 컨테이너를 실행하려고 합니다. 컨테이너 내부에 다운로드 및 압축 되어 woocommerce있으며 컨테이너와 로컬 시스템 경로 간에 이러한 파일을 동기화하고 싶습니다. 주요 목적은 nix를 더 잘 배우는 것입니다. docker-compose에서는 다음과 같은 구성을 사용할 수 있습니다.

volumes:
  - <local-path>:<container-path>

NixOS 컨테이너에서 이를 어떻게 구현하나요?

다음 구성을 시도했지만 로컬 시스템 디렉터리가 여전히 비어 있습니다.

fileSystems."/var/www/demo/wp-content/plugins/woocommerce" = {
    device = "/root/woocommerce";
    options = [ "bind" ];
    # noCheck = true;
  }; 
};


serviceConfig = {
  BindPaths = [ "/var/www/demo/wp-content/plugins/woocommerce:/root/woocommerce" ]
};

전체 구성woo.nix

{ pkgs, ... }:

{
  containers.demo = {
    config = {
      fileSystems."/var/www/demo/wp-content/plugins/woocommerce" = {
        device = "/root/woocommerce";
        options = [ "bind" ];
        # noCheck = true;
      };
      users.users.demo = {
        isSystemUser = true;
        createHome = true;
        group = "demo";
      };
      users.groups.demo = { };

      systemd.services.woo = {
        wantedBy = [ "multi-user.target" ];
        path = with pkgs; [ coreutils wget gzip curl unzip ];
        script = ''
          /run/current-system/sw/bin/curl -L https://downloads.wordpress.org/plugin/woocommerce.7.4.1.zip -o /root/woocommerce.zip &&
          unzip /root/woocommerce.zip -d /root &&
          rm /root/woocommerce.zip
        '';
        serviceConfig = {
          BindPaths = [ "/var/www/demo/wp-content/plugins/woocommerce:/root/woocommerce" ];
          # ReadWriteDirectories = [ "/root/woocommerce" ];
        };
      };
    };
  };
  environment.systemPackages = [ pkgs.coreutils pkgs.wget pkgs.gzip pkgs.curl pkgs.unzip ];
}

다음 명령으로 실행합니다.

sudo extra-container create --start <<EOF
$(cat woo.nix)
EOF

NixOS 선언적 컨테이너와 로컬 시스템 간에 파일을 동기화하는 가장 좋은 방법은 무엇입니까?

답변1

bindMounts옵션이 바로 나에게 필요한 것입니다.

containers.demo = {
    bindMounts = {
      "/root/woocommerce" = {
        hostPath = "/var/www/demo/wp-content/plugins/woocommerce";
        isReadOnly = false;
      };
    };

}

관련 정보