在Docker容器中安装GCC编译器

42

我正试图将 mono 包安装到 Docker 容器中,但是 mono 需要 git、autoconf、libtool、automake、build-essential、mono-devel 和 gettext 包。

我的问题在于 libtool 需要 libc-dev,而 libc-dev 又需要 gcc 编译器。

这个 Docker 容器没有安装任何编译器,但是我的本地机器上有。

arcolombo@acolombo:~/Documents/bedgraph_dockerfile$ dpkg --list |grep    compiler
ii  g++                                                                 4:4.8.2-1ubuntu6                                    amd64        GNU C++ compiler
ii  g++-4.8                                                     4.8.2-19ubuntu1                                     amd64        GNU C++ compiler
ii  gcc                                                         4:4.8.2-1ubuntu6                                    amd64        GNU C compiler
ii  gcc-4.8                                                     4.8.2-19ubuntu1                                     amd64        GNU C compiler
ii  hardening-includes                                          2.5ubuntu2.1                                        all          Makefile for enabling compiler flags for security hardening
ii  libllvm3.5:amd64                                            1:3.5-4ubuntu2~trusty2                              amd64        Modular compiler and toolchain technologies, runtime library
ii  libmono-compilerservices-symbolwriter4.0-cil                   3.2.8+dfsg-4ubuntu1.1                               all          Mono.CompilerServices.SymbolWriter library (for CLI 4.0)
ii  libxkbcommon0:amd64                                         0.4.1-0ubuntu1                                      amd64        library interface to the XKB compiler - shared library
ii  mono-mcs                                                    3.2.8+dfsg-4ubuntu1.1                               all          Mono C# 2.0 / 3.0 / 4.0 / 5.0  compiler for CLI 2.0 / 4.0 / 4.5
所以我的问题是,如何将gcc编译器最简单地安装到Docker容器中?我是否应该将这些编译器目录的卷创建到我的Docker容器中?我认为我需要它的原因是我正在运行一个网站,而该网站直接执行Docker镜像。
3个回答

46

在你的 Dockerfile 中:

FROM ubuntu
# ...
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && \
    apt-get -y install gcc mono-mcs && \
    rm -rf /var/lib/apt/lists/*

1
RUN apt-get install g++-4.9 有什么区别? - sophie-germain
1
mono-mcs和它们在mono网站上的指令有什么区别?PATH=$PREFIX/bin:$PATH是什么意思?请看以下内容: git clone https://github.com/mono/mono.git cd mono ./autogen.sh --prefix=$PREFIX make make install - sophie-germain
3
在apt-get install之前,你应该内联DEBIAN_FRONTEND=noninteractive。把它作为docker ENV是不好的做法,因为当你运行容器时它会保持不变。 - zbeekman
1
从我的角度来看,在Docker容器内开发代码并不是一个很好的想法。这对于这些目的来说并不方便。我已经构建了许多Docker镜像用于生产,老实说,没有任何关于DEBIAN_FRONTEND的问题。我建议开发人员在容器内构建和运行单元测试,并在构建后删除它们。这是我的观点。请随意发布您自己的答案 :) - Vitaly Isaev
@VitalyIsaev 我并不是在贬低你的回答,只是指出 Docker 团队认为的最佳实践。如果你在 RUN 命令或者 ENV 中设置它都没关系,只要你明白在 ENV 中设置的后果:它会在 docker build 后持续存在... - zbeekman
显示剩余4条评论

26
据我理解,原帖混淆了术语,可能本意是要问如何将GCC编译器安装到Docker镜像中。我的答案从问题标题(关于容器)开始,然后转向问题本意(关于镜像)。如果您可以在容器中运行BASH shell,则不需要操纵Dockerfile。例如,您可以尝试来自docker run hello-world示例的提示。
docker run -it ubuntu bash

然后只需在容器中的 shell 中运行这些命令...

apt-get update
apt-get install gcc
关键点在于,在原始的Docker容器中使用apt-get install如果没有先运行apt-get update可能不会按预期工作。期望看到...

无法定位软件包gcc

尝试安装g++而没有运行apt-get update时的错误消息更加令人困惑,这是由于正则表达式替换造成的。
另请参见:http://www.liquidweb.com/kb/how-to-list-and-attach-to-docker-containers
docker ps -a ## list all available containers

docker exec -ti [CONTAINER ID] bash

这种实时操作的方法也可以用来创建图像,就像原作者可能打算的那样。使用docker commit将您的实时容器保存为一个新的镜像。


对我来说很有效!在我看来,这比被接受的答案简单得多... - OrenIshShalom

8
您也可以获取已经安装了GCC和/或大部分需要的工具的官方镜像。Docker商店有很多已经设置好的官方镜像:https://store.docker.com/search?page_size=99&q=&source=verified 我不确定它是否是正确的mono,但是他们有一个mono镜像:https://store.docker.com/images/4234a761-444b-4dea-a6b3-31bda725c427?tab=description 还有一个官方的GCC镜像:https://store.docker.com/images/06ad851d-f666-47d3-9ef3-e90535c141ec?tab=description 如果您将要自己构建一些东西,则还有buildpack-deps:https://store.docker.com/images/9e56c286-5b40-4838-89fe-fd513c9c3bd6 您可以按类别浏览:https://store.docker.com/search?page_size=99&q=&source=verified 还可以直接在docker hub上搜索mono或您需要的任何内容:https://hub.docker.com/search/?isAutomated=0&isOfficial=0&page=1&pullCount=0&q=mono&starCount=0

只是强调一下,对于gcc和其他工具,这个命令非常有用:docker pull buildpack-deps:20.04 - CivFan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接