Julia v1.0.2 Pkg.activate (".") В выпуске контейнера Docker - PullRequest
0 голосов
/ 30 ноября 2018

Я создаю Docker-контейнер для проекта Julia и у меня возникла проблема с Pkg.activate (".") Для использования файла Project.toml проекта.Вот что я делаю:

FROM julia:1.0.2 AS base

ADD src/*.jl /microservice/src/

COPY Manifest.toml /microservice/Manifest.toml
COPY Project.toml /microservice/Project.toml

COPY src/startup.jl /root/.julia/config/startup.jl

WORKDIR /microservice

RUN julia -e 'cd("/microservice")'
RUN julia -e 'using Pkg; Pkg.activate(".")'
RUN julia -e 'using Pkg; Pkg.instantiate()'
RUN julia -e 'using Pkg; Pkg.status()'
RUN julia -e 'println(Base.active_project())'

Когда я собираю контейнер, используя приведенный выше код Dockerfile, я могу убедиться, что весь исходный код и файлы .toml находятся в контейнере.Вызов на Pkg.status() приводит к: Status ~/.julia/environments/v1.0/Project.toml

и Base.active_project() приводит к: /root/.julia/environments/v1.0/Project.toml

Чего мне не хватает, чтобы звонить на Pkg.activate(".") использовать Проект.томл, который я копирую в /microservice?

1 Ответ

0 голосов
/ 30 ноября 2018

Активированная среда не сохраняется между сеансами julia, поэтому ее нужно активировать в каждом сеансе.Вместо того, чтобы начинать каждый сеанс с using Pkg; Pkg.activate("."), у вас есть две лучшие опции:

  1. Запускать julia с флагом --project (задокументировано в таблице на этой странице https://docs.julialang.org/en/v1/manual/getting-started/#man-getting-started-1), т.е.

    RUN julia --project=/microservice -e 'using Pkg; Pkg.instantiate()'
    RUN julia --project=/microservice -e 'using Pkg; Pkg.status()'
    RUN julia --project=/microservice -e 'println(Base.active_project())'
    
  2. Установите флаг среды JULIA_PROJECT (https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_PROJECT-1)

    ENV JULIA_PROJECT=/microservice
    RUN julia -e 'using Pkg; Pkg.instantiate()'
    RUN julia -e 'using Pkg; Pkg.status()'
    RUN julia -e 'println(Base.active_project())'
    

В этой ситуации я бы сказал, что второйвариант лучше, так как я предполагаю, что вы всегда будете использовать эту среду пакета в своих контейнерах.

...