使用dotfiles(neovim、vim、tmux)+ Docker可以在任何地方进行环境配置
dotfiles和Docker的好处
我通常使用neovim和wsl来进行开发。
然而,在学校或工作场所重新创建相同的环境经常是不可能的。而且,即使可以(在dotfiles中)复制操作系统的设置也很麻烦。
因此,我們將使用dotfiles和Dockerfile來管理每個環境的設定,並透過git進行版本控制。只需將其上傳至GitHub,就可以隨時隨地使用docker compose up -d來啟動自己喜歡的環境。不需要擔心繁瑣的相依性和各個作業系統的相容性問題。
构成
TL;DR: 对于希望立即启动环境的用户。
-
- 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
-
- 使用Github管理dotfiles文件
-
- 创建Dockerfile文件
-
- 将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!
状况和相应措施
在tmux中无法进行日语输入的原因是什么 -> 使用tmux -u。
我把tmux -u设为别名。这是为了启用utf-8选项。
安装了tmux插件但是背景色没有改变!(低级错误)原来是PowerShell的设置导致的。
-
- terminal(筆者の環境ではPowershell)本体の色設定が必要でした。
- Powershellの上部を右クリック->settings->Appearance->背景色変更
我进入了tmux,但用户名仍然是白色的。
请查看以下链接:
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)
-
- 只需要提供一个选项。
– 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的新手,如果有不足之处,请指正。