Compose: Docker Compose๋Š” ๋ช…๋ช…๋œ ๋ณผ๋ฅจ์„ '๋ฃจํŠธ'๋กœ ๋…์ ์ ์œผ๋กœ ํƒ‘์žฌํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 04์›” 05์ผ  ยท  33์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: docker/compose

๋ช…๋ช…๋œ ๋ณผ๋ฅจ ("๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ ์ปจํ…Œ์ด๋„ˆ" ์—†์Œ, "๋ณผ๋ฅจ ์ถœ์ฒ˜" ์—†์Œ) ๋ฐ docker-compose.yml์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ชฉํ‘œ๋Š” docker-compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‘ ๊ฐœ์˜ ์„œ๋น„์Šค 'appserver' ๋ฐ 'server-postgresql'์„ ๊ด€๋ฆฌํ•˜๊ณ  "volumes:" docker-compose.yml ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค 'server-postgresql'์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

'server-postgresql'์šฉ Dockerfile์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

FROM        ubuntu:14.04
MAINTAINER xxx

RUN apt-get update && apt-get install -y [pgsql-needed things here]
USER        postgres
RUN         /etc/init.d/postgresql start && \
            psql --command "CREATE USER myUser PASSWORD 'myPassword';" && \
            createdb -O diya diya
RUN         echo "host all  all    0.0.0.0/0  md5" >> /etc/postgresql/9.3/main/pg_hba.conf
RUN         echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf
CMD         ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]

Adn docker-compose.yml์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

version: '2'
services:
    appserver:
        build: appserver
        depends_on:
            - server-postgresql
        links:
            - "server-postgresql:serverPostgreSQL"
        ports:
            - "1234"
            - "1235"
        restart: on-failure:10
    server-postgresql:
        build: serverPostgreSQL
        ports:
            - "5432"
        volumes:
            - db-data:/volume_data
        restart: on-failure:10
volumes:
    db-data:
        driver: local

๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ๊ฒƒ์„ ์‹œ์ž‘ docker-compose up -d , ๋‚˜๋Š” ๋‚ด ์„œ๋ฒ„ PostgreSQL์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž…๋ ฅ docker-compose exec server-postgresql bash , ๋น ๋ฅธ ls ๊ณ„์‹œ ์•Š์Šต๋‹ˆ๋‹ค /volume_data , ๊ทธ๋•Œ cd ๋„ฃ๊ณ  touch testFile ์‹œ๋„ํ•˜๊ณ  "ํ—ˆ๊ฐ€๊ฐ€ ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋น ๋ฅธ ls -l ์ด volume_data ๊ฐ€ root:root ์†Œ์œ ์ž„์„ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ •์ƒ์ ์ธ ํ˜„์ƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์ผ์€ Dockerfile์— USER postgres ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— docker-compose exec ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ์ž 'postgres'๋กœ ๋กœ๊ทธ์ธํ•˜๊ณ  postgresql ๋ฐ๋ชฌ์ด ์‚ฌ์šฉ์ž 'postgres'๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ /volume_data ์— ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋Œ€์‹ ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋•Œ๋ฌธ์ด ํ™•์ธ : docker-compose exec --user root server-postgresql bash ๋ฐ ์žฌ์‹œ cd /volume_data ๋ฐ touch testFile , ๊ทธ๊ฒƒ์€ ์•Š๋Š” ์ผ์„ (๊ทธ๊ฒƒ์œผ๋กœ, ํ˜ธ์ŠคํŠธ์™€ ์šฉ๊ธฐ ์‚ฌ์ด์˜ ๊ถŒํ•œ ์˜ค๋ฅ˜ ์•„๋‹ˆ๋‹ค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ˜ธ์ŠคํŠธ ํด๋”๋ฅผ ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ๋Š”๋ฐ, ์ด๋Š” /volume_data ์ด ์‚ฌ์šฉ์ž 'postgres'๊ฐ€ ์“ฐ๊ธฐ๋ฅผ ์‹œ๋„ํ•˜๋Š” ๋™์•ˆ 'root:root'๋กœ ๋งˆ์šดํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ ์œ ๋‹‰์Šค ๊ถŒํ•œ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ docker-compose.yml์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ • ์‚ฌ์šฉ์ž๋กœ ๋ช…๋ช…๋œ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

version: '2'
services:
    appserver:
        [...]
    server-postgresql:
        [...]
        volumes:
            - db-data:/volume_data:myUser:myGroup
        [...]
