Bioconductor / bioconductor_docker

Docker Containers for Bioconductor
https://bioconductor.org/help/docker/
Artistic License 2.0
73 stars 31 forks source link

libpath to put the custom lib folder in the front #66

Closed crazyhottommy closed 1 year ago

crazyhottommy commented 1 year ago

Describe the bug

Hi, I am using the docker container and want to use my custom R library on my host

sudo docker run \
    -v /home/R/host-site-library:/usr/local/lib/R/host-site-library \
    -p 8787:8787 \
    bioconductor/bioconductor_docker:RELEASE_3_15
> .libPaths()
[1] "/home/rstudio/R/x86_64-pc-linux-gnu-library/4.2" "/usr/local/lib/R/host-site-library"             
[3] "/usr/local/lib/R/site-library"                   "/usr/local/lib/R/library"  

but the "/home/rstudio/R/x86_64-pc-linux-gnu-library/4.2" is before "/usr/local/lib/R/host-site-library", so I can not install the new packages to the host.

Thanks!

eddelbuettel commented 1 year ago

Saw your tweet. These are two distinct issues. You are using -v correctly with Docker to bring a directory into the container. That however does not magically tell R to resort its library path and what you see there are the standard three directories implemented since Fritz Leisch and Kurt Hornik asked me / convinced me to set it up that way (plus the local user path below $HOME).

To change .libPaths(), you have to set it. Either via R_LIBS_{USER,SITE} or by calling .libPaths() in your local or default profile. If you want to do this 'permanently' you need to alter the files in /etc/R/ on the container, or else call .libPaths() for your session.

crazyhottommy commented 1 year ago

Thanks for your answer.

 sudo docker run \
    -v /home/R/host-site-library:/usr/local/lib/R/host-site-library \
    -e R_LIBS_USER=/home/R/host-site-library \
    -p 8787:8787 \
    bioconductor/bioconductor_docker:RELEASE_3_15  

This seems to do the trick to remove the "/home/rstudio/R/x86_64-pc-linux-gnu-library/4.2"

> .libPaths()
[1] "/usr/local/lib/R/host-site-library" "/usr/local/lib/R/site-library"     
[3] "/usr/local/lib/R/library"  

but the path is not writable

> install.packages("Seurat")
Installing package into ‘/usr/local/lib/R/host-site-library’
(as ‘lib’ is unspecified)
Warning in install.packages :
  'lib = "/usr/local/lib/R/host-site-library"' is not writable
eddelbuettel commented 1 year ago

Ah, yes, very good -- didn't think of the -e option to set an environment variable which R would pick up in its startup. That is indeed your preferred choice, and a good trick.

Which variable (between R_LIBS_USER and R_LIBS_SITE) differs a little between releases as a R changed a little there. Glad to know you're sorted so feel free to close this -- and maybe amplify the solution you have there in a tweet at a PSA.

crazyhottommy commented 1 year ago

Ah, yes, very good -- didn't think of the -e option to set an environment variable which R would pick up in its startup. That is indeed your preferred choice, and a good trick.

Which variable (between R_LIBS_USER and R_LIBS_SITE) differs a little between releases as a R changed a little there. Glad to know you're sorted so feel free to close this -- and maybe amplify the solution you have there in a tweet at a PSA.

ha, I updated reply. the path is not writable

eddelbuettel commented 1 year ago

That seems like something you can sort out with usual Docker options. There is also -u 1000:1000 to set user 1000 in the container (instead of root) which is what I am. With a bit of chmod fiddling you should be able to share as 'you' on both sides and read/write.

crazyhottommy commented 1 year ago

thanks for the pointer. I saw this too https://github.com/Bioconductor/bioconductor_docker/issues/10 inside the container, I tried

sudo chmod u+w /usr/local/lib/R/host-site-library
[sudo] password for rstudio: 

and by default, log in user is rstudio https://www.bioconductor.org/help/docker/#mounting should I log in as root?

I am not an expert on docker. Thanks for your help!

eddelbuettel commented 1 year ago

