首页 > 解决方案 > Docker 容器不能以非 root 用户运行

问题描述

FROM ubuntu:18.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -yq --no-install-recommends \
    apt-utils \
    curl \
    # Install git
    git \
    # Install apache
    apache2 \
    # Install php 7.2
    libapache2-mod-php7.2 \
    php7.2-cli \
    php7.2-json \
    php7.2-curl \
    php7.2-fpm \
    php7.2-gd \
    php7.2-ldap \
    php7.2-mbstring \
    php7.2-mysql \
    php7.2-soap \
    php7.2-sqlite3 \
    php7.2-xml \
    php7.2-zip \
    php7.2-intl \
    php-imagick \
    # Install tools
    openssl \
    nano \
    graphicsmagick \
    imagemagick \
    ghostscript \
    mysql-client \
    iputils-ping \
    locales \
    sqlite3 \
    ca-certificates \
    && apt-get clean && rm -f /var/www/html/index.html && rm -rf /var/lib/apt/lists/**

ENV LANG en_US.utf8

RUN groupadd --gid 5000 newuser \
    && useradd --home-dir /home/newuser --create-home --uid 5000 \
        --gid 5000 --shell /bin/sh --skel /dev/null newuser

WORKDIR /var/www/html

COPY index.php /var/www/html

EXPOSE 80

HEALTHCHECK --interval=5s --timeout=3s --retries=3 CMD curl -f http://localhost || exit 1

CMD ["apachectl", "-D", "FOREGROUND"]

USER newuser

我得到的错误:

(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down AH00015: Unable to open logs Action '-D FOREGROUND' failed. The Apache error log may have more information.

标签: docker

解决方案


正如@Henry 所写:

非 root 用户无法绑定到低于 1024 的端口。请使用更高的端口,例如 8080。

我建议您更改 apache 端口,如果您需要从主机访问 apache,请将端口 8080 映射到 docker 中的 80。

例如

docker build -t myapacheimg .
docker run -it --rm -p 8080:80 myapacheimg

为了使这些东西正常工作,您需要执行以下操作:

  • 更改 /etc/apache2/ports.conf 中的端口
  • 更改 /etc/apache2/sites-enabled/000-default.conf 中的虚拟主机
  • 更改 /var/log/apache2 和 /var/run/apache2 文件夹的所有权

换句话说,这里是 Dockerfile 的摘录:

...
    && apt-get clean && rm -f /var/www/html/index.html && rm -rf /var/lib/apt/lists/**

COPY ./ports.conf /etc/apache2/ports.conf
COPY ./000-default.conf /etc/apache2/sites-enabled/000-default.conf

ENV LANG en_US.utf8

RUN groupadd --gid 5000 newuser \
    && useradd --home-dir /home/newuser --create-home --uid 5000 \
        --gid 5000 --shell /bin/sh --skel /dev/null newuser

RUN chown -R newuser /var/log/apache2 /var/run/apache2
...

端口.conf

Listen 8080

000-default.conf:

<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

恕我直言,这是一个丑陋的解决方案。我会使用 docker 映像php:7.2-apache并避免所有这些问题。


推荐阅读