volumes:
    db-data:
        driver: local

๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ _dirty_ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ Dockerfile์—์„œ USER posgres ์ง€์‹œ๋ฌธ์„ ์ œ๊ฑฐํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • "init_script.sh"๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ENTRYPOINT๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๊ฑฐ๋œ USER postgres ), ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” /volume_data ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•˜์—ฌ 'postgres'๊ฐ€ ์ด์— ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๋‹ค์Œ su postgres ๋ฐ postgresql ๋ฐ๋ชฌ(ํฌ๊ทธ๋ผ์šด๋“œ์—์„œ)์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ Dockerfile๊ณผ docker-compose.yml์„ ๋น„ํ‘œ์ค€ ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ๋”๋Ÿฝ์Šต๋‹ˆ๋‹ค(๋Ÿฐํƒ€์ž„ ENTRYPOINT๋Š” ํƒ‘์žฌ๋œ ๋ณผ๋ฅจ์ด docker-compose.yml์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค).

arevolumes statu0-triage

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์‚ฌ์‹ค ๋‚˜๋Š” ๋‰ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฌ๊ธฐ์— ์™”๋Š”๋ฐ, ๋‚ด๊ฐ€ ๋‹ฌ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ด๊ฒƒ์ด ๊ธฐ๋Šฅ์ธ์ง€ ๋ฒ„๊ทธ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด Dockerfile ์—์„œ _์‚ฌ์šฉ์ž 'postgres'๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์—_ ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

# ...
RUN    mkdir /volume_data
RUN   chown postgres:postgres /volume_data

USER postgres
# ...

์ด๊ฒƒ์ด ํ•˜๋Š” ์ผ์€ /volume_data ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉ์ž 'postgres'๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Dockerfile ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ด์ œ docker-compose.yml ์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ directory_name_db-data ํ•˜๊ณ  ์ด๋ฅผ /volume_data ๋งˆ์šดํŠธ ํ•˜๊ณ  ๊ถŒํ•œ์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค! .
์ฆ‰, ์ด์ œ ๋ช…๋ช…๋œ ๋ณผ๋ฅจ์ด _pre-existing_ ๋””๋ ‰ํ† ๋ฆฌ /volume_data ์— ๋งˆ์šดํŠธ๋˜์–ด ๊ถŒํ•œ์ด ๋ณด์กด๋˜์–ด 'postgres'๊ฐ€ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์ด ์˜๋„๋œ ํ–‰๋™ ๋˜๋Š” ๋ณด์•ˆ ์œ„๋ฐ˜์ด๋ผ๋ฉด? (์ด ๊ฒฝ์šฐ์—๋„ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค!)

๋ชจ๋“  33 ๋Œ“๊ธ€

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋„์ปค ์—”์ง„์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ API์— ์ถ”๊ฐ€๋  ๋•Œ๊นŒ์ง€ Compose์—์„œ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ํŒŒ์ผ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

version: '2'
services:
  web:
    image: alpine:3.3
    volumes: ['random:/path']

volumes:
  random:
$ docker-compose run web sh
/ # touch /path/foo
/ # ls -l /path
total 0
-rw-r--r--    1 root     root             0 Apr  5 16:11 foo
/ # chown postgres:postgres /path/foo
/ # ls -l /path
total 0
-rw-r--r--    1 postgres postgres         0 Apr  5 16:11 foo
/ # 
$ docker-compose run web sh
/ # ls -l /path
total 0
-rw-r--r--    1 postgres postgres         0 Apr  5 16:11 foo

