Trik je v použití useradd místo jeho interaktivního obalu adduser .Obvykle vytvářím uživatele s:
RUN useradd -ms /bin/bash newuser
který vytvoří domovský adresář pro uživatele a zajistí, že bash je výchozí shell.
Poté můžete přidat:
USER newuser
WORKDIR /home/newuser
do vašeho dockerfile. Každý následující příkaz i interaktivní relace budou provedeny jako uživatel newuser :
docker run -t -i image
[email protected]:~$
Možná budete muset zadat newuser oprávnění ke spouštění programů, které hodláte spouštět před vyvoláním uživatelského příkazu.
Použití neprivilegovaných uživatelů uvnitř kontejnerů je z bezpečnostních důvodů dobrý nápad. Má také několik nevýhod. A co je nejdůležitější, lidé odvozující obrázky z vašeho obrázku se budou muset přepnout zpět na root, než budou moci provádět příkazy s oprávněními superuživatele.
Přidání uživatele do dockeru a spuštění aplikace pod tímto uživatelem je z hlediska zabezpečení velmi dobrý postup. K tomu bych doporučil následující kroky:
FROM node:10-alpine
# Copy source to container
RUN mkdir -p /usr/app/src
# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app
WORKDIR /usr/app
# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production
# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup
# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup
# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app
# Switch to 'appuser'
USER appuser
# Open the mapped port
EXPOSE 3000
# Start the process
CMD ["npm", "start"]
Výše uvedené kroky jsou úplným příkladem kopírování souborů projektu NodeJS, vytvoření skupiny uživatelů a uživatele, přiřazení oprávnění uživateli pro složku projektu, přepnutí na nově vytvořeného uživatele a spuštění aplikace pod tímto uživatelem.
Ubuntu
Zkuste následující řádky v Dockerfile :
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu
useradd možnosti (viz:man useradd ):
-r,--systemVytvořte systémový účet.-m,--create-homeVytvořte domovský adresář uživatele.-d,--home-dir HOME_DIRDomovský adresář nového účtu.-s,--shell SHELLPřihlašovací prostředí nového účtu.-g,--gid GROUPNázev nebo ID primární skupiny.-G,--groups GROUPSSeznam doplňkových skupin.-u,--uid UIDZadejte ID uživatele.-p,--password PASSWORDŠifrované heslo nového účtu (např.ubuntu).
Nastavení výchozího hesla uživatele
Chcete-li nastavit heslo uživatele, přidejte -p "$(openssl passwd -1 ubuntu)" na useradd příkaz.
Případně přidejte do Dockerfile následující řádky :
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd
První instrukce shellu je ujistit se, že -o pipefail možnost je povolena před RUN s trubkou v něm. Přečtěte si více:Hadolint:Linting your Dockerfile.
Abyste se vyhnuli interaktivním otázkám uživatele adduser, můžete to volat s těmito parametry:
RUN adduser --disabled-password --gecos '' newuser
--gecos Parametr se používá k nastavení doplňkových informací. V tomto případě je pouze prázdný.
Na systémech s busyboxem (jako Alpine) použijte
RUN adduser -D -g '' newuser
Viz busybox adduser