如何在 CentOS 7 docker (centos:7) 上安装 gcc/g++ 9

Miz*_*zux 8 gcc docker centos7

为了使用 C++17 include,<filesystem>我需要在 centos 7 docker 中安装 gcc-9 包。

默认情况下,centos:7 将从常规发行版存储库安装 gcc 4.8.5。

docker run --rm -it centos:7
# yum install -y gcc
# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Run Code Online (Sandbox Code Playgroud)

有没有办法轻松安装 gcc-9(或更高版本)包(即不从源代码构建它)

谢谢 !

注意:需要 gcc-9 才能有良好的 C++17<filesystem>支持。
GCC 9 发行说明:

使用 中的类型和函数<filesystem>不需要与-lstdc++fsnow 链接。

源代码: https: //gcc.gnu.org/gcc-9/changes.html

Miz*_*zux 22

到目前为止我所拥有的:

猫 Dockerfile

FROM centos:7 AS env

RUN yum update -y
RUN yum install -y centos-release-scl
RUN yum install -y devtoolset-9

RUN echo "source /opt/rh/devtoolset-9/enable" >> /etc/bashrc
SHELL ["/bin/bash", "--login", "-c"]
RUN gcc --version
Run Code Online (Sandbox Code Playgroud)

所以你必须:

  1. 在 bashrc 注释中添加源代码
    :在 Centos 上是/etc/bashrc,在 ubuntu 上是/etc/bash.bashrc

  2. 将 docker 默认 shell 更新为 bash 并使用“加载”bashrc--login

输出

FROM centos:7 AS env

RUN yum update -y
RUN yum install -y centos-release-scl
RUN yum install -y devtoolset-9

RUN echo "source /opt/rh/devtoolset-9/enable" >> /etc/bashrc
SHELL ["/bin/bash", "--login", "-c"]
RUN gcc --version
Run Code Online (Sandbox Code Playgroud)

什么行不通

测试1

RUN scl enable devtoolset-9 bash
RUN gcc --version | head -1
Run Code Online (Sandbox Code Playgroud)

每个RUN都是一个新的 shell,因此子 bash 在第二行中丢失。

测试2

RUN source /opt/rh/devtoolset-9/enable && gcc --version | head -1
RUN gcc --version | head -1
Run Code Online (Sandbox Code Playgroud)

这里的源代码仅适用于第一个 RUN shell 命令,但会丢失......

测试3

这可能有效,但可能会出现意外行为

ENV PATH=/opt/rh/devtoolset-9/root/bin:$PATH
RUN gcc --version | head -1
Run Code Online (Sandbox Code Playgroud)

这里我们只“修复”PATH变量,但是如果你看一下/opt/rh/devtoolset-9/enable脚本,你会发现除了更新变量之外还有更多的事情要做PATH