使用dotfiles(neovim、vim、tmux)+ Docker可以在任何地方进行环境配置

dotfiles和Docker的好处

我通常使用neovim和wsl来进行开发。
然而,在学校或工作场所重新创建相同的环境经常是不可能的。而且,即使可以(在dotfiles中)复制操作系统的设置也很麻烦。

因此,我們將使用dotfiles和Dockerfile來管理每個環境的設定,並透過git進行版本控制。只需將其上傳至GitHub,就可以隨時隨地使用docker compose up -d來啟動自己喜歡的環境。不需要擔心繁瑣的相依性和各個作業系統的相容性問題。

构成

TL;DR: 对于希望立即启动环境的用户。

    1. dotfiles和Docker的建立方法

 

    遇到的问题和对应解决方案

环境

    • win11 * wsl2

 

    • ubuntu22.04(docker)

 

    nvim

太长了,懒得读。

想要快速使用图像的人

1. 克隆下列内容到git

Dockerfiles的汉语本地化句子:Docker文件

 

2. 根据我的环境,编辑sample-docker-compose.yml。

    • 直接、編集したいディレクトリをdocker-composeのvolumeでマウント

 

    ホストマシンと同じsshのkeyを使用することでDocker内のterminalから、githubへのpushが可能に
version: '3'
services:
  dotfiles:
    image: hwata001/dotfiles:latest
    volumes:
      - type: bind
        source: "<you-working-dir>"
        target: "/home"
      - type: bind
        source: "<your-ssh-key>" #your github ssh key dir
        target: "/root/.ssh"

3. 启动容器

应该能站起来并且进入

docker compose up -d
docker compose run -it dotfiles /bin/bash

删除容器

完成后,请不要忘记删除。

docker ps -a
docker stop <containerID>
docker rm <containerID>

点文件、Docker文件和Docker镜像

点文件

 

Dockerfiles(构建文件)

 

点文件 Docker 镜像

 

如何创建 Docker + dotfiles

    1. 使用Github管理dotfiles文件

 

    1. 创建Dockerfile文件

 

    1. 将Docker镜像推送到Docker Hub

 

    创建docker-compose.yml文件,并指定卷。

在GitHub上管理dotfiles。

让我们在 GitHub 上进行管理,并将存储库设为公共。

 

创建Dockerfile。

FROM ubuntu:22.04

SHELL ["/bin/bash", "-c"]

RUN apt update && \
    apt-get update && \
    apt install -y curl git ripgrep tar unzip vim wget python3 python3-pip python3-venv tmux

# nvim install
RUN wget https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz && \
    tar -zxvf nvim-linux64.tar.gz && \
    mv nvim-linux64/bin/nvim usr/bin/nvim && \
    mv nvim-linux64/lib/nvim usr/lib/nvim && \
    mv nvim-linux64/share/nvim/ usr/share/nvim && \
    rm -rf nvim-linux64 && \
    rm nvim-linux64.tar.gz

RUN apt install -y locales && \
    locale-gen ja_JP.UTF-8

# add my dotfiles
RUN git clone -b main https://github.com/WATA-Haru/dotfiles.git

# you can mount your github ssh-key by using docker compose volume
RUN mkdir ~/.ssh

# bash symbolic link
RUN rm -f ~/.bashrc && \
    ln -s /dotfiles/.bash_aliases ~/.bash_aliases && \
    ln -s /dotfiles/.bashrc ~/.bashrc

# nvim symbolic link
RUN rm -rf ~/.config/nvim && \
    mkdir ~/.config/ && \
    ln -s /dotfiles/nvim ~/.config/nvim

# vim symbolic link
RUN rm -f ~/.vimrc && \
    rm -rf ~/.vim && \
    ln -s /dotfiles/vim/vimrc ~/.vimrc && \
    ln -s /dotfiles/vim/vim ~/.vim

# tmux plugin manager install
RUN git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

# tmux symbolic link
RUN rm -f ~/.tmux.conf && \
    ln -s /dotfiles/tmux/tmux.conf ~/.tmux.conf
	
# install npm for lsp
RUN apt-get install -y ca-certificates gnupg && \
    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
    NODE_MAJOR=20 && \
    echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && \ 
    apt-get update && \
    apt-get install nodejs -y

# dev tools for 42school
# norminette
RUN python3 -m pip install --upgrade pip setuptools
RUN python3 -m pip install norminette

RUN . ~/.bashrc
RUN nvim +:q

关于Dockerfiles

重要的是這段程式碼。我剛剛複製了 dotfiles。

# add my dotfiles
RUN git clone -b main https://github.com/WATA-Haru/dotfiles.git

当你创建了一个Dockerfile之后,你需要进行构建操作。

docker build -t dotfiles .

如果在构建后更改了dotfiles,注意。

在编写Dockerfile的过程中,我们注意到了一些更改,然后编辑了dotfiles。在这种情况下,我们应该加上–no-cache选项重新构建。

docker build --no-cache -t dotfiles .

如果Dockerfile没有更改,Docker将重复使用缓存的内容。即使dotfiles已经更改,Docker也无法检测到,因为Dockerfile内的存储库URL没有更改。因此,如果想要加载最新的dotfiles内容,必须指定–no-cache选项。

