help-guix
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Environment of a shepherd service


From: Edouard Klein
Subject: Re: Environment of a shepherd service
Date: Tue, 13 Apr 2021 22:12:15 +0200
User-agent: mu4e 1.4.15; emacs 27.1

Hi,

So I looked at the source and I understand that there's no way around
having only PATH=/run/current-system/profile/bin as the sole environment
of a service (which makes me wonder how anyone is running any service in
GuixSD, don't you need any env variables ?).

I tried to define a trivial package that would use wrap-program to
create a script that would set the environment variables to all the
search-paths of my requisomatic package, but I don't know how to access
those !

In the code that is executed by the daemon, all references to the
package are lost, it is not in the same strata as the package.

I can get the store path to the package but that does not help me.

I really could use some guidance here.

Cheers,

Edouard.
edk@beaver-labs.com writes:

> Dear fellow Guixers,
>
> I'm trying to create an operating system declaration, so that I can run
> a piece of software of mine in a container with =guix system container=.
>
> I wrote a package for the software. The package works: the tests pass
> and when the package is installed I can run the software.
>
> I wrote a shepherd service for the software (it's called requisomatic).
> I copied the relevant part at the end of the email.
>
> When I run the container script created by =guix system container=, and
> get a shell in the container, I can run the software (I added the software's
> package to the globally installed packages in the operating-system 
> definition).
>
> But, when I try to run it with shepherd, it fails because it can't find
> flask (a dependency of the software, which I've put as a
> propagated-input, and is indeed installed in the container).
>
> I replaced the software invocation in the shepherd service with just
> "env", and saw that the whole env in the service is:
>
> PATH=/run/current-system/profile/bin
>
> whereas in the shell I get when I connect to the container, the env
> contains many other variables, including a correctly set PYTHONPATH,
> which allows the finding of flask.
>
> So I now know why my software is not starting, but my question is:
>
> Why is the PYTHONPATH (and the other env vars, for that matter) not
> propagated from the package to the shepherd service by default ? And how
> can I make it so ? I would have expected the shepherd service to run
> with the global profile active.
>
> Follow up question, can shepherd services be specified to run in a
> specific profile ? So that I can have two services with incompatible
> dependencies running at the same time in the same operating-system ?
>
> Thanks in advance,
>
> Cheers,
>
> Edouard.
>
>
>
> -----extract from my operating-system declaration file-------
> (define requisomatic-shepherd-service
>   (match-lambda
>     (($ <requisomatic-configuration> user group db-file)
>      (list (shepherd-service
>             (provision '(requisomatic))
>             (requirement '(user-processes networking))
>             (documentation "Run the requisomatic server")
>             (start #~((make-forkexec-constructor
>                     ;;   (append
>                     ;;    (if db-file
>                     ;;      `("env"
>                     ;;        ,(string-append "REQUISOMATIC_DB_FILE=" 
> db-file))
>                     ;;      '())
>                                         '("gunicorn" "requisomatic:app")
>                    ;;   '("env")
>                        ;;)
>                        #:directory (string-append #$requisomatic 
> "/bin/requisomatic/")
>                        #:log-file "/var/log/requisomatic.log")))
>             (stop #~(make-kill-destructor)))))))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]