Dockerfile中需要的冗余评估$(OPAM ENV)
我成功安装了 coqc
dockerfile
。当我执行Docker时,为什么我需要运行 evary $(opam env)
再次?
##############
# #
# image name #
# #
##############
FROM ubuntu:22.04
#################
# #
# bash > sh ... #
# #
#################
SHELL ["/bin/bash", "-c"]
##########
# #
# update #
# #
##########
RUN apt-get update -y
############################
# #
# minimal set of utilities #
# #
############################
RUN apt-get install curl -y
RUN apt-get install libgmp-dev -y
###########################################
# #
# opam is the easiest way to install coqc #
# #
###########################################
RUN apt-get install opam -y
RUN opam init --disable-sandboxing
RUN eval $(opam env)
#########################################
# #
# install coqc, takes around 10 minutes #
# #
#########################################
RUN opam pin add coq 8.15.2 -y
这是我使用它的方式:
$ docker build --tag host --file .\Dockerfile.txt .
$ docker run -d -t --name my_lovely_docker host
$ docker exec -it my_lovely_docker bash
当我在Docker中时:
root@3055f16a1d78:/# coqc --version
bash: coqc: command not found
root@3055f16a1d78:/# eval $(opam env)
[WARNING] Running as root is not recommended
root@3055f16a1d78:/# coqc --version
The Coq Proof Assistant, version 8.15.2
compiled with OCaml 4.13.1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
”
如上所述, docker-coq repository coq的储存库,例如
:所有标签都可以在此URL上找到:
https:// https:///hub.dub.dub.dub.dhub.com/ r/coqorg/coq#support-tags
和相关的文档在此Wiki中:
https://github.com/coq-community/docker-coq/wiki
for ubuntu供ubuntu进行自我控制的dockerfile作为“安装教程”,
以地址问题中提到的问题(当我执行Docker 时,我为什么需要再次运行
evar> evar> evar>(opam env)
)标准Dockerfile和OPAM指南(尽管不阻碍用例危及使用情况):上述Dockerfile的两个dockerfiles /相关备注之间的变化摘要
,已应用以下修复程序:
Run < / code> commands命令使用
&amp;&amp;
避免在此问题中提出的问题:。-Q
和- no-install-recommends
apt-get
命令,以便输出较少的冗长,并且仅安装软件包包括指定的软件包(和强制性依赖项)。coq
),以便opam
不再向常规[警告]作为root运行的情况不推荐
。当然,可以在非偶数安装中跳过此步骤,因为我们始终在标准工作站上安装了一些常规
$ user
……opam init
命令:在
&amp;&amp; OPAM开关创建系统OCAML-System
因此,
〜/.profile
脚本是自动更新的(感谢- 自动设置
)和Switch的名称(System
)和它的内容(OCAML-SYSTEM
)是明确的。OPAM回购添加 - all-switches -set-default coq-Real https://coq.inria.fr/opam/released
,这样就可以在需要时安装社区软件包,例如,例如:-J“ $(NPROC)”
选项,取决于安装并加速安装,具体取决于环境系统的内核数。apt-get clean&amp;&amp; rm -rf/var/lib/apt/lists/*
和opam清洁-a -c -s -logs
以减小码头层的大小。中提出的主要问题
Run
命令等)中提出的主要问题,命令是更新
path
等。有两种方法可以确保此命令
eval $(opam env)
是自动完成的::opam exec将命令包裹 - …
/bin/bash - -login
,以便〜/.profile
init脚本是源源(实际上,感谢opam init- Auto-Setup
,负责使用适当的环境变量初始化环境外壳等的线,此脚本中的opam
)。为了完整性,这两个解决方案均已在此拟议的Dockerfile中实现(我们可以在没有任何特定缺点的情况下保持两者)。
测试这一切
Prebuilt versions of Coq (within Debian)
As mentioned in the comments, the Docker-Coq repository gathers prebuilt versions of Coq, e.g.:
The list of all tags is available at this URL:
https://hub.docker.com/r/coqorg/coq#supported-tags
and the related documentation is in this Wiki:
https://github.com/coq-community/docker-coq/wiki
A self-contained Dockerfile as an "installation tutorial" for Ubuntu
To address the specific use case mentioned by the OP, here is a comprehensive Dockerfile that solves the main issue mentioned in the question (Why do I need to run
eval $(opam env)
again when I execute the docker), along with several fixes that are necessary to comply with standard Dockerfile and opam guidelines (though don't hinder the use case at stake):Summary of changes between both Dockerfiles / related remarks
In the Dockerfile above, the following fixes have been applied:
RUN
commands with&&
to avoid the issue raised in this SO question: Purpose of specifying several UNIX commands in a single RUN instruction in Dockerfile.-q
and--no-install-recommends
toapt-get
commands, so that the output is less verbose, and the installed packages only include those specified (and mandatory dependencies).coq
here) so thatopam
does not complain anymore with the usual[WARNING] Running as root is not recommended
.Of course, this step can be skipped in a non-Docker installation as we always have some regular
$USER
installed on a standard workstation…opam init
command with:so the
~/.profile
script is updated automatically (thanks to--auto-setup
) and the name of the switch (system
) and its content (ocaml-system
) is explicit.opam repo add --all-switches --set-default coq-released https://coq.inria.fr/opam/released
so that one can then install community packages if need be, e.g.:-j "$(nproc)"
option to parallelize and speedup the installation, depending on the number of cores of the ambient system.apt-get clean && rm -rf /var/lib/apt/lists/*
andopam clean -a -c -s --logs
to reduce the size of the Docker layers.Answer to the main issue raised in the question
Each time a new shell (or a
RUN
command, etc.) is launched, theeval $(opam env)
command is necessary to update thePATH
etc.There are two ways to ensure that this command
eval $(opam env)
is done automatically:opam exec -- …
/bin/bash --login
, so that the~/.profile
init script is sourced (indeed, thanks toopam init --auto-setup
, a line in charge of initializing the ambient shell with proper environement variables and so on, was appended byopam
in this script).For completeness, both solutions have been implemented in this proposed Dockerfile (and we can just keep both without any specific drawback).
To test all this