Dockerfile for C++ Dev Containers

本文提供一个可用于 C++开发环境的Dockerfile, 作为开发容器(dev container)使用. 是一个进阶版的教程, 需要读者了解 dev container. dev container的基本使用教程可以参考我的博客: VS Code Dev Containers 教程: 从基础到进阶配置

本文提供了两个版本的 Dockerfile, 分别是基于 Fedora 和 Ubuntu 24.04 的镜像.

  1. Ubuntu 的用户基数比较大, 为了惠及更多用户, 提供了 Ubuntu 的镜像.
  2. Fedora 相比起 Ubuntu 来说, 软件包更新速度快. C++在不断更新语言功能, 更新的编译器版本对新特性的支持越多, 因而也提供Fedora版本.

已安装的包

如下是本Dockerfile安装的包:

其中vcpkg 中已经安装的包如下:

读者可以根据自己的需求来安装新的包.

Ubuntu 版本 Dockerfile

基于 Ubuntu 24.04 的 Dockerfile

FROM ubuntu:22.04

# 设为noninteractive模式来减少警告
ENV DEBIAN_FRONTEND=noninteractive

# 安装必要的软件, 可以根据自己的需求定制安装软件
RUN apt update -y && \
    apt -y install --no-install-recommends apt-utils dialog && \
    apt -y install \
    build-essential \
    clang \
    cmake \
    curl \
    g++ \
    gcc \
    git \
    iproute2 \
    ninja-build \
    pkg-config \
    poppler-utils \
    procps \
    python3 \
    python3-pip \
    sudo \
    tar \
    unzip \
    zip \
    && apt autoremove -y \
    && apt clean -y

# 添加用户的GID/UID必须与你本机用户的GID/UID匹配, 以免引起权限问题.
# 如果你本机的GID/UID与下面的设置(1000/1000)不一致, 请修改此文件.
# 参考: https://aka.ms/vscode-remote/containers/non-root-user
ARG USER_UID=1000
ARG USER_GID=$USER_UID
ARG USER_NAME=vscode

# 创建一个非root用户
# 参考: https://aka.ms/vscode-remote/containers/non-root-user
RUN groupadd --gid $USER_GID $USER_NAME \
    && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USER_NAME \
    && echo $USER_NAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USER_NAME \
    && chmod 0440 /etc/sudoers.d/$USER_NAME

# setup vcpkg
RUN git clone --depth=1 \
    --single-branch --branch=master \
    https://github.com/microsoft/vcpkg /home/$USER_NAME/vcpkg \
    && /home/$USER_NAME/vcpkg/bootstrap-vcpkg.sh \
    && /home/$USER_NAME/vcpkg/vcpkg integrate install \
    && /home/$USER_NAME/vcpkg/vcpkg install \
    fmt \
    gtest \
    RapidJSON \
    spdlog

# 切回到dialog模式
ENV DEBIAN_FRONTEND=dialog
USER $USER_NAME

最新源文件:

  1. Gitcode 仓库示例
  2. Gitee 项目示例

基于 Ubuntu 22.04 的 Dockerfile

FROM ubuntu:24.04

ENV DEBIAN_FRONTEND=noninteractive

# 更新和安装包
RUN apt update -y && \
    apt -y install --no-install-recommends apt-utils dialog && \
    apt -y install \
    build-essential \
    clang \
    cmake \
    curl \
    g++ \
    gcc \
    git \
    iproute2 \
    ninja-build \
    poppler-utils \
    procps \
    python3 \
    python3-pip \
    pkg-config \
    sudo \
    tar \
    unzip \
    zip \
    && apt autoremove -y \
    && apt clean -y

# for ubuntu:24.04, there already have a user named `ubuntu` with uid 1000, we need to delete it. see:
# https://askubuntu.com/questions/1513927/ubuntu-24-04-docker-images-now-includes-user-ubuntu-with-uid-gid-1000
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu

# 本Dockerfile 添加了一个非root用户`vscode`, 具有sudo权限. 但是对于Linux,
# 该用户的GID/UID必须与您的本地用户UID/GID匹配, 以避免在绑定挂载时出现权限问题.
# 如果您的UID/GID不是1000 请更新USER_UID / USER_GID. 有关详细信息,
# 请参阅https://aka.ms/vscode-remote/containers/non-root-user.
ARG USER_UID=1000
ARG USER_GID=1000
ARG USER_NAME=vscode

# 创建一个非root用户
RUN groupadd --gid $USER_GID $USER_NAME \
    && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USER_NAME \
    && echo $USER_NAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USER_NAME \
    && chmod 0440 /etc/sudoers.d/$USER_NAME

