1. ΠΠ±Π·ΠΎΡ
Π ΡΡΠΎΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ ΠΌΡ ΡΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² ΠΎΠ±ΡΠ°Π·Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Docker.
2. ΠΠΎΡΠ΅ΠΌΡ ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ?
ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ Π³ΡΡΠΏΠΏ Π² Linux – ΡΡΠΎ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ ΠΈ Π³ΡΡΠΏΠΏΠ°ΠΌΠΈ.
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π²Π°ΠΆΠ½ΡΠΌ ΡΠ°ΠΉΠ»Π°ΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΠΈ Π³ΡΡΠΏΠΏΠ°ΠΌ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π½Π΅ΡΠ°Π½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏ.
ΠΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅, ΡΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ Π°ΡΠ°ΠΊΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ.
Π ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ Docker Π»ΡΡΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΡΠΈΡΠ°Π΅ΡΡΡ ΠΎΡΠΊΠ°Π· ΠΎΡ Π·Π°ΠΏΡΡΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ root.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ Docker ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ ΡΠ΄ΡΠΎ Ρ Ρ ΠΎΡΡ-ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ, Π·Π°ΠΏΡΡΠΊ ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ root-ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ΄Π²Π΅ΡΠ³Π°Π΅Ρ Π²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΌ Π°ΡΠ°ΠΊΠ°ΠΌ.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π±Π°Π·ΠΎΠ²ΡΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠ°Π²Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ root.
Π§ΡΠΎΠ±Ρ ΡΠ½ΠΈΠ·ΠΈΡΡ ΡΡΠΎΡ ΡΠΈΡΠΊ, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π½Π° Π½Π΅ root-ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΠΎΠ±ΡΠ°Π·Π°Ρ Docker.
Π’Π΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΌΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΡΠ± ΠΎΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΠΌ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ.
3. ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΎΠ±ΡΠ°Π·Π° Docker
Π§ΡΠΎΠ±Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π· Docker, ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ΄ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π² Dockerfile.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ docker build, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ Dockerfile Π² ΠΎΠ±ΡΠ°Π· Docker.
ΠΠ° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Ρ ΡΠ°Π³ΠΎΠ² ΠΌΡ ΠΈΠ½ΠΎΠ³Π΄Π° Ρ ΠΎΡΠΈΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π±ΡΠ΄Ρ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ»ΠΈ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π·Π° Docker.
Π Dockerfile ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ°Π³ΠΈ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ USER.
3.1. ΠΠΈΡΠ΅ΠΊΡΠΈΠ²Π° USER
ΠΠΈΡΠ΅ΠΊΡΠΈΠ²Π° USER Π² Dockerfile Π·Π°Π΄Π°Π΅Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (UID) ΠΈ, ΠΏΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΡ, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡ (GID) ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΡΠ°ΠΏΠ°Ρ ΡΠ±ΠΎΡΠΊΠΈ.
ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΌΠ΅Π½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ USER Π½Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ root Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΡΠ΅Π±ΡΡΡΠΈΡ ΡΡΠΊΠ°Π»Π°ΡΠΈΠΈ, ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½Π΅ ΡΠ²Π»ΡΡΡΠ΅Π³ΠΎΡΡ root.
ΠΠΈΡΠ΅ΠΊΡΠΈΠ²Π° USER Π² Dockerfile ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π³ΡΡΠΏΠΏΡ, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ:
USER <user>[:<group>]
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ UID ΠΈ GID Π½Π°ΠΏΡΡΠΌΡΡ:
USER <UID>[:<GID>]
ΠΡΠ»ΠΈ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π³ΡΡΠΏΠΏΡ ΠΈ ΠΌΡ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π³ΡΡΠΏΠΏΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ USER, ΡΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π³ΡΡΠΏΠΏΠ° root.
3.2. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ USER
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΡ ΡΡΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ±Π΅ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎΠΉ ΠΎΠ±ΡΠ°Π· Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π° Alpine Linux Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ root:
$ cat Dockerfile
FROM alpine:3.18.0
WORKDIR /tmp
RUN touch file
CMD ls -lh .
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π² Dockerfile Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ alpine:3.18.0 – ΡΡΠΎ Docker-ΠΎΠ±ΡΠ°Π· Alpine Linux Π²Π΅ΡΡΠΈΠΈ 3.18.0.
π§Β ΠΠ°ΠΊ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Alpine Linux Π΄ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ
ΠΠ°ΡΠ΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ WORKDIR ΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ /tmp.
ΠΠ°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ shell-ΠΊΠΎΠΌΠ°Π½Π΄Ρ touch file Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ CMD ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ls -lh ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΎΠ±ΡΠ°Π·Π° Docker.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ±ΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π· Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ docker build:
$ docker build --tag simpleimage:latest .
ΠΠ°ΠΏΡΡΡΠΈΠ² ΠΎΠ±ΡΠ°Π· Docker, ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ Π² Π²ΡΠ²ΠΎΠ΄Π΅, ΡΡΠΎ ΡΠ°ΠΉΠ»Ρ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ root ΠΈ Π³ΡΡΠΏΠΏΠ΅ root:
$ docker run --rm simpleimage:latest
total 0
-rw-r--r-- 1 root root 0 May 14 01:30 file
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ΅ΠΌ Π½Π°Ρ Dockerfile, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ USER Π΄Π»Ρ ΡΠΌΠ΅Π½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π° appuser:
$ cat Dockerfile
FROM alpine:3.18.0
WORKDIR /tmp
RUN adduser -D appuser
USER appuser
RUN touch file
CMD ls -lh .
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ appuser Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ adduser.
ΠΠ΅Π· ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° USER Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ appuser Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ UID:
unable to find user appuser: no matching entries in passwd file
ΠΠ°ΠΏΡΡΡΠΈΠ² ΠΎΠ±ΡΠ°Π· Docker, ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°ΠΉΠ» ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ appuser:
$ docker run --rm simpleimage:latest
total 0
-rw-r--r-- 1 appuser appuser 0 May 14 01:56 file
ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° USER ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π° appuser, Π΄Π²ΠΈΠΆΠΎΠΊ Docker Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ RUN touch file ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ appuser.
3.3. ΠΠΎΡΠ΅ΠΌΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° RUN su Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠ΄Π½Π° ΠΈΠ· ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ – ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ su Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ RUN Π² Dockerfile.
Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎ ΠΏΠΎΠ»Π°Π³Π°ΡΡ, ΡΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ USER ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π΅Π΅ Π½Π° RUN sh Π΄Π»Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°:
$ cat Dockerfile
FROM alpine:3.18.0
WORKDIR /tmp
RUN adduser -D appuser
RUN su appuser
RUN touch file
CMD ls -lh .
Π‘ΠΌΡΡΠ» ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ΅ Dockerfile Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΠ΅ΡΠ²ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ RUN su appuser Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π² ΡΡΠ°ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ appuser.
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ appuser.
ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° su appuser Π½Π΅ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΎΠ±ΡΠ°Π·ΠΎΠ²:
$ docker build . -q --tag simpleimage:switch-user-with-s
$ docker run --rm simpleimage:switch-user-with-su
total 0
-rw-r--r-- 1 root root 0 May 14 04:41 file
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΠΎΠ±ΡΠ°Π·Π΅ Docker Π½Π΅ ΡΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ, ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ su, Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊ Docker ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΠ±ΡΠ°Π·.
Docker ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ΅ΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ docker run ΠΈ docker commit Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°Π³Π° Π² Dockerfile, ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π³ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΡΠΈΡΡΡΡΡΡ ΠΊΠ°ΠΊ Π½ΠΎΠ²ΡΠΉ ΡΠ»ΠΎΠΉ.
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΆΠ΄Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° RUN Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π² Π½ΠΎΠ²ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ΅ ΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π·Π°ΠΏΡΡΠΊ su Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π΅ RUN Π½Π΅ ΠΎΠΊΠ°ΠΆΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Π»ΠΈΡΠ½ΠΈΡ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π³ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±ΡΡΡΠ½ΡΠ΅Ρ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΡΠ΄Π΅Π»Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ cd ΠΈ export, Π½Π΅ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π½Π° ΡΠ°Π·Π½ΡΡ ΡΡΠΎΠ²Π½ΡΡ .
ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ°ΠΊΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ, ΠΊΠ°ΠΊ USER, WORKDIR ΠΈ ENV, ΠΌΠΎΠ³ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ°Π³ΠΎΠ², Π²ΠΊΠ»ΡΡΠ°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ RUN.
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΡΠ΄Π΅Π»Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΈΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ², Π½Π° Π²ΡΠ΅Ρ ΡΡΠΎΠ²Π½ΡΡ .
ΠΠΎ ΡΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ Π³ΡΡΠΏΠΏΡ Π² ΠΎΠ±ΡΠ°Π·Π΅ Docker Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ, Π° Π½Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ su.
ΠΡΠ»ΠΈ ΠΌΡ Π²ΡΠ΅ ΠΆΠ΅ Ρ ΠΎΡΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ su Π΄Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΌΠ΅Π½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄, ΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΎΠ±ΠΎΠΉΡΠΈ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ – ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ, Π² ΠΎΠΏΡΠΈΡ -c ΠΊΠΎΠΌΠ°Π½Π΄Ρ su:
$ cat Dockerfile
FROM alpine:3.18.0
WORKDIR /tmp
RUN adduser -D appuser
RUN su appuser -c 'touch file'
CMD ls -lh .
ΠΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡ Π·Π°ΠΏΡΡΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° touch Docker ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ appuser ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ ΠΎΠ±ΡΠ°Π·Π°.
4. Π‘ΠΌΠ΅Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄Π»Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Docker
Π§ΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Docker ΠΏΠΎΠ΄ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠΈΡ -user Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ docker run.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°ΠΏΡΡΡΠΈΠ² ΠΎΠ±ΡΠ°Π· Alpine Linux ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ whoami, ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ root, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Dockerfile ΠΎΠ±ΡΠ°Π·Π°:
$ docker run --rm alpine:latest whoami
root
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ ΠΎΠΏΡΠΈΡ -user, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠΎΡ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ Π³ΠΎΡΡΠ΅Π²ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ:
$ docker run --rm --user guest alpine:latest whoami
guest
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΡΠΈΠΈ -user ΠΊΠΎΠΌΠ°Π½Π΄Ρ docker exec:
$ docker exec --user guest -it alpine whoami
guest
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ, ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ, Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΡΠ°ΠΉΠ»Π΅ /etc/passwd ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Docker.
Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ ΡΠ΄Π°ΡΡΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² Π·Π°ΠΏΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΡΠ°ΠΉΠ»Π΅ /etc/passwd:
$ docker exec --user unknown -it alpine whoami
unable to find user unknown: no matching entries in passwd file
5. ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΡΠΎΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ ΠΌΡ Π²ΠΊΡΠ°ΡΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ Π³ΡΡΠΏΠΏ Π² Linux.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΡΠ·Π½Π°Π»ΠΈ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΡΠ°ΠΏΠ΅ ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ°Π·Π° Docker ΠΈ Π·Π°ΠΏΡΡΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
Π‘ΠΌΠ΅Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ°ΠΏΠ΅ ΡΠ±ΠΎΡΠΊΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ – Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ USER Π² Dockerfile.
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° su Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π° Π΄Π»Ρ ΡΠΌΠ΅Π½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ ΠΎΠ±ΡΠ°Π·Π° Docker.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΌΡ ΡΠ·Π½Π°Π»ΠΈ, ΡΡΠΎ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° docker run, ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° docker exec ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΎΠΏΡΠΈΡ -user Π΄Π»Ρ ΡΠΌΠ΅Π½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΡΠΌ. ΡΠ°ΠΊΠΆΠ΅:
- π³Β ΠΠ°ΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ Docker ΠΏΠΎ ssh
- π³Β ΠΠ°ΠΊ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Docker?