如何在Alpine Linux Docker镜像中配置sudo及oh-my-zsh(类Ubuntu方式)
问题解决:Alpine Docker镜像中普通用户的Oh-My-Zsh未生效
问题背景
使用Alpine Linux构建Docker镜像时,通过sudo为普通用户myuser安装zsh和Oh-My-Zsh,但镜像启动后发现只有root用户的Oh-My-Zsh生效,myuser的用户目录下没有Oh-My-Zsh配置,无法使用。
原因分析
执行sudo sh -c "$(wget ... install.sh -O -)"时,sudo默认以root身份运行脚本,Oh-My-Zsh的安装脚本会读取当前执行用户的HOME环境变量,因此将配置文件安装到了/root目录,而非myuser的/home/myuser目录。
解决方案
要让Oh-My-Zsh安装到myuser的用户目录,需要确保安装脚本以myuser的身份执行,而非root。可以通过两种方式实现:
方式一:用sudo指定执行用户
将安装Oh-My-Zsh的命令改为用sudo -u myuser指定以myuser身份执行,确保环境变量匹配目标用户:
RUN sudo -u myuser sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
方式二:切换到myuser身份执行
先切换回root用户,再用su - myuser -c执行安装命令,直接继承myuser的环境:
USER root RUN su - myuser -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)" USER myuser
修正后的完整Dockerfile
FROM alpine:latest ARG TITLE="skeleton_linux" ARG ROOT_PASSWORD="dummy123" ARG MYUSER_PASSWORD="dummy123" LABEL title=$TITLE LABEL version="1.0.0" ENV TZ=Asia/Seoul RUN apk update && apk upgrade RUN echo "root:$ROOT_PASSWORD" | chpasswd RUN apk add sudo nano RUN sed -i "s|root ALL=(ALL:ALL) ALL|root ALL=NOPASSWD: ALL\nmyuser ALL=NOPASSWD: ALL|g" /etc/sudoers RUN adduser -D myuser RUN echo "myuser:$MYUSER_PASSWORD" | chpasswd RUN chmod u+s /bin/busybox USER myuser WORKDIR /home/myuser RUN sudo apk add zsh git RUN sudo sed -i "s|/bin/ash|/bin/zsh|g" /etc/passwd # 以myuser身份执行Oh-My-Zsh安装脚本 RUN sudo -u myuser sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
额外优化说明
- 合并
apk add zsh和apk add git命令,减少镜像构建层数 - 确保安装脚本以目标用户身份执行,保证配置文件生成在正确的用户目录下
内容的提问来源于stack exchange,提问作者jinyoung
相关产品推荐
相关产品推荐

