有没有一种优雅的方式让 conda 在 docker 构建期间安装第 3 方 golang 包?

Is there an elegant way to have conda install a 3rd party golang package during a docker build?

我正在为 s/w 开发准备带有 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 provides a nice workaround here 涉及更新 .bashrc(谢谢)。

不幸的是,我还需要安装 a third party YAML package to golang. I have to activate the environment to install the package, so it brings me back to the original problem JaegerP 帮助我克服了:在初始化之前我无法激活环境,并且在 docker 构建期间我无法初始化 b/c 我必须重新启动 shell.

换句话说,这很好用:

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

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

RUN conda env create --file goDev.yml
&& rm goDev.yml
&& conda init bash
&& conda activate go_dev
&& go get gopkg.in/yaml.v2
&& echo "source /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 包,而不是每次图像 运行 时都检查它?

试试 Conda 运行

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 的 运行 链
conda clean -qafy

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