基于Alpine基础镜像构建Docker镜像时设置www-data为默认用户
解决方案
要让你的容器在以bash模式运行(比如docker run -it <image> bash或docker exec -it <container> bash)时默认使用www-data用户,同时保证crond、httpd等服务能正常启动,这里提供两种适配你场景的方案:
方案二:保持服务以root运行,交互式bash自动切换到www-data(适配你的现有服务配置)
你的CMD中包含需要root权限的crond和httpd服务,直接切换默认用户会导致这些服务无法启动。这个方案既能保证服务正常运行,又能让你进入容器时自动切换到www-data:
步骤1:修改www-data的默认shell(可选但推荐)
Alpine默认给www-data配置的是/sbin/nologin,没法直接用bash登录,先把它改成bash:
RUN sed -i 's/www-data:x:82:82:www-data:\/var\/www:\/sbin\/nologin/www-data:x:82:82:www-data:\/var\/www:\/bin\/bash/' /etc/passwd
步骤2:让root的bash自动切换到www-data
在root用户的.bashrc中添加自动切换命令,这样每次进入bash都会直接切换到www-data:
RUN echo 'su - www-data' >> /root/.bashrc
最终修改后的完整Dockerfile
把以上修改整合到你的现有文件中:
FROM php:7.2-fpm-alpine LABEL maintainer="y.ghorecha@abc.de" \ muz.customer="xxx" \ muz.product="WIDC" \ container.mode="production" RUN apk add --no-cache --virtual .deps autoconf tzdata build-base libzip-dev mysql-dev gmp-dev \ libxml2-dev libpng-dev zlib-dev freetype-dev jpeg-dev icu-dev openldap-dev libxslt-dev && \ docker-php-ext-install zip xml mbstring json intl gd pdo pdo_mysql iconv soap \ dom gmp fileinfo sockets bcmath mysqli ldap xsl && \ echo 'date.timezone="Europe/Berlin"' >> "${PHP_INI_DIR}"/php.ini && \ cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime && \ echo 'Europe/Berlin' > /etc/timezone && \ apk del .deps && \ apk add --no-cache libzip mysql libxml2 libpng zlib freetype jpeg icu gmp git subversion libxslt openldap \ apache2 apache2-ldap apache2-proxy libreoffice openjdk11-jre ghostscript msttcorefonts-installer \ terminus-font ghostscript-fonts && \ ln -s /usr/lib/apache2 /usr/lib/apache2/modules && \ ln -s /usr/sbin/httpd /etc/init.d/httpd && \ update-ms-fonts # imap setup RUN apk --update --virtual build-deps add imap-dev && \ apk add imap && \ docker-php-ext-install imap # copy all codebase COPY ./ /var/www # SSH setup RUN apk update && \ apk add --no-cache openssh-keygen openssh # copy Azure specific files COPY backend/build/azure/backend/ /var/www/backend/ # User owner setup RUN chown -R www-data:www-data /var/www/ # Work directory setup WORKDIR /var/www # copy apache httpd.conf file COPY httpd.conf /etc/apache2/httpd.conf # copy crontabs for root user COPY backend/data/CRONTAB/production/crontab.txt /etc/crontabs/www-data # SSH Key setup RUN mkdir -p /home/www-data/.ssh && \ chown -R www-data:www-data /home/www-data # 为www-data设置bash shell RUN sed -i 's/www-data:x:82:82:www-data:\/var\/www:\/sbin\/nologin/www-data:x:82:82:www-data:\/var\/www:\/bin\/bash/' /etc/passwd # 让root的bash自动切换到www-data RUN echo 'su - www-data' >> /root/.bashrc CMD ["/bin/sh", "-c", "rm -f /usr/local/apache2/logs/httpd.pid && /usr/sbin/crond start && httpd -DBACKGROUND && php-fpm"]
测试验证
构建镜像后:
- 启动服务:
docker run -d <your-image>,crond、httpd等服务会以root权限正常运行 - 进入容器bash:
docker exec -it <container-id> bash,此时会自动切换到www-data,执行whoami会显示www-data - 临时回到root:执行
exit即可(因为是通过su切换过来的),或者直接输入su root(容器内root默认无密码,可直接切换)
内容的提问来源于stack exchange,提问作者Yogi Ghorecha
相关产品推荐
相关产品推荐

