Какие разрешения должен иметь пользователь, чтобы открыть порт док-контейнера? - PullRequest
0 голосов
/ 07 апреля 2019

Я настраиваю кукловода на докер-контейнер.Попытался сделать это в соответствии с их страницей устранения неполадок https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md#running-on-alpine.

Но после создания и использования нового пользователя (pptruser) сервер не может открыть порт 80, потому что у пользователя нет разрешения Error: listen EACCES 0.0.0.0:80.

Не могу найти четкую документацию о разрешениях, которые я должен добавить этому пользователю, чтобы пользователь мог EXPOSE $ 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 голосов
/ 07 апреля 2019

Традиционно [1], только пользователь root может связывать порты до 1024. Однако, я думаю, вы обнаружите, что это не имеет значения для вашего конкретного случая использования. Порт, на котором служба прослушивает внутри контейнера, не имеет никакого отношения к порту, к которому подключаются удаленные клиенты. Сопоставление «портов, выставленных на хосте», с «портами, слушающими внутри контейнера», контролируется с помощью механизма докера публикация портов .

В вашем примере вы настроили бы свою службу на прослушивание чего-либо, кроме порта 80 ... для целей этого примера, скажем, вы настроили его на прослушивание на порту 8080.

Когда вы запускаете свой контейнер, сопоставьте порт 80 на вашем хосте с портом 8080 внутри вашего контейнера:

docker run -p 80:8080 ...

Теперь вы можете получить доступ к вашему сервису через порт 80 вашего хоста. Вы можете обрабатывать порт 443. Таким же образом.

Обратите внимание, что ключевое слово EXPOSE в вашем Dockerfile по большей части не нужно. В типичной среде Docker это не работает и носит исключительно информационный характер. Вы можете публиковать порты независимо от того, были ли EXPOSE d.

[1] Ситуация на самом деле немного более тонкая под Linux.

...