我应该如何将 Julia 包持久保存在 Docker 容器中

how should I persistently save Julia packages in a Docker container

我在 运行ning Julia 上 raspberry pi 4。对于我正在做的事情,我需要 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/)。 在 docker 之间移动安装时,控制所有软件包的实际安装位​​置有时也很方便。例如,您可能希望在具有相同 Julia 安装的 2 docker 之间复制 JULIA_DEPOT_PATH 文件夹,以避免安装包所花费的时间,或者您可能正在构建没有互联网的 Docker 图像连接等

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

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

根据 julia 如何(以及由哪个用户)在容器内 运行,您可能需要调整上面的目标路径以指向 Julia 的 DEPOT_PATH.[= 中的第一个条目17=]

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

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