使用Podman构建Gleam开发环境

撰写于2025年08月11日。

又是被容器折腾到后半夜的时候啊w

环境配置

在Windows 11上用pwsh看看:

> podman --version
podman version 5.5.2
> podman machine list
NAME                    VM TYPE     CREATED     LAST UP            CPUS        MEMORY      DISK SIZE
podman-machine-default  wsl         8 days ago  Currently running  8           2GiB        100GiB

注意要保证machine启动。

工作目录创建

创建.devcontainer文件夹,结构如下:

│  Containerfile
│  devcontainer.json
│
└─keys
        pub.key
        sec.key

以下逐个说明。

首先是Containerfile

FROM docker.io/library/alpine:latest

RUN echo "https://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories

RUN apk update && \
  apk add --no-cache bash \
  sudo \
  erlang \
  rebar3 \
  gleam \
  git \
  gnupg \
  gpg-agent

ENV BASH_ENV="/etc/profile"
ENV GPG_TTY="tty"

RUN adduser -D -u 1001 -s /bin/bash -G wheel myuser
RUN echo "%wheel ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
RUN echo "%sudo ALL=(ALL:ALL) ALL" >> /etc/sudoers

USER myuser

COPY --chown=myuser:wheel ./keys/ /home/myuser/keys/

RUN gpg-agent --debug -vvvvv --daemon
RUN touch ~/.gnupg/gpg-agent.conf && \
  echo "disable-scdaemon" > ~/.gnupg/gpg-agent.conf && \
  echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf
RUN touch ~/.gnupg/gpg.conf && \
  echo "pinentry-mode loopback" > ~/.gnupg/gpg.conf

ENTRYPOINT ["/bin/bash"]

在此提一下:环境变量GPG_TTY设定与否,~/.gnupg/gpg-agent.conf里是否添加行allow-loopback-pinentry,与~/.gnupg/gpg.conf里是否添加pinentry-mode loopback,我只能说怎样好用怎样用。gpg相关的设定确实很繁琐,遇到挫折还是多查一下的好。

devcontainer.json内容如下:

{
    "name": "gleam-test",
    "build": { "dockerfile": "Containerfile" },
    "customizations": {
        "vscode": {
            "extensions": [ "gleam.gleam" ]
        }
    }
}

另外我这边还需要放一下自己要给git用的GPG key,放进keys文件夹。(相关信息可参考文章:特定のリポジトリーで Git commit 時に署名するための設定GPG 鍵を別マシンに移植するGPG秘密鍵を別PCに移動させる

然后回到上级文件夹,初始化一个Git repo:

> Set-Location ..
> git init

接下来就要去IDE或文本编辑器使用容器了。在这里我要用Visual Studio Code(以下简称VSCode)。

启动容器

先在VSCode中装好Dev Containers这个扩展,再用VSCode打开hello_gleam文件夹,这时候VSCode就会请求build这个容器,我们当然同意这样,然后让它自己处理就是了。

Build好之后,打开当前VSCode窗口的终端,就可以建立Gleam工程了(为防止权限不足的问题,以下多用sudo):

$ sudo gleam new .
(省略)

此时会创建.gitignore文件。记得在里面加一条/.devcontainer

现在可以跑一下测试和运行看看:

$ sudo gleam test
(省略)
$ sudo gleam run
(省略)

删掉自动生成的GPG相关的无用文件和文件夹(至少在我这里是必须的,不然gpg --import时会冻结),再导入自己的key:

$ rm -r ~/.gnupg/S.gpg-agent ~/.gnupg/private-keys-v1.d/
$ gpg --import ./.devcontainer/keys/pub.key
(省略)
$ gpg --import ./.devcontainer/keys/sec.key
(省略)

再查看一下VSCode中Source Control中的情况是否正常,如果无法显示Changes就点那个按钮(Manage Unsafe Repositories)。

现在进行一下开发,感觉可以了就把变更stage掉,记录一下commit comment就commit吧(我这边由于gpg设定了密码,所以一般还是在终端用git commit -m '...'这样)。还有问题的话可以查看一下当前git的设置是否正确。

后记

至于说我为什么用Podman,只是因为我电脑里正好装了它而已。我为什么用GPG,也只是因为我Windows宿主机也用了它而已。

总之就是简单试试,各位看个新鲜就好。

InSb

InSb

只是跟工作和生活相关的记录