์ง๋ฉดํ•˜๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋Š” ๋ช…๋ช…๋œ ๋ณผ๋ฅจ ์ดˆ๊ธฐํ™”์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ Compose์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ์ง€๋งŒ(์–ด๋Š ์ •๋„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์—) docker cli๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ docker-compose up ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ช…๋ช…๋œ ๋ณผ๋ฅจ์„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด Docker์ธ์ง€ Compose ๋ฌธ์ œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป ์ œ์ถœํ–ˆ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ Docker API์˜ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ปจํ…Œ์ด๋„ˆ์— ์ˆ˜๋™์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๊ณ  'postgres' ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณผ๋ฅจ์„ chown -ingํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ ๊ฒฝ์šฐ์—๋Š” Compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ํด๋ผ์ด์–ธํŠธ( docker-compose -p client_name up )์— ๋Œ€ํ•œ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฆ‰์‹œ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ๊ณ  Compose๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋„คํŠธ์›Œํฌ client_name_default ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์ด client_name _appserver_1 ๋ฐ client_name _server-postgresql_1 ์ด๊ณ  _๋” ์ค‘์š”ํ•˜๊ฒŒ๋Š”_ client_name_db-data ๋ณผ๋ฅจ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ ๋“ฑ๋ก์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค๋ช…ํ•˜์‹  ์†”๋ฃจ์…˜(๋ณผ๋ฅจ ๋ ˆ์ด๋ธ”์— sh ๋ฐ chown ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์— _์ˆ˜๋™์œผ๋กœ_ "๋กœ๊น…")์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ ˆ์ฐจ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ด๋Š” ๋ฐ˜๋“œ์‹œ ์†์œผ๋กœ ๋ณด์‚ดํ•Œ์„ ๋ฐ›์œผ์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. Docker API์—์„œ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•  ๋•Œ ro ๋˜๋Š” rw (์ฝ๊ธฐ ์ „์šฉ ๋˜๋Š” ์ฝ๊ธฐ-์“ฐ๊ธฐ์šฉ) ๊ถŒํ•œ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. user:group ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

๋‚ด ์š”์ฒญ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์‚ฌ์‹ค ๋‚˜๋Š” ๋‰ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฌ๊ธฐ์— ์™”๋Š”๋ฐ, ๋‚ด๊ฐ€ ๋‹ฌ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ด๊ฒƒ์ด ๊ธฐ๋Šฅ์ธ์ง€ ๋ฒ„๊ทธ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด Dockerfile ์—์„œ _์‚ฌ์šฉ์ž 'postgres'๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์—_ ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

# ...
RUN    mkdir /volume_data
RUN   chown postgres:postgres /volume_data

USER postgres
# ...

์ด๊ฒƒ์ด ํ•˜๋Š” ์ผ์€ /volume_data ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉ์ž 'postgres'๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Dockerfile ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ด์ œ docker-compose.yml ์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ directory_name_db-data ํ•˜๊ณ  ์ด๋ฅผ /volume_data ๋งˆ์šดํŠธ ํ•˜๊ณ  ๊ถŒํ•œ์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค! .
์ฆ‰, ์ด์ œ ๋ช…๋ช…๋œ ๋ณผ๋ฅจ์ด _pre-existing_ ๋””๋ ‰ํ† ๋ฆฌ /volume_data ์— ๋งˆ์šดํŠธ๋˜์–ด ๊ถŒํ•œ์ด ๋ณด์กด๋˜์–ด 'postgres'๊ฐ€ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์ด ์˜๋„๋œ ํ–‰๋™ ๋˜๋Š” ๋ณด์•ˆ ์œ„๋ฐ˜์ด๋ผ๋ฉด? (์ด ๊ฒฝ์šฐ์—๋„ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค!)

๋ช…๋ช…๋œ ๋ณผ๋ฅจ์ด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ์ด๊ฒƒ์ด Docker 1.10.x์— ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Dockerfile์— ์†Œ์œ ๊ถŒ์ด ์„ค์ •๋˜์–ด ์žˆ๋Š” ๋ช…๋ช…๋œ ๋ณผ๋ฅจ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ user: postgres ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๊ฐ€ PID 1๋„ ์†Œ์œ ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Docker-compose ์— ๋Œ€ํ•ด volumes ๊ฐ€ driver_opts ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
chmod , chown ๋“œ๋ผ์ด๋ฒ„์—๋„ local ์™€ ๊ฐ™์€ ์˜ต์…˜์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํŠนํžˆ ์‹œ์ž‘ ์‹œ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋กœ์ปฌ๋กœ ์ƒ์„ฑ๋œ ํ˜ธ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—๋„ ์ ์šฉ๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ(์–ด๋Š ์ •๋„) https://github.com/moby/moby/pull/28499

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋ฏธ Moby ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๊นŒ?

@dnephin ์˜ ๋‹ต๋ณ€์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ‘œ์ค€ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ ์ค‘์ด๊ณ  chown ๋˜๋Š” chmod ๋ช…๋ น์ด ์‹คํŒจํ•˜๊ณ  ๋ณผ๋ฅจ์ด ๋ฃจํŠธ ์†Œ์œ ์ด๋ฏ€๋กœ ํ‘œ์ค€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@jcberthon ์ œ์•ˆ๋œ ๋ฐฉ๋ฒ•์€ ๋ฃจํŠธ๋ฅผ ์‹œ์ž‘ ์‚ฌ์šฉ์ž๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ chown/chmod ๋‹ค์Œ์— USER ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ "๊ถŒํ•œ ์‚ญ์ œ"๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Docker ์ด๋ฏธ์ง€๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์˜ต์…˜์ด ์•„๋‹Œ ๊ธฐ์กด ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

