Coder 添加自定义镜像

在 K8S 里面部署了个 Coder,这样就能比较方便地切换开发环境了。

但是 Coder 默认值给了一个裸 Ubuntu 镜像。对于一个 Ubuntu 黑来说,Debian 才是正道。那么如何才能用自己想用的镜像呢?

我自己试了一下,这个 Ubuntu 镜像的例子没啥问题。有几个小点注意一下就好了:

  1. 有几个基础包是一定不能缺的,必须要安:bash 、 ca-certificates 、 curl 、 jq 、 openssh-server 、 sudo 。这几个少了的话,在体验上会有问题,例如少了 openssh-server,那么不能用 vscode 远程连接环境——那还咋玩啊!
  2. 一定要添加一个叫 coder 的 user
  3. 国内神奇的环境,加上我是原版控/官方控,所以每次需要设置一下代理,安装完东西后再取消代理,避免污染环境。

所以 Dockerfile 就长这样:

FROM debian

USER root
ENV DEBIAN_FRONTEND=noninteractive

ENV http_proxy=http://192.168.12.34:5678
ENV https_proxy=http://192.168.12.34:5678
ENV no_proxy=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    bash \
    ca-certificates \
    curl \
    jq \
    openssh-server \
    sudo \
    git \
    htop \
    && rm -rf /var/lib/apt/lists/*

ENV http_proxy=
ENV https_proxy=
ENV no_proxy=

RUN useradd coder \
    --create-home \
    --shell=/bin/bash \
    --uid=1000 \
    --user-group && \
    echo "coder ALL=(ALL) NOPASSWD:ALL" >>/etc/sudoers.d/nopasswd

ENV LANG=en_US.UTF-8
USER coder

用上面这个 dockerfile,我尝试了 debian 、 golang 和 python,都没啥问题。 alpine 的话需要照猫画虎改改,不过我才不会去「把 alpine 当成开发环境」来虐自己呢。


如果你在 Docker 上用,那么大概率不会用到上面这些东西。

如果你在 K8s 里用,由于 K8s 自身不能编译镜像……所以自身不能编译镜像😭所以你需要:

  1. 去找个 Docker 环境,搞一下镜像的编译
  2. 推到仓库里,可以是 dockerhub,也可以像我一样自建

这里比较推荐自建仓库。原因是「创建工作环境」这事儿对我来说还是蛮频繁的,每次都去公网上下载,太慢了,不如内网嗖嗖嗖搞定。

我自己是用的 registry,好像 harbor 啥的似乎体验会更好一些。


所以我的工作流是:

  1. 去 portainer 里,下载镜像
  2. 继续在 portainer 里,应用上面的模板,做自定义镜像
  3. 给镜像打 Tag,推送到私有 registry 里
  4. 去 Coder 里创建 workspace:简单改了下官方的 K8s 模板,创建时填一下镜像完整名字就好了。

还是略麻烦。