Docker构建过程中使用Conda安装第三方Golang包的优雅方案
可行方案
你不需要依赖conda init的生效结果,也不需要重启shell,直接在同一条RUN命令中手动加载conda的shell配置文件,就能直接激活环境完成第三方包安装,正确的Dockerfile配置如下:
RUN conda env create --file goDev.yml \ && rm goDev.yml \ # 手动加载conda的shell支持脚本,当前进程立即生效 && source /opt/conda/etc/profile.d/conda.sh \ # 直接激活目标环境 && conda activate go_dev \ # 此时go_dev环境已生效,直接安装Go依赖包 && go get gopkg.in/yaml.v2 \ # 保留容器启动自动激活环境的配置 && echo "source /opt/conda/etc/profile.d/conda.sh" >> ${HOME}/.bashrc \ && echo "conda activate go_dev" >> ${HOME}/.bashrc
原理解释
- Docker的每一条RUN指令都会启动一个独立的shell进程,同一条RUN里用
&&连接的所有命令都共享同一个进程上下文 source /opt/conda/etc/profile.d/conda.sh会直接在当前shell进程中注入conda的命令支持和环境变量,不需要修改全局配置再重启shell- 激活
go_dev环境后,当前进程的GOPATH、GOROOT等变量都会切换到对应环境,go get安装的包会直接写入镜像层,不会丢失 - 该方案所有操作都在构建阶段完成,容器启动时不需要额外的检查逻辑,所有从镜像创建的实例都会自带已安装的
yaml.v2依赖
如果你的Conda自定义了安装路径,只需要将source后的路径替换为实际Conda安装目录下的etc/profile.d/conda.sh即可。
内容的提问来源于stack exchange,提问作者latentcode
相关产品推荐
相关产品推荐

