我正在尝试为 root 用户构建容器,然后使用我的用户运行它并/root/.zshrc
从内部获取。
这是一个最小的例子:
FROM ubuntu:20.04
RUN apt update
RUN apt install --assume-yes --fix-broken \
curl \
wget \
zsh
RUN echo EDITOR=vim >> /root/.zshrc
RUN chmod a+rx /root
CMD [ "source /root/.zshrc", "zsh"]
调用如下:
docker run --rm -it -v "$HOME/.ssh:$HOME/.ssh:ro" -v "$HOME/.netrc:$HOME/.netrc:ro" -v /etc/passwd:/etc/passwd:ro -v /etc/shadow:/etc/shadow:ro -v /etc/group:/etc/group:ro --user $UID:$UID foo_minimal
我收到的错误是:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"source /root/.zshrc\": stat source /root/.zshrc: no such file or directory": unknown.
这里可能有什么问题?
答案1
如果您想继续使用原来的方法,并且您只是想更新zsh
登录时获取的文件,则可以附加到/etc/zsh/zshrc
:
RUN echo EDITOR=vim >> /etc/zsh/zshrc
然后,无论用户运行该容器,它都会自动获取该文件。
答案2
如果用户有用户名和 shell RC 文件,您可以考虑将其创建为 Dockerfile 的一部分:
FROM ubuntu:20.04
RUN apt update && \
apt install --assume-yes --fix-broken \
curl \
wget \
zsh
RUN groupadd -g 1000 bob && \
useradd -m --uid 1000 --gid 1000 -s /bin/zsh bob && \
echo EDITOR=vim >> /home/bob/.zshrc
CMD [ "zsh" ]
bob
在这里,我添加了一个名为gid 1000 的组和一个名为bob
uid 1000 的用户(您可以更改bob
为与 uid 1000 关联的任何名称。
然后,您可以写入该用户~/.zshrc
而不是/root/.zshrc
答案3
我让它运行起来:
创建一个名为 .zshrc 的文件 source /root/.zshrc 并将其安装在用户主目录中:
~/git/docker/base-ubuntu-20.04/test-delete(allow_multiuser*) » cat .zshrc mihai@mihai-pc 17/10/20 21:07:24
#!/bin/zsh
source /root/.zshrc
进而:
~/git/docker/base-ubuntu-20.04/test-delete(allow_multiuser*) » docker run -it -v "$HOME/.ssh:$HOME/.ssh:ro" -v "$HOME/.netrc:$HOME/.netrc:ro" -v /etc/passwd:/etc/passwd:ro -v /etc/shadow:/etc/shadow:ro -v /etc/group:/etc/group:ro --user $UID:$UID --env "$USER=$USER" -v $(realpath .zshrc):/home/$USER/.zshrc foo_minimal /bin/zsh
df45e8b82593% echo $EDITOR
vim
您觉得这个解决方案怎么样?