Home > Back-end >  Docker on Heroku, dependencies not saved in image?
Docker on Heroku, dependencies not saved in image?

Time:02-01

I have a Dockerfile that installs Julia and some dependencies, then call a script. The 1st line of the script is "using JSServe" which should be installed.

# Runs ubuntu commands 
FROM ubuntu

# Install wget and other
RUN apt-get update && \
    apt-get install -y wget && \
    apt-get install -y tar

# Downloads and install julia 
ENV JULIA_NAME "julia-1.9.0-beta2-linux-x86_64.tar.gz"
RUN wget https://julialang-s3.julialang.org/bin/linux/x64/1.9/${JULIA_NAME} && \
    tar -xvzf ${JULIA_NAME} && \
    mv julia-1.9.0-beta2 /opt/ && \
    ln -s /opt/julia-1.9.0-beta2/bin/julia /usr/local/bin/julia && \
    rm ${JULIA_NAME}

# Copy files
COPY Project.toml ./Project.toml 
COPY JSServe_app.jl ./JSServe_app.jl

# Install deps
RUN julia --project -e "import Pkg; Pkg.instantiate(); Pkg.precompile()"

# Run apps
CMD julia --project -e 'include("JSServe_app.jl")'

This works perfectly locally. But on a remote server (Heroku), I get the following error:

Starting process with command `/bin/sh -c julia\ -e\ \'include\(\"JSServe_app.jl\"\)\'` 
ERROR: LoadError: ArgumentError: Package JSServe not found in current path.

I don't understand why... JSServe should be installed - Docker build does work locally. All files can be seen on GitHub https://github.com/AlexisRenchon/app-wglmakie-fig

I tried to install the dependencies in my Docker image, it worked locally, but not on the Heroku remote server.

EDIT: looks like the problem is packages installed are removed somehow...

2023-01-31T14:38:11.444805 00:00 heroku[web.1]: Starting process with command `/bin/sh -c julia\ --project\=.\ -e\ \"import\ Pkg\;\ Pkg.status\(\)\"`
2023-01-31T14:38:13.572537 00:00 app[web.1]:   Installing known registries into `~/.julia`
2023-01-31T14:38:17.410042 00:00 heroku[web.1]: Process exited with status 0
2023-01-31T14:38:17.466348 00:00 heroku[web.1]: State changed from starting to crashed
2023-01-31T14:38:17.176302 00:00 app[web.1]: Status `~/Project.toml`
2023-01-31T14:38:17.212226 00:00 app[web.1]: → [824d6782] JSServe v2.1.0
2023-01-31T14:38:17.212346 00:00 app[web.1]: → [276b4fcb] WGLMakie v0.8.6
2023-01-31T14:38:17.212445 00:00 app[web.1]: Info Packages marked with → are not downloaded, use `instantiate` to download

CodePudding user response:

I think you're missing the --project=., notice the =.

CodePudding user response:

Ok I got it to work:

# Runs ubuntu commands 
FROM ubuntu

# Install wget and other
RUN apt-get update && \
    apt-get install -y wget && \
    apt-get install -y tar

# Downloads and install julia 
ENV JULIA_NAME "julia-1.9.0-beta2-linux-x86_64.tar.gz"
RUN wget https://julialang-s3.julialang.org/bin/linux/x64/1.9/${JULIA_NAME} && \
    tar -xvzf ${JULIA_NAME} && \
    mv julia-1.9.0-beta2 /opt/ && \
    ln -s /opt/julia-1.9.0-beta2/bin/julia /usr/local/bin/julia && \
    rm ${JULIA_NAME}

ENV mainpath ./
RUN mkdir -p ${mainpath}

USER ${NB_USER}

ENV USER_HOME_DIR /home/${NB_USER}
ENV JULIA_PROJECT ${USER_HOME_DIR}
ENV JULIA_DEPOT_PATH ${USER_HOME_DIR}/.julia

# Copy files
COPY Project.toml ${mainpath}/Project.toml 
COPY JSServe_app.jl ${mainpath}/JSServe_app.jl

# Install deps
RUN julia --project=${mainpath} -e "import Pkg; Pkg.instantiate(); Pkg.precompile()"

# Run apps
CMD julia --project=${mainpath} -e 'include("JSServe_app.jl")'
  • Related