# What is the correct way to install packages (Julia 0.6.4) that can be accessed by any user?

**URL:** https://discourse.julialang.org/t/what-is-the-correct-way-to-install-packages-julia-0-6-4-that-can-be-accessed-by-any-user/18277
**Category:** New to Julia
**Tags:** package
**Created:** [December 4, 2018, 11:30am UTC](https://discourse.julialang.org/t/what-is-the-correct-way-to-install-packages-julia-0-6-4-that-can-be-accessed-by-any-user/18277 "2018-12-04T11:30:31Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![dnk8n](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnk8n/32/4780_2.png) [@dnk8n](https://discourse.julialang.org/u/dnk8n)
#### Post date: [December 4, 2018, 11:30am UTC](https://discourse.julialang.org/t/what-is-the-correct-way-to-install-packages-julia-0-6-4-that-can-be-accessed-by-any-user/18277/1 "2018-12-04T11:30:31Z")

</div>

I couldn’t see a self evident way of achieving this. Bare in mind I am working within a [singularity container](https://www.sylabs.io/guides/3.0/user-guide/).

My first approach was to install as root but that didn’t work.

I then attempted to bundle the packages in a tar file and unpack upon running the container in the $PWD (setting $JULIA\_PKGDIR to match). However references are still being made to the old directory.

Something to note, when working with singularity is that the the libraries installed as root are available on a write-only filesystem. I have observed that Julia needs to write in order to reconcile cache, etc (is there a way to avoid this writing altogether?).

I am open to alternate solutions. In the end, I want non-root users to be able to use the pre-defined containers. Is there a way to make a copy of all the packages in a new directory (that is read/write) and owned by the user?

Please let me know if I can add more detail. I am working on a workaround atm and will share it here.

---

<div class="post-metadata">

### Author: ![dnk8n](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnk8n/32/4780_2.png) [@dnk8n](https://discourse.julialang.org/u/dnk8n)
#### Post date: [December 4, 2018, 1:57pm UTC](https://discourse.julialang.org/t/what-is-the-correct-way-to-install-packages-julia-0-6-4-that-can-be-accessed-by-any-user/18277/2 "2018-12-04T13:57:05Z")

</div>

Here is my workaround. It is awfully hacky but until I learn what I am missing (both singularity and julia), I see no other way at present. It works by making use of /tmp for the read/write filesystem which Julia seems to need for its package directory.

Please keep in mind, the solution I am looking for on this forum is one which removes the need for there to be a writable filesystem for $JULIA\_PKGDIR and also one where library files owned by root can still be read, write and executed by any other user (one of many user/group ids, etc)

**STEP1:** Build an image, which when executed produces an archive of packages/libraries within a tar file in the current working directory:

**Singularity def for ‘dump tar’ image (save as nextgensequtils\_julia-0-6-4\_dumptar.def):**

```julia
Bootstrap: docker
From: julia:0.6.4

%post
    apt-get -y update
    apt-get -y install bzip2

%environment
    export PATH=/usr/local/julia/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH
    export JULIA_PATH=/usr/local/julia
    export JULIA_GPG=3673DF529D9049477F76B37566E3C7DC03D6E495
    export JULIA_VERSION=0.6.4
    export JULIA_PKGDIR=/tmp/.julia #This needs to be somewhere read/writable and location must be consistent between both images described here. 

%runscript
    rm -rf ${JULIA_PKGDIR}
    julia -e 'Pkg.init(); Pkg.update(); Pkg.clone("https://github.com/MurrellGroup/NextGenSeqUtils.jl"); using NextGenSeqUtils'
    export NEXTGEN_TARDIR=${PWD}/nextgensequtils_julia-0-6-4.tar
    cd ${JULIA_PKGDIR}
    rm -f ${NEXTGEN_TARDIR}
    tar cf ${NEXTGEN_TARDIR} . # Note the dot here

```

**Singularity build command:**  
sudo singularity build nextgensequtils\_julia-0-6-4\_dumptar.sif nextgensequtils\_julia-0-6-4\_dumptar.def

**STEP2:** Run the image from step 1. It should produce a tar file in your $PWD when done

**STEP3:** Build an image based off this one, just a different runscript.  
I failed to see how to do that, so I reluctently copied and pasted the top.

**Singularity def for main image:**

```julia
Bootstrap: docker
From: julia:0.6.4

%post
    apt-get -y update
    apt-get -y install bzip2

%environment
    export PATH=/usr/local/julia/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH
    export JULIA_PATH=/usr/local/julia
    export JULIA_GPG=3673DF529D9049477F76B37566E3C7DC03D6E495
    export JULIA_VERSION=0.6.4
    export JULIA_PKGDIR=/tmp/.julia

%runscript
    rm -rf ${JULIA_PKGDIR}
    mkdir -p ${JULIA_PKGDIR}
    tar -xf ${PWD}/nextgensequtils_julia-0-6-4.tar -C ${JULIA_PKGDIR}/
    julia

```

**Singularity build command:**  
sudo singularity build nextgensequtils\_julia-0-6-4.sif nextgensequtils\_julia-0-6-4.def

**STEP4:** Run the image from step 3. It should drop you into a Julia shell

**STEP5:** Attempt to make the import  
`using NextGenSeqUtils`

If that works, it is looking good. Here is some more code to actually use one of the functions:

```julia
q_seqs = [
    "GATAGTTTTTTTTTTTTGTTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTTTTGTTTTTTTTTTTTTTTGACAG",
    "GATAGTTTTTTTTTTTTGGTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTTGGTTTTTTTTTTTTTTTTGACAG",
    "GATAGTTTTTTTTTGGTTTTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTTGGTTTTTTTTTTTTTTTTGACAG",
    "GATAGTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAATTTTTTTTGGGGGTTTTTTTTTTTTTTTTTGACAG",
    "TCTACTTTTTTTTTGGTTTTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGACAG",
    "TCTACTTTTTTTTTTGTTTTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGACAG",
    "TCTACTTTTTTTTTTTTTGGTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTTTTTGTTTTTTTTTTTTTTGACAG",
    "TCTACTTTTTTTTTTTGGGGGTTTTTTTTTTTTTTAAAAATTTTTTTTTTTGGGGGTTTTTTTTTTTTTTGACAG",
    "CATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTGGTTTTTTTTTTTTTTTTTTGACAG",
    "CATCATTTTTTTTTTTTTTTTTTGGTTTTTTTTTTAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGACAG",
    "CATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGACAG",
    "CATCATTTTTTTTTTTTTTTGGGTTTTTTTTTTTTAAAAATTTTTTTTTTTGGGGGTTTTTTTTTTTTTTGACAG",
    "TGCATTTTTTTTTTGTTTTTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTTTTGGTTTTTTTTTTTTTTGACAG",
    "TGCATTTTTTTTTTTGTTTTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGACAG",
    "TGCATTTTTTTTTTTTGGTTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTTTTGGTTTTTTTTTTTTTTGACAG",
    "TGCATTTTTTTTTTTTTTTGGGGTTTTTTTTTTTTAAAAATTTTTTTTTTTTTTGGGGGTTTTTTTTTTTGACAG",
    "TGCATTTTTTTTTTTGGGGGGTTTTTTTTTTTTTTAAAAATTTTGGGGGGTTTTTTTTTTTTTTTTTTTTGACAG",
    "TGCATTTTTTTTTTTTTTTTGGGGGGTTTTTTTTTAAAAATTGGGGGGTTTTTTTTTTTTTTTTTTTTTTGACAG",
    "CTGTCAAAAAAAAAAAAAAACAAAAAAAAAAAAAATTTTTAAAAAAAAAAAAAAAAACAAAAAAAAAAAACTATC",
    "CTGTCAAAAAAAAAAAAAAAACCAAAAAAAAAAAATTTTTAAAAAAAAAAAAAAAACCAAAAAAAAAAAACTATC",
    "CTGTCAAAAAAAAAAAAAAAACCAAAAAAAAAAAATTTTTAAAAAAAAAAAAAAAAAAACCAAAAAAAAACTATC",
    "CTGTCAAAAAAAAAAAAAAAAACCCCCAAAAAAAATTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTATC",
    "CTGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATTTTTAAAAAAAAAAAAAAAAAAACCAAAAAAAAAGTAGA",
    "CTGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATTTTTAAAAAAAAAAAAAAAAAAACAAAAAAAAAAGTAGA",
    "CTGTCAAAAAAAAAAAAAACAAAAAAAAAAAAAAATTTTTAAAAAAAAAAAAAAACCAAAAAAAAAAAAAGTAGA",
    "CTGTCAAAAAAAAAAAAAACCCCCAAAAAAAAAAATTTTTAAAAAAAAAAAAAACCCCCAAAAAAAAAAAGTAGA",
    "CTGTCAAAAAAAAAAAAAAAAAACCAAAAAAAAAATTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATGATG",
    "CTGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATTTTTAAAAAAAAAACCAAAAAAAAAAAAAAAAAATGATG",
    "CTGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATGATG",
    "CTGTCAAAAAAAAAAAAAACCCCCAAAAAAAAAAATTTTTAAAAAAAAAAAACCCAAAAAAAAAAAAAAATGATG",
    "CTGTCAAAAAAAAAAAAAACCAAAAAAAAAAAAAATTTTTAAAAAAAAAAAAAAAAAAAACAAAAAAAAAATGCA",
    "CTGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATTTTTAAAAAAAAAAAAAAAAAAACAAAAAAAAAAATGCA",
    "CTGTCAAAAAAAAAAAAAACCAAAAAAAAAAAAAATTTTTAAAAAAAAAAAAAAAAACCAAAAAAAAAAAATGCA",
    "CTGTCAAAAAAAAAAACCCCCAAAAAAAAAAAAAATTTTTAAAAAAAAAAAACCCCAAAAAAAAAAAAAAATGCA",
    "CTGTCAAAAAAAAAAAAAAAAAAAACCCCCCAAAATTTTTAAAAAAAAAAAAAACCCCCCAAAAAAAAAAATGCA",
    "CTGTCAAAAAAAAAAAAAAAAAAAAAACCCCCCAATTTTTAAAAAAAAACCCCCCAAAAAAAAAAAAAAAATGCA"
]

forwardPrimers = [
    "GATAGTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT",
    "TCTACTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT",
    "CATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTT",
    "TGCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"
]

reversePrimers = [
    "CTGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
    "CTGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
    "CTGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
    "CTGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
]

forwardNames = ["1", "3", "4", "5"]

reverseNames = ["A", "A", "A", "A"]

using NextGenSeqUtils
demultiplexing = NextGenSeqUtils.deMux(q_seqs,forwardPrimers,reversePrimers,forwardNames,reverseNames)

```

This all works. Any ideas how I can make this work a bit more smoothly?

---

<div class="post-metadata">

### Author: ![dnk8n](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnk8n/32/4780_2.png) [@dnk8n](https://discourse.julialang.org/u/dnk8n)
#### Post date: [December 5, 2018, 5:16pm UTC](https://discourse.julialang.org/t/what-is-the-correct-way-to-install-packages-julia-0-6-4-that-can-be-accessed-by-any-user/18277/3 "2018-12-05T17:16:24Z")

</div>

I revised my workaround solution a bit. Wrote a blog post (mainly for myself to keep track) here - [Create Docker and Singularity images for NextGenSeqUtils | by Dean Kayton | Medium](https://medium.com/@dnk8n/creat-docker-and-singularity-images-for-nextgensequtils-45cb947aa061)
