我应该如何将Julia包永久保存在Docker容器中 附加说明

问题描述

我在树莓派4上运行Julia。对于我正在做的事情,我需要Julia 1.5,幸运的是,这里有一个docker映像:https://github.com/Julia-Embedded/jlcross

我的挑战是,因为这是一个进行中的开发,所以我发现自己在工作中随处添加软件包。持久保存更新后的环境的最佳方法是什么?

这是我的问题:

  1. 我很难集中精力处理能够从Julia的程序包管理器中保存程序包并在下次运行容器时保持它们状态的卷

  2. 每次安装软件包时以某种方式提交我的docker容器似乎很笨拙。

对最佳方法是否达成共识,或者还有另一种方法可以做我想做的事情?

解决方法

您可以通过Julia Project.toml文件管理软件包及其版本。 此文件可以保留您的依赖关系列表。

这是一个示例Julia会话:

julia> using Pkg

julia> pkg"generate MyProject"
 Generating  project MyProject:
    MyProject\Project.toml
    MyProject\src/MyProject.jl

julia> cd("MyProject")

julia> pkg"activate ."
 Activating environment at `C:\Users\pszufe\myp\MyProject\Project.toml`

julia> pkg"add DataFrames"

现在,最后一步是向您的Project.toml文件提供软件包版本信息。我们首先检查“正常”的版本号:

julia> pkg"st DataFrames"
Project MyProject v0.1.0
Status `C:\Users\pszufe\myp\MyProject\Project.toml`
  [a93c6f00] DataFrames v0.21.7

现在您要编辑Project.toml文件[compat],以将版本号固定为始终为v0.21.7

name = "MyProject"
uuid = "5fe874ab-e862-465c-89f9-b6882972cba7"
authors = ["pszufe <pszufe@******.com>"]
version = "0.1.0"

[deps]
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"

[compat]
DataFrames = "= 0.21.7"

请注意,在最后一行中,相等运算符是两次以固定确切的版本号,另请参见https://julialang.github.io/Pkg.jl/v1/compatibility/

现在,要重用该结构(例如,不同的docker,在系统之间移动等),

cd("MyProject")
using Pkg
pkg"activate ."
pkg"instantiate"

附加说明

还可以查看JULIA_DEPOT_PATH变量(https://docs.julialang.org/en/v1/manual/environment-variables/)。 当在码头之间四处移动安装时,有时可以方便地控制所有软件包的实际安装位​​置。例如,您可能想要在安装了相同Julia的2个Docker之间复制JULIA_DEPOT_PATH文件夹,以避免花费时间安装软件包,或者您可能要构建没有Internet连接等的Docker映像。

,

您可以通过将专用卷装入容器内的/home/your_user/.julia中来保持已下载和预编译的软件包的状态:

$ docker run --mount source=dot-julia,target=/home/your_user/.julia [OTHER_OPTIONS]

取决于在容器内运行julia的方式(和由哪个用户),您可能必须调整上方的目标路径以指向Julia的DEPOT_PATH中的第一个条目。

您可以通过JULIA_DEPOT_PATH环境变量自己设置此路径来控制它。另外,您可以通过在容器中的Julia REPL中运行以下命令来检查它是否位于非标准位置:

julia> println(first(DEPOT_PATH))
/home/francois/.julia