我要在码头集装箱上装木偶。试着按照他们的故障排除页面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)感谢你的任何帮助
发布于 2019-04-07 12:55:44
传统上,只有root用户可以绑定1024以下的端口。但是,我认为您会发现这对于您的特定用例并不重要。服务在容器中侦听的端口与远程客户端连接到它的端口没有任何关系。“暴露在主机上的端口”到“侦听容器内的端口”的映射是通过Docker的港口出版机制控制的。
对于您的示例,您可以将您的服务配置为侦听端口80...for以外的其他内容--这个示例的目的是,假设您将其配置为侦听端口8080。
运行容器时,将主机上的端口80映射到容器内的端口8080:
docker run -p 80:8080 ...现在,您可以在主机上访问端口80的服务。您可以以同样的方式处理端口443。
还要注意,您的Dockerfile中的EXPOSE关键字在很大程度上是不必要的。在典型的Docker环境中,这是一个非操作且只具有信息性的环境。无论是否为EXPOSEd,都可以发布端口。
1这种情况实际上是Linux下的稍微细微一点。
https://stackoverflow.com/questions/55559049
复制相似问题