You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:02:52