问题:Docker 容器中的# Julia v1.0.2 Pkg.activate(".") 问题

我正在为一个 Julia 项目构建一个 Docker 容器,并且 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的 Project.toml ?

解答

激活的环境在 julia 会话之间不是持久的,因此您需要在每个会话中激活它。您有两个更好的选择,而不是使用using Pkg; Pkg.activate(".")开始每个会话:

  1. 使用--project标志启动 julia(记录在本页https://docs.julialang.org/en/v1/manual/getting-started/#man-getting-started-1的表格中)即
运行 julia --projectu003d/microservice -e '使用 Pkg; Pkg.instantiate()'
运行 julia --projectu003d/microservice -e '使用 Pkg; Pkg.status()'
运行 julia --projectu003d/microservice -e 'println(Base.active_project())'

2.设置JULIA_PROJECT环境标志(https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_PROJECT-1)

ENV JULIA_PROJECTu003d/微服务
运行 julia -e '使用 Pkg; Pkg.instantiate()'
运行 julia -e '使用 Pkg; Pkg.status()'
运行 julia -e 'println(Base.active_project())'

在这种情况下,我会说第二种选择更好,因为我假设您将始终在容器中使用此包环境。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