# setup vcpkg
RUN git clone --depth=1 \
    --single-branch --branch=master \
    https://github.com/microsoft/vcpkg /home/$USER_NAME/vcpkg \
    && /home/$USER_NAME/vcpkg/bootstrap-vcpkg.sh \
    && /home/$USER_NAME/vcpkg/vcpkg integrate install \
    && /home/$USER_NAME/vcpkg/vcpkg install \
    fmt \
    gtest \
    RapidJSON \
    spdlog

# 切回到dialog模式
ENV DEBIAN_FRONTEND=dialog

# 拷贝Dockerfile到容器中, 以便在容器中查看Dockerfile的源码
COPY Dockerfile /tmp/Dockerfile

# 切换到用户`vscode`
USER $USER_NAME

最新源文件:

  1. Gitcode 仓库示例
  2. Gitee 项目示例

Fedora 版本 Dockerfile

FROM fedora:latest

# Install required packages
RUN dnf update -y && \
    dnf install -y \
    clang \
    clang-tools-extra \
    cmake \
    curl \
    gdb \
    git \
    iproute \
    libasan \
    libubsan \
    ninja-build \
    procps \
    sudo \
    tar \
    unzip \
    which \
    zip

# 本Dockerfile 添加了一个非root用户`vscode`, 具有sudo权限. 但是对于Linux,
# 该用户的GID/UID必须与您的本地用户UID/GID匹配, 以避免在绑定挂载时出现权限问题.
# 如果您的UID/GID不是1000 请更新USER_UID / USER_GID. 有关详细信息,
# 请参阅https://aka.ms/vscode-remote/containers/non-root-user.
ARG USER_NAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID

RUN groupadd --gid $USER_GID $USER_NAME \
    && useradd --uid $USER_UID --gid $USER_GID -m $USER_NAME

# setup vcpkg
RUN git clone --depth=1 \
    --single-branch --branch=master \
    https://github.com/microsoft/vcpkg /home/$USER_NAME/vcpkg \
    && /home/$USER_NAME/vcpkg/bootstrap-vcpkg.sh \
    && /home/$USER_NAME/vcpkg/vcpkg integrate install \
    && /home/$USER_NAME/vcpkg/vcpkg install \
    fmt \
    gtest \
    RapidJSON \
    spdlog

COPY Dockerfile /tmp/Dockerfile
USER $USER_NAME

最新源文件:

  1. Gitcode 仓库示例
  2. Gitee 项目示例

如何使用

Dockerfile是配合 VS Code dev container 使用的. 这里有一个样例仓库, 可以按照如下的步骤打开使用:

  1. clone 仓库
git clone https://gitee.com/aronic/cmake-project-2024.git
  1. 使用 VS Code 打开仓库

  2. 打开命令面板(Ctrl+Shift+P)

  3. 搜索并选择Dev Containers: Reopen in Container

    命令面板
  4. dev container 会自动构建并启动, 并且会根据配置安装好插件.

    打开完成照片

    可以看到左下角的><符号, 说明已经在 dev container 中了. 底部的状态栏里面有一些CMake相关的配置, 说明插件已经安装好了.

    如您所见, 底部状态栏里面有编译, 运行和调试的按钮. 这些功能都是可以做到的.

相关教程:

  1. 如何在 VS Code 中使用 dev container: VS Code Dev Containers 教程: 从基础到进阶配置
  2. 如何在 CLion 中使用 dev container: Windows 11 CLion C++ Dev Container 开发环境配置
  3. 如何将 VS Code 打造为 C++ IDE: VS Code C++ 开发环境配置

安装系统包

可以打开终端, 用对应的包管理器安装, 不过这些包会在编辑器关闭后丢弃. 常用的包建议写入Dockerfile中.

  1. Ubuntu 系统中安装新的包

    sudo apt install -y [package]
  2. Fedora 系统中安装新的包

    dnf install -y [package]

使用vcpkg安装包

可以打开终端, 使用vcpkg安装包, 这些包会在编辑器关闭后丢弃. 常用的包建议写入Dockerfile中.

$ cd /home/vscode/vcpkg
$ vcpkg search [package]
$ vcpkg install [package]

更多关于vcpkg的使用可以参考: Vcpkg 使用全攻略: 支持 VS Code, Visual Studio 和 CLion

cmake中使用vcpkg构建项目

$ mkdir build && cd build
$ cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/vscode/vcpkg/scripts/buildsystems/vcpkg.cmake

更多关于 CMake 的集成使用可以参考: CMake 入门教程: 从基础到实践

我在 gitee 上有一个简单的 C++项目, 使用了vcpkg管理依赖, 可以参考: CMake Project Sample

进一步阅读

  1. VS Code Dev Containers 教程: 从基础到进阶配置
  2. Windows 11 CLion C++ Dev Container 开发环境配置
  3. VS Code C++ 开发环境配置
  4. Vcpkg 使用全攻略: 支持 VS Code, Visual Studio 和 CLion
  5. CMake 入门教程: 从基础到实践
  6. Vcpkg Quick Start