.. _alpine_dev: =============================== Alpine Linux软件开发环境构建 =============================== 我在尝试 :ref:`pi_3` + :ref:`pi_4` 混合集群部署 :ref:`k3s` 时,读到 `Setting Up a Software Development Environment on Alpine Linux `_ ,发现很有启发,也是一个有趣的挑战。在一个轻量级的ARM环境中,实现软件开发、 :ref:`devops` ,并采用 :ref:`edge_cloud` 构建一个ARM集群。 为什么会选择 ``Alpine Linux`` 来构建软件开发环境呢? 从 :ref:`introduce_alpine` 可以看到,Alpine是一个非常非常轻量级的Linux系统,并且适合运行容器( :ref:`docker` )。这对于我们开发者来说,是非常适合的 :ref:`devops` 环境。 构建思路: - :ref:`pi_4` 上安装 :ref:`alpine_linux` ,然后安装 :ref:`docker` ,此时系统占用磁盘空间约500MB - 所有工作环境都在 Docker 容器中构建,并进一步迁移到 :ref:`k3s` 集群环境 - 保持 :ref:`pi_4` 物理主机上运行的OS最精简模式 Docker运行环境 ================ 在 :ref:`alpine_docker` ,然后采用 :ref:`dockerfile` - 使用密码登陆的ssh容器 ``Dockerfile`` : .. literalinclude:: ../../docker/admin/dockerfile/alpine-ssh :language: dockerfile :caption: 提供ssh和sudo的alpine构建Dockerfile - 并准备 ``entrypoint.sh`` : .. literalinclude:: ../../docker/admin/dockerfile/entrypoint.sh :language: bash :caption: 启动ssh脚本 - 然后执行构建镜像命令:: chmod +x -v entrypoint.sh docker build -t alpine-ssh . - 使用以下命令启动容器:: docker run -itd --hostname x-dev --name x-dev -p 122:22 alpine-ssh:latest 安装编译环境 =============== 类似Ubuntu的 ``build-essential`` , :ref:`alpine_linux` 提供了 ``build-base`` 组合安装包,可以安装大多数常用build工具,包括 ``g++`` ``make`` 和 ``binutils`` 。如果要开发 C++,则可以安装一些附加工具包,如 ``cmake`` ,以及 ``linux-headers`` 等。 - 安装编译环境 ``build-base`` (占用 204MB) :: sudo apk add build-base - 安装debug工具 ``gdb`` 以及 ``strace`` :: sudo apk add gdb strace golang --------- - 通过仓库安装golang:: sudo apk add go 参考 :ref:`go_startup` 验证 rust ----------- - 通过仓库安装rust:: sudo apk add rust 参考 :ref:`rust_startup` 验证 安装编辑器构建IDE ==================== 我采用 :ref:`vim` 来构建开发IDE,采用 :ref:`light_vim` 来构建自己的开发环境 桌面 ======== .. note:: 我采用字符界面远程开发,所以没有安装桌面。不过作为轻量级Linux发行版,你可以对应安装一个轻量级的 :ref:`xfce` 桌面。参考文档是 `alpine linux wiki: Xfce `_ 或许以后我会尝试运行Alpine Linux桌面 原文作者采用了Xfce桌面,并且为了能够方便开发,安装了JetBrains IDE系列。原因是Alpine Linux使用musl库,如果使用 ``musl-glibc`` 兼容库非常费劲。而JetBrains是Java程序,OpenJDK(IcedTea项目)可以顺畅在Alpine Linux上运行,所以选择JetBrains全家桶可以非常方便开发工作。 此外,由于 Google 提供的 Android Studio就是基于JetBrains IDE,所以 :ref:`android_studio_in_pi` 也是可行的(只不过为了通用方便,容器内通常运行 :ref:`ubuntu_linux` )。 考虑到树莓派性能有限,并且在 :ref:`edge_cloud_infra` 我只有3台 :ref:`pi_4` (后续横向扩容)需要部署 :ref:`k3s` 以及在此基础上集成 :ref:`rancher` 系统,所以我没有部署任何桌面系统,而是将非常消耗计算资源的容器和虚拟机运行在 :ref:`hpe_dl360_gen9` 服务器部署的 :ref:`priv_cloud_infra` 中。 容器构建 ========= 经过验证后,可以将上述步骤添加到 Alpine Linux 的Dockerfile,以便后续重新构建开发环境,并一步步打磨完善: - 最终完整的 ``x-dev`` 完整 Dockerfile: .. literalinclude:: alpine_dev/alpine-dev :language: dockerfile :caption: alpine构建开发环境的Dockerfile - 执行以下命令构建镜像并启动容器: .. literalinclude:: alpine_dev/alpine-dev_docker :language: bash :caption: 构建alpine开发环境docker容器 - 登陆容器:: ssh 127.0.0.1 -p 122 node容器构建案例 ------------------ - 构建运行Node的容器环境案例: .. literalinclude:: alpine_dev/alpine-node :language: dockerfile :caption: alpine构建运行node的容器Dockerfile - 准备一个 ``app.js`` 作为演示案例: .. literalinclude:: alpine_dev/app.js :language: javascript :caption: nodejs Hello World - 执行以下命令构建镜像并启动容器: .. literalinclude:: alpine_dev/alpine-node_docker :language: bash :caption: 构建alpine运行node的容器 .. note:: 以上是构建node容器的案例,实际上通过容器运行node建议采用nodejs官方 `nodejs / docker-node `_ 来运行 镜像制作和迁移 ==================== - 在完成了容器内部应用升级和安装之后,执行以下命令保存镜像:: docker commit x-dev local:x-dev - 然后将镜像导出备份,以及 :ref:`transfer_docker_image_without_registry` 参考 ======= - `Setting Up a Software Development Environment on Alpine Linux `_ - `Making Our Own Alpine Node.js Container `_ 提供了一个构建node运行环境的容器案例,我在上文参考引用了文中Dockerfile - `How do I start with Node.js after I installed it? `_