So that we're on the same page: you have a folder on the outside ie your host system that you own and that you want to use in position one in the container, for read / and write?

eddelbuettel commented 1 year ago

So this works me:

  1. I am in my directory /usr/local/lib/R-devel/lib/R/library which I use for an on-the-system, outside-the-$PATH r-devel installation. I have about 200 packages here to be able to do RD CMD check with that r-devel.

  2. I am launching the Rocker image drd (with cronjob-driven weekly rebuilds) which may have a more current r-devel.

  3. Test 1 is to use -v and -e. That works:

edd@rob:/usr/local/lib/R-devel/lib/R/library$ docker run -v $PWD:/opt/ -e R_LIBS_USER=/opt rocker/drd Rscript -e '.libPaths()'
[1] "/opt"                          "/usr/local/lib/R/site-library"
[3] "/usr/lib/R/site-library"       "/usr/lib/R/library"           
edd@rob:/usr/local/lib/R-devel/lib/R/library$ 
  1. Test 2 is to use the container to install something. I use the fairly light-weight spdl library of mine, just update:
edd@rob:/usr/local/lib/R-devel/lib/R/library$ docker run -v $PWD:/opt/ -e R_LIBS_USER=/opt rocker/drd Rscript -e 'install.packages("spdl")'
Installing package into ‘/opt’                                                                           
(as ‘lib’ is unspecified)                                                                                
also installing the dependency ‘RcppSpdlog’    
[... rest omitted ...]
  1. That worked. On the outside I have the modified directory that was created (and useable) in the container:
edd@rob:/usr/local/lib/R-devel/lib/R/library$ ls -ltr | tail -2
drwxrwxr-x 10 root root  4096 Dec 15 17:11 RcppSpdlog
drwxrwxr-x  6 root root  4096 Dec 15 17:11 spdl
edd@rob:/usr/local/lib/R-devel/lib/R/library$ 

Docker defaults to root so they were written by root.

crazyhottommy commented 1 year ago

Thanks for your answer.

Test1 works on my side too.

Test 2 (installing package) does not work for me, as "/usr/local/lib/R/host-site-library"' is not writable

inside the container:

rstudio@f5a92942e075:/usr/local/lib/R$ ls -l
total 64
drwxr-xr-x  3 root root   4096 Jun 23 12:32 bin
-rw-r--r--  1 root root  18011 Jun 23 12:32 COPYING
drwxr-xr-x  1 root root   4096 Jun 23 12:32 doc
drwxr-xr-x  1 root root   4096 Dec 15 23:26 etc
drwxr-xr-x  2 1006  1007  4096 Dec 15 23:09 host-site-library
drwxr-xr-x  3 root root   4096 Jun 23 12:32 include
drwxr-xr-x  2 root root   4096 Jun 23 12:32 lib
drwxr-xr-x  1 root root   4096 Aug 11 16:32 library
drwxr-xr-x  2 root root   4096 Jun 23 12:32 modules
drwxr-xr-x 11 root root   4096 Jun 23 12:32 share
drwxrwsr-x  1 root staff  4096 Aug 11 16:33 site-library
-rw-r--r--  1 root root     46 Jun 23 12:32 SVN-REVISION

host-site-library folder is owned by 1006.

eddelbuettel commented 1 year ago

So who is 1006 with group 1007? Is that you on the outside? On my Ubuntu system here I am 1000:1000 because it is effectively single-user:

edd@rob:~$ id
uid=1000(edd) gid=1000(edd) groups=1000(edd),4(adm),....
edd@rob:~$ 

You now have a local deployment problem as we addressed any issues you had with docker / the BioC container.

crazyhottommy commented 1 year ago

appreciate your patience. I forget to mention that I am working on a google cloud VM

 $ id
uid=1006(tommytang) gid=1007(tommytang) groups=1007(tommytang),4(adm),30(dip),44(video),46(plugdev),1000(google-sudoers)

after

chmod a+w -R  /home/R/host-site-library

on the host

Now, it works. Thanks again