@dragon788 ๊ณผ @micheljung , ๋‚˜๋Š” ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์‹ค์ œ ๋ฌธ์ œ๋Š” ๋‚ด Dockerfile์—์„œ VOLUME ์„ ์–ธํ•œ ๋‹ค์Œ ํ•ด๋‹น ๋ณผ๋ฅจ์— ์žˆ๋Š” ํŒŒ์ผ์˜ ์†Œ์œ ๊ถŒ๊ณผ ๊ถŒํ•œ์„ ์ˆ˜์ •ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. VOLUME ์„ ์–ธ์„ Dockerfile์˜ ๋์œผ๋กœ ์ด๋™(๋˜๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ์ œ๊ฑฐ)ํ•˜๋ฉด ๋‚ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ถŒํ•œ์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์‹ค์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

FROM blabla
RUN do stuff
VOLUME /vol
RUN useradd foo && chown -R foo /vol
USER foo
CMD ["blabla.sh"]

์œ„์˜ ์˜ˆ์ œ Dockerfile์—์„œ chown ๋Š” ๋นŒ๋“œ ์ค‘์— ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋นŒ๋“œ ์ „์— VOLUME ๋ฅผ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ dockerd๋Š” VOLUME ์„ ์–ธ ์ด์ „์— /vol ์˜ ๋‚ด์šฉ์„ ๋ช…๋ช…๋œ ๋ณผ๋ฅจ ๋‚ด์—์„œ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค(๋ฃจํŠธ ๊ถŒํ•œ ์‚ฌ์šฉ). ๋”ฐ๋ผ์„œ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋Š” ๊ถŒํ•œ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ blabla.sh ์Šคํฌ๋ฆฝํŠธ์—์„œ chown์„ ๊ฐ•์ œ ์‹คํ–‰ํ•ด๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

FROM blabla
RUN do stuff
RUN useradd foo && chown -R foo /vol
USER foo
VOLUME /vol
CMD ["blabla.sh"]

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@jcberthon docker-compose.yml์˜ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ๊ณผ ๋ณผ๋ฅจ /vol์„ ์–ด๋–ป๊ฒŒ ๋ฐ”์ธ๋”ฉํ•˜๋Š”์ง€ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ €๋Š” Fedora์—์„œ Docker๋กœ ์ž‘์—… ์ค‘์ด๋ฉฐ(SELinux ํ™œ์„ฑํ™”๋จ) ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐฉ๋ฒ• ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž(๋ฃจํŠธ ์—†์Œ) ์ปจํ…์ŠคํŠธ์—์„œ ๋‚ด ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ด ๋ณผ๋ฅจ ๋ฌธ์ œ๋Š” ์ด๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š” ์œ ์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋ฃจํŠธ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰/์†Œ์œ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @renanwilliam ๋ฐ @egee-irl

๋‚˜๋Š” ์—ฌ๋Ÿฌ OS์—์„œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. SELinux๊ฐ€ ์ ์šฉ๋œ Fedora 26 ๋ฐ CentOS 7, AppArmor๊ฐ€ ํ™œ์„ฑํ™”๋œ Ubuntu 16.04, 17.10 ๋ฐ Raspbian 9(amd64 ๋ฐ armhf ํ”Œ๋žซํผ ํ˜ผํ•ฉ).

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ๋‚˜๋Š” ์ด์ œ ๋‚ด Dockerfile์˜ ๋์—์„œ VOLUME ... ์„ ์–ธ์„ ์˜ฎ๊ฒผ์ง€๋งŒ, ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋Š” ์ผ์€ Dockerfile์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ์ž ID๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: useradd -u 8002 -o foo ). ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ˜ธ์ŠคํŠธ์—์„œ ํ•ด๋‹น UID๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ํด๋”์— ์ ์ ˆํ•œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํ˜ธ์ŠคํŠธ์—์„œ /vol ๋””๋ ‰ํ† ๋ฆฌ์˜ "ํŽœ๋˜ํŠธ"๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. /opt/mycontainer1/vol ๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ sudo mkdir -p /opt/mycontainer1/vol
$ sudo chown -R 8002 /opt/mycontainer1/vol
$ sudo chmod 0750 /opt/mycontainer1/vol

๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž foo๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ /opt/mycontainer1/vol ๋””๋ ‰ํ† ๋ฆฌ์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ:

$ sudo -u docker-adm docker run --name mycontainer1 -v /opt/mycontainer1/vol:/vol mycontainer1-img

SELinux ๊ธฐ๋ฐ˜ ํ˜ธ์ŠคํŠธ์—์„œ Docker๊ฐ€ ํด๋”์— ์ ์ ˆํ•˜๊ฒŒ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณผ๋ฅจ์— :z :Z ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. z ์™€ Z ์˜ ์ฐจ์ด์ ์€ ์†Œ๋ฌธ์ž z ๊ฐ€ ๋ณผ๋ฅจ์— ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ž ์žฌ์ ์œผ๋กœ ์ด ํ˜ธ์ŠคํŠธ์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ SELinux์—์„œ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ์•ก์„ธ์Šคํ•˜๋„๋ก ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๋ถ„๋ช…ํžˆ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ) ๋ฐ˜๋ฉด ๋Œ€๋ฌธ์ž Z ๋Š” ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋งŒ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ SELinux๊ฐ€ ์žˆ๋Š” Fedora์—์„œ ๋‹ค์Œ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ sudo -u docker-adm docker run --name mycontainer1 -v /opt/mycontainer1/vol:/vol:Z mycontainer1-img

์—…๋ฐ์ดํŠธ : https://github.com/jcberthon/unifi-docker์—์„œ ๋‚ด ์ €์žฅ์†Œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ˜ธ์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Btw, ๋‹ต๋ณ€์ด ์˜ค๋ž˜ ์ง€์—ฐ๋œ @renanwilliam ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์—ฐ๋ง์€ ์‹œ๊ฐ„์ด ๋ณ„๋กœ ์—†์–ด์„œ...

๊ทธ๋ž˜์„œ, ์ฐธ์„์„ฑ์ด ์—†๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ์งง์€ ์ด์•ผ๊ธฐ:

RUN mkdir /volume_data
RUN chown postgres:postgres /volume_data

๋ณผ๋ฅจ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜๊ณ  chown ํ•ด๊ฒฐํ•˜๋ฉด ๋ณผ๋ฅจ์ด ๊ธฐ์กด ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ถŒํ•œ์„ ๋ณด์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์ง€ ์•Š์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค(Dockerfile์—์„œ chown์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ๋งˆ์šดํŠธ ์ค‘์— ํ•ด๋‹น ์†Œ์œ ๊ถŒ์„ ์ƒ์†ํ•จ). docker-compose ๋ฐ docker CLI์—์„œ ์†Œ์œ ์ž ๋ฐ ๊ทธ๋ฃน ์ œ์–ด๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์œ ๋‹‰์Šค ์Šคํƒ€์ผ ๋ช…๋ น์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ๋†€๋ผ์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@villasv

์ž‘์€ ํŒ: 2๊ฐœ์˜ RUN ... ๋ฅผ ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ถ”๊ฐ€ ๋ ˆ์ด์–ด ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 2์ค„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

RUN mkdir /volume_data && chown postgres:postgres /volume_data

๊ทธ๋Ÿฌ๋‚˜ (์œ„์˜ ์ฃผ์„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด) VOLUME ... ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์„ ์„ ์–ธํ•˜๊ธฐ ์ „์—(๋˜๋Š” ์‹ค์ œ๋กœ ๋ณผ๋ฅจ์„ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ ) ์œ„์˜ RUN ... ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. ๋ณผ๋ฅจ์„ ์„ ์–ธํ•œ ํ›„ ์†Œ์œ ๊ถŒ ๋ณ€๊ฒฝ์„ (๋‚ด๊ฐ€ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ) ์ˆ˜ํ–‰ํ•˜๋ฉด ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ธฐ๋ก๋˜์ง€ ์•Š๊ณ  ์†์‹ค๋ฉ๋‹ˆ๋‹ค.

