撰写于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宿主机也用了它而已。
总之就是简单试试,各位看个新鲜就好。