docker - 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.
解决方案
正如@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
并避免所有这些问题。
推荐阅读
- python - Pycharm_为什么我以正常模式和调试模式运行代码时结果不同?
- common-lisp - 检查字符是否在字符串中
- c# - 关键字“this”是否返回引用或值
- jquery - 处理多个 ajax 请求 - 仅使用最后一个请求
- vba - 如何简化宏
- ms-access - 如何通过基于来自两个文本框的日期值按下按钮来对子表单应用过滤器
- node.js - MONGO:艰难的 find() 查询,提供了很好的解释
- javascript - Web Worker 不适用于 chrome 上的 localhost,但它适用于 chrome 开发人员上的 localhost
- swift - 从文件系统显示 PDF 时符合 ATS 政策
- python - Pytorch:加入张量和字典