@colbygk ์ •๋ง ํŽธ๋ฆฌํ•˜๊ฒ ์ง€๋งŒ Linux๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Docker๋Š” Linux ๋งˆ์šดํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ ๊ณ„์ธต ๊ตฌ์กฐ( / ๋ฐ ํ•˜์œ„ ํด๋”)๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ AFAIK์—๋Š” ํ˜„์žฌ Linux ๋งˆ์šดํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์žฌ์ •์˜ํ•˜๋Š” ์‚ฌ์šฉ์ž/๊ทธ๋ฃน ๋งคํ•‘ ๋˜๋Š” ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ "๋งˆ์šดํŠธ"(๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ ๋ณผ๋ฅจ ํฌํ•จ)๋Š” ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์žˆ์œผ๋ฉฐ(๋ฌผ๋ก  ๋‹ค๋ฅธ Docker ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ) ์ด ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” Linux VFS ๊ณ„์ธต์„ ์กด์ค‘ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ถŒํ•œ ํ™•์ธ. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ MAC(์˜ˆ: SELinux, AppArmor ๋“ฑ)์ด ํ˜ธ์ŠคํŠธ์— ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ chroot ํ•˜๋ฉด chroot ๋‚ด์—์„œ ๋งˆ์šดํŠธ ํด๋”๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ chroot ํ™˜๊ฒฝ ๋‚ด์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์ž˜๋ชป๋œ ์œ ํšจ UID/GID๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ.

์ปจํ…Œ์ด๋„ˆ์—๋Š” ๊ฐ„๋‹จํ•œ Linux(์‹ค์ œ๋กœ๋Š” Unix๋„ ํฌํ•จ) ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋น„๊ฒฐ์€ ์˜ค๋Š˜๋‚  Linux ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๊ฐ€๋Šฅ์„ฑ๊ณผ ํ•œ๊ณ„๋ฅผ ๋ณด๊ณ  ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด ๋ฌธ์ œ์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ ์  ๋” ๋ช…ํ™•ํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ณ ์ „์ ์ธ Unix ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์™„์ „ํžˆ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@jcberthon ์‚ฌ๋ ค ๊นŠ์€ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค:

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ณ„์ธต์œผ๋กœ ํ‘ธ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์—ฌ์•ผ ํ•˜๋ฉฐ ๋”ฐ๋ผ์„œ Docker์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ์ผ๋ฐ˜ ๋ณผ๋ฅจ ํ•ธ๋“ค๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํŒŒ์ƒ๋œ ์ด๋ฏธ์ง€์— ์ •์˜๋œ ๋ณธ์งˆ์ ์œผ๋กœ ์ •์  ๊ด€๊ณ„๋ฅผ ์ค€์ˆ˜ํ•˜๋„๋ก ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค(ํŠน์ • ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€)๋ฅผ ๊ฐ•์ œ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ €์™€ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ/์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งค์šฐ ํ•ด์ œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"์œ ๋‹‰์Šค"์˜ ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด ์ •ํ™•ํ•œ ์ข…๋ฅ˜์˜ uid/gid ๋งคํ•‘์˜ ๋‹ค๋ฅธ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ €๋ฅผ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค. https://github.com/zfsonlinux/zfs/issues/4177 ์€ Linux์˜ ZFS์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋กœ "LXC/LXD์˜ ๋ฆฌ๋”"๊ฐ€ UID/GID ์ •๋ณด๋ฅผ ์˜ฌ๋ฐ”๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š์•„ UID/GID ์ •๋ณด๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋…ผ์˜ํ•˜๊ณ  ์žˆ๋Š” ๊ฑฐ์˜ _์ •ํ™•ํ•œ_ ๋ฐฉ์‹์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ. https://github.com/zfsonlinux/zfs/issues/4177์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด zfs ๋ณผ๋ฅจ ์œ ํ˜•์ด ์‹ค์ œ๋กœ ์ด๋ฏธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ„์˜ ์ด uid/gid ๋งคํ•‘์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฅผ ์œ„ํ•œ ์ปจํŠธ๋กค์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

Docker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ dev/CI์šฉ์ด๋ฏ€๋กœ php/nginx(runner) ๋˜๋Š” gradle/python(builder)๊ณผ ๊ฐ™์€ "์ผ๋ฐ˜" ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ข‹์€ ์†”๋ฃจ์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ด๋ฏธ์ง€๋ฅผ ์žฌ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด Dockerfile์„ ์ƒ์„ฑ/ํŽธ์ง‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  2. docker-compose yml ํŒŒ์ผ์—์„œ ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ ์‚ฌ์šฉ

