用户必须具有什么权限才能公开Docker容器端口?

时间:2019-04-07 12:32:46

标签: docker permissions puppeteer alpine

我正在docker容器上设置人偶。尝试根据其故障排除页面https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md#running-on-alpine进行操作。

但是在创建并使用新用户(pptruser)之后,服务器无法公开端口80,因为该用户没有权限Error: listen EACCES 0.0.0.0:80

找不到关于我应添加给该用户的权限的清晰文档,以便该用户可以暴露$ PORT

试图将用户添加到sudo中,但这没有用,但另一方面,即使该方法可行,我也认为这是一个错误,因为存在安全隐患。

尝试在开始使用新用户之前公开端口,这也失败了。

Dockerfile

FROM node

# Installs latest Chromium (72) package.
RUN apk update && apk upgrade && \
    echo @edge http://nl.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories && \
    echo @edge http://nl.alpinelinux.org/alpine/edge/main >> /etc/apk/repositories && \
    apk add --no-cache \
      chromium@edge \
      nss@edge \
      freetype@edge \
      harfbuzz@edge \
      ttf-freefont@edge \
      udev

RUN mkdir -p /app
WORKDIR /app

# Tell Puppeteer to skip installing Chrome. We'll be using the installed package.
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true

# Add user so we don't need --no-sandbox.
RUN addgroup -S pptruser && adduser -S -g pptruser pptruser \
    && mkdir -p /home/pptruser/Downloads \
    && chown -R pptruser:pptruser /home/pptruser \
    && chown -R pptruser:pptruser /app


ENV PORT 80
ENV HTTP_PORT $PORT
ENV HTTPS_PORT 443

EXPOSE $HTTP_PORT
EXPOSE $HTTPS_PORT

USER pptruser


CMD [ "run.sh" ]

run.sh

#!/bin/sh

PORT="${HTTP_PORT:-80}"

node "app/bin/server.js"

日志错误

 Error: listen EACCES 0.0.0.0:80
at Object.exports._errnoException (util.js:1020:11)
at exports._exceptionWithHostPort (util.js:1043:20)
at Server._listen2 (net.js:1258:19)
at listen (net.js:1307:10)
at Server.listen (net.js:1403:5)
at appServer.app.then.then.then (/app/bin/server.js:69:12)

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

传统上[1],只有root用户可以绑定1024以下的端口。但是,我认为您会发现这与您的特定用例无关紧要。服务正在容器内部 监听的端口与远程客户端连接到该端口的端口没有任何关系。通过Docker的port publishing机制来控制“主机上暴露的端口”到“容器内侦听的端口”的映射。

在您的示例中,您将配置服务以侦听端口80以外的端口...就本示例而言,假设您将其配置为在端口8080侦听。

运行容器时,将主机上的端口80映射到容器内的端口8080:

docker run -p 80:8080 ...

现在,您可以在主机上的端口80上访问服务。您可以用相同的方式处理端口443。

还请注意,Dockerfile中的EXPOSE关键字在很大程度上是不必要的。在没有操作且仅提供信息的典型Docker环境中。无论是否已经EXPOSE d,您都可以发布端口。

[1]实际上是Linux下的a little more nuanced