※下半部分有一个名为norminette的设置,是为了在我的学校使用而加入的。大多数人不需要此设置。如果您进行自定义,请删除此设置。

将Docker镜像推送至Docker Hub。

请在Docker Hub上注册账号。
您的存储库名称将为自己的/。请创建您喜欢的存储库名称。稍后会用到这个存储库名称。

1. 更改图像名称
将刚刚创建的图像(dotfiles)的名称更改为注册的存储库名称。

docker tag dotfiles <My-Docker-ID>/<My-Repository-Name>

用下列的中文句子转述:
当你运行docker image ls命令时,你会看到与dotfiles具有相同ID的/。

将2.将镜像推送到Docker Hub。

docker push <My-Docker-ID>/<My-Repository-Name>

4. 创建docker-compose.yml文件并指定volume。

version: '3'
services:
  dotfiles:
    image: hwata001/dotfiles:latest
    volumes:
      - type: bind
        source: "<you-working-dir>"
        target: "/home"
      - type: bind
        source: "<your-ssh-key>" #your github ssh key dir
        target: "/root/.ssh"

通过指定 作为您希望挂载的工作目录
并将 设定为您存放 GitHub SSH 密钥的目录
来进行挂载。

这个非常有帮助。

 

然后,

docker compose up -d
docker compose run -it dotfiles /bin/bash

你可以使用这个来访问Docker内部的终端。
你还可以使用tmux!

image.png

状况和相应措施

在tmux中无法进行日语输入的原因是什么 -> 使用tmux -u。

我把tmux -u设为别名。这是为了启用utf-8选项。

安装了tmux插件但是背景色没有改变!(低级错误)原来是PowerShell的设置导致的。

    • terminal(筆者の環境ではPowershell)本体の色設定が必要でした。

 

    Powershellの上部を右クリック->settings->Appearance->背景色変更

我进入了tmux,但用户名仍然是白色的。

image.png
image.png

请查看以下链接:
https://github.com/WATA-Haru/dotfiles/blob/main/.bashrc

Neovim,vim的配色方案颜色没有变化。

我已经添加了以下内容。


set-option -g default-terminal "screen-256color"
set-option -ga terminal-overrides "$TERM:Tc"
set -sa terminal-overrides "*:Tc"
if $TMUX != ""
   let &t_8f = "\<Esc>[38:2:%lu:%lu:%lum"
   let &t_8b = "\<Esc>[48:2:%lu:%lu:%lum"
endif

不需要init.lua的设置。

借鉴

 

在Windows * WSL上,与Neovim和Tmux共享剪贴板

※对于Mac系统,尚未验证其功能。

我根据此进行了直接的写作参考。

 

neovim 新迭代的编辑器

vim.opt.clipboard = "unnamedplus"

if vim.env.TMUX then
    vim.g.clipboard = {
        name = 'tmux',
        copy = {
            ["+"] = {'tmux', 'load-buffer', '-w', '-'},
            ["*"] = {'tmux', 'load-buffer', '-w', '-'},
        },
        paste = {
            ["+"] = {'tmux', 'save-buffer', '-'},
            ["*"] = {'tmux', 'save-buffer', '-'},
        },
        cache_enabled = false,
    }
end

将以下内容用中文进行本地化,只需一种选项:tmux

# tmux clipboard
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"
bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"

在使用vim时,从主机的剪贴板粘贴(使用ctrl + v)时,缩进会变乱。

我按照这个作为参考原样写了出来。

 

if &term =~ "xterm"
    let &t_ti .= "\e[?2004h"
    let &t_te .= "\e[?2004l"
    let &pastetoggle = "\e[201~"

    function XTermPasteBegin(ret)
        set paste
        return a:ret
    endfunction

    noremap <special> <expr> <Esc>[200~ XTermPasteBegin("0i")
    inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
    cnoremap <special> <Esc>[200~ <nop>
    cnoremap <special> <Esc>[201~ <nop>
endif

在Docker内部,无法指定Git的safe.directory。

有时候,我无法理解以下内容的原因。

 git config --global --add safe.directory <dir>

如果按照以下的写法就可以做到。很神秘。

git config --system --add safe.directory "${PWD}"

 

未解决的问题 (Unresolved problem)

    1. 只需要提供一个选项。

– Neovim可以共享剪贴板到主操作系统,然而普通的Vim则无法实现。即使安装了vim-gtk3或去查看stack overflow也不行。如果您有任何好的方法,请告诉我。

– 每次进入容器都需要手动输入github的用户信息。

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

因为每次都被问到这个问题,我试图将其自动化,但除了写在Dockerfiles中外,我找不到其他的方法,所以放弃了。由于Dockerfile是公开的,我不想放入我的个人信息。

一篇被借鉴的文章

这篇文章非常有参考价值。非常感谢。

 

(再掲) dotfiles、Dockerfiles和Docker镜像列表。

点文件

 

Dockerfiles 的中文翻译:Docker 文件

 

dotfiles Docker镜像

 

由于我是Docker的新手,如果有不足之处,请指正。