๋ณผ๋ฅจ(X:X:OPTION_READ_WRITE)์˜ ์“ฐ๊ธฐ ๊ถŒํ•œ์€ ์‰ฝ๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์†Œ์œ ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”?

SOURCE:TARGET:RW:OWNER

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ ๋ฐฉ๋ฒ•์€ _not_์ž…๋‹ˆ๋‹ค.

version: '3.5'
services:
    something:
        image: someimage
        user: '1000'
        expose:
            - 8080
        volumes:
            - dev:/app

volumes:
    dev:

์ด๋กœ ์ธํ•ด EACCES: permission denied, access '/app' ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ์ฆ‰, ์ƒˆ ๋ณผ๋ฅจ์„ ์ •์˜ํ•˜๊ณ  ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @Redsandro

someimage Docker ์ด๋ฏธ์ง€์—์„œ /app ๋Œ€ํ•œ UID๋ฅผ 1000์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ์ง€ ์ž‘์„ฑ์ž๊ฐ€ ์˜๋„ํ•œ UID ๋˜๋Š” GID๋ฅผ ์ž‘์„ฑ ํŒŒ์ผ์—์„œ user: ... ์— ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด๋ฏธ์ง€ ์ž‘์„ฑ์ž๊ฐ€ UID 0์„ ์‚ฌ์šฉํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ๋ฃจํŠธ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด(๊ทธ๋ฆฌ๊ณ  ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ) Docker ์ด๋ฏธ์ง€ ์ž‘์„ฑ์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜์‹ญ์‹œ์˜ค.

@Redsandro Docker ๋ฐ --userns-remap ์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ docker๊ฐ€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ https://hub.docker.com/r/hasnat/volumes-provisioner๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ จ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ง์ „์— ๋ณผ๋ฅจ์„ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

version: '2'
services:
  volumes-provisioner:
    image: hasnat/volumes-provisioner
    environment:
      PROVISION_DIRECTORIES: "65534:65534:0755:/var/data/prometheus/data"
    volumes:
      - "/var/data:/var/data"

  prometheus:
    image: prom/prometheus:v2.3.2
    ports:
      - "9090:9090"
    depends_on:
      - volumes-provisioner
    volumes:
      - "/var/data/prometheus/data:/prometheus/data"

Docker๊ฐ€ ์ด๊ฒƒ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๋ชฉ์ ์œผ๋กœ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์ ˆ๋Œ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค!

IMHO podman์€ (๊ถŒํ•œ์ด ์—†๋Š”) ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ( ์—ฌ๊ธฐ ์ฐธ์กฐ) ์•„๋งˆ๋„ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๋Š” ๋˜ํ•œ compose ์†”๋ฃจ์…˜ ์—

[podman]์€ ๋งŽ์€ ๋ถ€๋ถ„์—์„œ Docker์™€ ํ˜ธํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ podman์€ Mac์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ podman์€ Mac์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๊ธ€์Ž„, IMHO๋Š” Docker๋„ podman๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ OS/X์˜ Docker ์„ค์น˜๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์„ ์•„์ฃผ ์ž˜ ์ˆจ๊ธฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ ์ ˆํ•œ ๊ฐœ๋ฐœ ์‹œ์Šคํ…œ์„ ๊ฐ–๋„๋ก VM์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ฃผ์ œ์—์„œ ์กฐ๊ธˆ ๋ฒ—์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๋” ์ด์ƒ OS/X ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ _experimental_ podman dmg๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ podman programmatic ๋˜๋Š” podman-compose ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜์— ์œ ์‚ฌํ•œ ์ƒํƒœ๊ณ„๊ฐ€ ๊ฐœ๋ฐœ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ณต์œ  ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ sudo ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ˆ˜๋กœ docker-compose๋ฅผ ํ†ตํ•ด ๋ฃจํŠธ๊ฐ€ ์†Œ์œ ํ•œ ์ผ๋ถ€ ํด๋”๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ํ•ด๋‹น ํด๋” ์ž์ฒด๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค๋‹ค. jpetazzo์˜ ๊ฒŒ์‹œ๋ฌผ์— ์•ˆ๋‚ด๋œ ๋Œ€๋กœ docker์—์„œ docker๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

