【问题标题】:Is there an elegant way to have conda install a 3rd party golang package during a docker build?有没有一种优雅的方式让 conda 在 docker 构建期间安装第 3 方 golang 包?
【发布时间】:2021-10-05 00:09:02
【问题描述】:

我正在为软件开发准备一个带有 Ubuntu v18.04 的 docker 映像。我包括 miniconda 来管理开发环境,这都是 golang。我create the environment with a YAML file

RUN conda env create --file goDev.yml

我还希望在启动 docker 时激活 conda 环境。必须首先初始化 b/c conda 有点棘手,但 JaegerP 提供了一个很好的解决方法 here 涉及更新 .bashrc(谢谢)。

不幸的是,我还需要将a third party YAML package 安装到golang。我必须激活环境才能安装软件包,所以它让我回到了原来的问题JaegerP 帮助我克服了:在初始化之前我无法激活环境,并且在 docker build b/c 期间我无法初始化我必须重新启动外壳。

换句话说,这很好用:

运行 conda env create --file goDev.yml
&& rm goDev.yml
&& echo "源 /opt/conda/etc/profile.d/conda.sh"
&& echo "conda activate go_dev" >> ${HOME}/.bashrc

docker 启动时会激活所需的 conda 环境,遗憾的是没有安装外部 YAML 包。这不起作用 b/c conda 环境在初始化之前无法激活,并且初始化需要重新启动 shell:

运行 conda env create --file goDev.yml
&& rm goDev.yml
&& conda 初始化 bash
&& conda 激活 go_dev
&& 去获取 gopkg.in/yaml.v2
&& echo "源 /opt/conda/etc/profile.d/conda.sh"
&& echo "conda activate go_dev" >> ${HOME}/.bashrc

如果此文件不存在,我可以进一步更新 .bashrc 以安装 YAML 包:

/root/go/pkg/mod/cache/download/gopkg.in/yaml.v2

是否有更优雅的解决方案让我能够在 docker 构建期间安装第 3 方 golang 包,而不是在每次运行映像时都检查它?

【问题讨论】:

  • 您能否提供一个minimal reproducible example 来说明问题所在?通常你实际上是在构建阶段下载并安装 Go 包(使用 Go 的原生打包工具,你会经常看到 RUN go mod download 将依赖项安装与实际构建二进制文件分开)。
  • 感谢@David-Maze。我正在使用 yaml 文件创建我的 conda 环境。我想在环境中更新golang以包含第三方,所以我需要激活环境。如果你这样做,conda 会抱怨必须初始化环境并且 docker 构建被中断。一个命令: RUN conda env create --file goDev.yml \ && conda init bash \ && conda activate go_dev \ && go get gopkg.in/yaml.v2 不起作用 b/c 必须重新启动 shell初始化工作。解决方法是更新 .bashrc
  • 最好在问题中包含来自 Dockerfile 的代码。你试过像RUN . /opt/conda/etc/profile.d/conda.sh && conda activate yourenv && do_some_go_stuff ...这样的东西吗?此外,我强烈建议您阅读 Conda 核心开发人员之一的 this blog post
  • Docker 通常根本不运行 shell 点文件,并且像 Conda 这样的环境管理器在其中运行可能会很棘手。我通常在 Python 应用程序中看到它们,其中 Anaconda 有一个单独的包存储库。但是对于 Go 应用程序,您根本不需要它;只需启动 Dockerfile FROM golang:1.17RUN go get(或 go mod download)你需要的东西。

标签: docker go conda


【解决方案1】:

试试 Conda Run

conda run 函数提供了一种在环境上下文中运行代码的简洁方式,而无需手动激活。尝试类似

RUN conda env create --file goDev.yml 
  && rm goDev.yml 
  && conda run -n go_dev go get gopkg.in/yaml.v2 
  && echo '. /opt/conda/etc/profile.d/conda.sh && conda activate go_dev' >> ${HOME}/.bashrc

另外,您可能希望结束所有涉及 Conda 的 RUN 链

conda clean -qafy

保持帮助最小化 Docker 镜像层大小。

【讨论】:

  • 谢谢@merv!顺便说一句,“conda clean -qafy”指令节省了大约 700MB 的空间。向@David-Maze 致敬,他的建议是通过创建一个只支持 go 的更简单的 docker 来回避这个问题 - 没想到...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多