docker-compose ํŒŒ์ผ์—์„œ ์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ๋„์ปค ์†Œ์ผ“์„ ๋„์ปค ๊ทธ๋ฃน ์•„๋ž˜์˜ ์ปจํ…Œ์ด๋„ˆ ์‹œ์Šคํ…œ์— ํƒ‘์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋„์ปค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ ํŒŒ์ผ์˜ ์†Œ์œ ๊ถŒ ๋ฐ ๊ถŒํ•œ์„ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋‚ด ๋‘ ์„ผํŠธ๋ฅผ ๋„ฃ์œผ์‹ญ์‹œ์˜ค.

docker-compose "๋„ค์ดํ‹ฐ๋ธŒ" ์†”๋ฃจ์…˜์˜ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ์ด๋ฏธ์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์•ŒํŒŒ์ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

volumes:
  media:
services:
  mediainit:
    image: alpine
    entrypoint: /bin/sh -c "chown -v nobody:nogroup /mnt/media && chmod -v 777 /mnt/media"
    container_name: mediainit
    restart: "no"
    volumes: 
      - "media:/mnt/media"

๋ฌผ๋ก  ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ ์ปจํ…Œ์ด๋„ˆ๋งŒ ์ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ปค๋„์ด ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ์‰ฝ๊ฒŒ user:user๋ฅผ chownํ•˜๊ฑฐ๋‚˜ setacl ๊ณต์ƒ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

ํŽธ์ง‘: ์ ์–ด๋„ ๋‚ด ํ…Œ์ŠคํŠธ์—์„œ chmod ์ „์— ํด๋”๋ฅผ ๋จผ์ € chownํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

๋ณผ๋ฅจ ์†Œ์œ ๊ถŒ์€ docker-compose๊ฐ€ ์ œ์–ดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ๋…ผ์˜๋Š” moby ํ”„๋กœ์ ํŠธ repo์—์„œ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ  ์‚ฌํ•ญ:
Docker ๋ณผ๋ฅจ์€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ƒ์†๋œ ์ดˆ๊ธฐ ์ฝ˜ํ…์ธ ์™€ ๊ถŒํ•œ์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#Dockerfile
FROM alpine
RUN addgroup -S nicolas && adduser -S nicolas -G nicolas
RUN mkdir /foo && chown nicolas:nicolas /foo  
# empty, but owned by `nicolas`. Could also have some initial content
VOLUME /foo  
USER nicolas

์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€๋Š” ๋ช…์‹œ์  ๋ณผ๋ฅจ(์ž„์˜์˜ ID๋กœ ์˜๋„์ ์œผ๋กœ ์ƒ์„ฑ๋จ) ์—†์ด ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ช…๋ช…๋œ ๋ณผ๋ฅจ๊ณผ ํ•จ๊ป˜ ์‹คํ–‰๋  ๋•Œ ๋ณผ๋ฅจ์— ๊ถŒํ•œ์„ "์ „ํŒŒ"ํ•ฉ๋‹ˆ๋‹ค.

โžœ  docker run --rm -it -v some_new_volume:/foo myimage
/ $ ls -al /foo
total 8
drwxr-xr-x    2 nicolas  nicolas       4096 Oct 18 08:30 .
drwxr-xr-x    1 root     root          4096 Oct 18 08:30 ..

์ž‘์„ฑ ํŒŒ์ผ์— ์„ ์–ธ๋œ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

#docker-compose.yml
version: "3"
services:
  web:
    image: myimage
    command: ls -al /foo
    volumes:
      - db-data:/foo
volumes:
    db-data:

โžœ  docker-compose up
Creating volume "toto_db-data" with default driver
Creating toto_web_1 ... done
Attaching to toto_web_1
web_1  | total 8
web_1  | drwxr-xr-x    2 nicolas  nicolas       4096 Oct 18 08:30 .
web_1  | drwxr-xr-x    1 root     root          4096 Oct 18 08:37 ..
toto_web_1 exited with code 0

๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉํ•œ ๋ณผ๋ฅจ์„ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณผ๋ฅจ ์†Œ์œ ๊ถŒ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ ์‹œ ์ด๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์€ ์—”์ง„์ด๋‚˜ ํŠน์ • ์˜ต์…˜์ด ์žˆ๋Š” ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„์— ์˜ํ•ด ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ œ์•ˆ๋œ ๋Œ€๋กœ ๋ช‡ ๊ฐ€์ง€ chown ํŠธ๋ฆญ์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ^.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
์ž‘์„ฑ์€ ๋ณผ๋ฅจ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ œ์–ด ๊ถŒํ•œ์ด ์—†์ง€๋งŒ ๋…ธ์ถœ๋œ ์—”์ง„ API์ด๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