Compose: ์‹คํ–‰ ํ›„ ๋ช…๋ น ์‹คํ–‰

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

์•ˆ๋…•ํ•˜์„ธ์š”,

์‹คํ–‰ ํ›„์— ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก YAML์— "onrun"๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. https://github.com/docker/docker/issues/8860๊ณผ ์œ ์‚ฌ

mongodb:
    image: mongo:3.0.2
    hostname: myhostname
    domainname: domain.lan
    volumes:
        - /data/mongodb:/data
    ports:
        - "27017:27017" 
    onrun:
        - mongodump --host db2dump.domain.lan --port 27017 --out /data/mongodb/dumps/latest
        - mongorestore -d database /data/mongodb/dumps/latest/database

mongodb ์‹œ์ž‘ ํ›„ db2dump.domain.lan์„ ๋คํ”„ํ•˜๊ณ  ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ–ˆ๋‹ค๊ฐ€ ์‹œ์ž‘ํ•˜๋ฉด ๋ฉฑ ๋“ฑ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด onrun ๋ถ€๋ถ„์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2020 ๋…„ 6 ์›” 15 ์ผ ์ˆ˜์ •

5 ๋…„ ํ›„ Compose๋Š” ์‚ฌ์–‘์„ "ํ‘œ์ค€ํ™”"ํ•˜์ง€ ์•Š๊ณ 
https://github.com/compose-spec/compose-spec/issues/84 ๋ฅผ ํ™•์ธ

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

๋”ฐ๋ผ์„œ ๋‚ด ๋„์ปค๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด Script ๋˜๋Š” Makefile์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ compose๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ์ด์œ 
? ์Šคํฌ๋ฆฝํŠธ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค || dockerfile?

์ข‹์Šต๋‹ˆ๋‹ค.์ด ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CI ํ”„๋กœ์„ธ์Šค์—์„œ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

rabbitmq:
    image: rabbitmq:3.5.1-management
    environment:
        RABBITMQ_NODENAME: rabbit
    hostname: rabbitmq
    domainname: domain.lan
    volumes:
        - /data/rabbitmq/db:/var/lib/rabbitmq
    ports:
        - "5672:5672" 
        - "15672:15672"
        - "25672:25672"
        - "4369:4369"

mongodb:
    image: mongo:3.0.2
    hostname: mongo
    domainname: domain.lan
    volumes:
        - /data/mongodb:/data
    ports:
        - "27017:27017" 

appmaster:
    image: appmaster
    hostname: master
    domainname: domain.lan
    environment:
        ...
    ports:
        - "80:80" 
        - "8080:8080"
    links:
        - mongodb
        - rabbitmq

celery:
    image: celery
    hostname: celery
    domainname: domain.lan
    environment:
        ...
    links:
        - rabbitmq

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ mongodb๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ณ  rabbitmq์—์„œ ๋Œ€๊ธฐ์—ด ๋ฐ ๊ณ„์ •์„ ๊ด€๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋‚ด๊ฐ€ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

#!/bin/bash
PROJECT=appmaster
docker-compose -f appmaster.yml -p appmaster up -d
docker exec appmaster_rabbitmq_1 rabbitmqctl add_user user password
docker exec appmaster_rabbitmq_1 rabbitmqctl add_vhost rabbitmq.domain.lan
docker exec appmaster_rabbitmq_1 rabbitmqctl set_permissions -p rabbitmq.domain.lan password ".*" ".*" ".*"
docker exec appmaster_mongodb_1 mongodump --host mongo-prd.domain.lan --port 27017 --out /data/mongodb/dumps/latest
docker exec appmaster_mongodb_1 mongorestore -d database /data/mongodb/dumps/latest/database

onrun ๋ช…๋ น์œผ๋กœ ์ง์ ‘ docker-compose -f appmaster.yml -p appmaster up -d ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
yml ํŒŒ์ผ์ด ๋” ์ฝ๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

rabbitmq:
    ...
    onrun:
        - rabbitmqctl add_user user password
        - rabbitmqctl add_vhost rabbitmq.domain.lan
        - rabbitmqctl set_permissions -p rabbitmq.domain.lan password ".*" ".*" ".*"

mongodb:
    ...
    onrun:
        - mongodump --host mongo-prd.domain.lan --port 27017 --out /data/mongodb/dumps/latest
        - mongorestore -d database /data/mongodb/dumps/latest/database

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

Dockerfile์˜ ๋‹จ๊ณ„ ์—ฌ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

FROM mongo:3.0.2
ADD data/mongodb/dumps/latest /data/mongodb/dumps/latest
RUN mongorestore -d database /data/mongodb/dumps/latest/database

์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋‹ค์‹œ ๋นŒ๋“œ ํ•  ๋•Œ๋„ ์บ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @dnephin.
๋ฌผ๋ก  Dockerfile์„ ๋งŒ๋“ค์–ด ์ด๋ฏธ์ง€ ๋Œ€์‹  ๋นŒ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ docker exec๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
MongoDB๋Š” ์˜ˆ์ผ ๋ฟ์ด๋ฉฐ mysql ๋ฐ ๊ณ„์ • ์ƒ์„ฑ ๋˜๋Š” rabbitmq ๋ฐ ๋Œ€๊ธฐ์—ด ์ƒ์„ฑ ๋“ฑ์„ ํ†ตํ•ด์ด ์˜ˆ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

onrun ๋Š” ๊ตฌ์„ฑ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์— ์œ ์—ฐ์„ฑ์„ ํ—ˆ์šฉํ•˜๊ณ  compose๋Š” ์‹คํ–‰ ๋ชฉ๋ก์„ ์ฝ๊ณ  ๊ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด docker exec ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์š”์ ์€ docker-compose.yml docker exec ์— Dockerfile ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ์„ ๋•Œ ๋ช…๋ น์„ ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค _not_ ๋•Œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋” ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค Compose์™€ ํ•จ๊ป˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ์ ์ ˆํ•œ docker ๋ฐ docker-compose ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ์…ธ ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” Makefile์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ค‘์š”ํ•œ ๊ฐ€์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ํ•œ Compose์— ์ถ”๊ฐ€ ํ•  ๊ฐ€์น˜๊ฐ€ ์—†์œผ๋ฉฐ ๊ท€ํ•˜๊ฐ€ ์ธ์šฉ ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด ๋„์ปค๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด Script ๋˜๋Š” Makefile์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ compose๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ์ด์œ 
? ์Šคํฌ๋ฆฝํŠธ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค || dockerfile?

์ข‹์Šต๋‹ˆ๋‹ค.์ด ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CI ํ”„๋กœ์„ธ์Šค์—์„œ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

rabbitmq:
    image: rabbitmq:3.5.1-management
    environment:
        RABBITMQ_NODENAME: rabbit
    hostname: rabbitmq
    domainname: domain.lan
    volumes:
        - /data/rabbitmq/db:/var/lib/rabbitmq
    ports:
        - "5672:5672" 
        - "15672:15672"
        - "25672:25672"
        - "4369:4369"

mongodb:
    image: mongo:3.0.2
    hostname: mongo
    domainname: domain.lan
    volumes:
        - /data/mongodb:/data
    ports:
        - "27017:27017" 

appmaster:
    image: appmaster
    hostname: master
    domainname: domain.lan
    environment:
        ...
    ports:
        - "80:80" 
        - "8080:8080"
    links:
        - mongodb
        - rabbitmq

celery:
    image: celery
    hostname: celery
    domainname: domain.lan
    environment:
        ...
    links:
        - rabbitmq

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ mongodb๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ณ  rabbitmq์—์„œ ๋Œ€๊ธฐ์—ด ๋ฐ ๊ณ„์ •์„ ๊ด€๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋‚ด๊ฐ€ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

#!/bin/bash
PROJECT=appmaster
docker-compose -f appmaster.yml -p appmaster up -d
docker exec appmaster_rabbitmq_1 rabbitmqctl add_user user password
docker exec appmaster_rabbitmq_1 rabbitmqctl add_vhost rabbitmq.domain.lan
docker exec appmaster_rabbitmq_1 rabbitmqctl set_permissions -p rabbitmq.domain.lan password ".*" ".*" ".*"
docker exec appmaster_mongodb_1 mongodump --host mongo-prd.domain.lan --port 27017 --out /data/mongodb/dumps/latest
docker exec appmaster_mongodb_1 mongorestore -d database /data/mongodb/dumps/latest/database

onrun ๋ช…๋ น์œผ๋กœ ์ง์ ‘ docker-compose -f appmaster.yml -p appmaster up -d ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
yml ํŒŒ์ผ์ด ๋” ์ฝ๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

rabbitmq:
    ...
    onrun:
        - rabbitmqctl add_user user password
        - rabbitmqctl add_vhost rabbitmq.domain.lan
        - rabbitmqctl set_permissions -p rabbitmq.domain.lan password ".*" ".*" ".*"

mongodb:
    ...
    onrun:
        - mongodump --host mongo-prd.domain.lan --port 27017 --out /data/mongodb/dumps/latest
        - mongorestore -d database /data/mongodb/dumps/latest/database

์ด๊ฒƒ์€ ๋‹ค์†Œ ์œ ์šฉํ•˜๊ณ  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

: +1 :

docker-compose CD ํŒŒ์ดํ”„ ๋ผ์ธ์˜ ์ผ๋ถ€๋กœ ๊ฒŒ์ดํŠธ ํ…Œ์ŠคํŠธ์— ๋” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

: +1 :

์ด๊ฒƒ์€ # 877, # 1341, # 468 (๋ฐ ๊ธฐํƒ€ ๋ช‡ ๊ฐ€์ง€)์˜ ๋ณต์ œ๋ณธ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์ง€์›ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ # 1510์ด๋ฉฐ ์›ํ•˜๋Š” ์ด๋ฒคํŠธ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์™ธ๋ถ€ ๋„๊ตฌ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ค‘๋ณต์œผ๋กœ ๋‹ซ๊ธฐ

์ด๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. "์˜ค, bash ์Šคํฌ๋ฆฝํŠธ๋กœ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์ฃผ์žฅ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  bash ์Šคํฌ๋ฆฝํŠธ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Docker-compose๊ฐ€ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ bash ์Šคํฌ๋ฆฝํŠธ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์š”์ ์€ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋‹จ์ผ YAML ํŒŒ์ผ์ด ์žˆ์œผ๋ฉฐ ๊ฐ„๋‹จํ•œ docker-compose up ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‰˜ ์Šคํฌ๋ฆฝํŠธ ๋‚˜ Makefile๋กœ ํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ Compose์˜ ์ž„๋ฌด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์œ ์šฉ์„ฑ๊ณผ ํŒฝ์ฐฝ ๋ฐฉ์ง€ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์–ด๋”˜๊ฐ€์— ์„ ์„ ๊ทธ๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Compose ํŒŒ์ผ์˜ ์ค‘์š”ํ•œ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋Š” Mac, Linux ๋ฐ Windows ์ปดํ“จํ„ฐ์—์„œ๋„ ์ปดํ“จํ„ฐ๊ฐ„์— ์ด์‹์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด Compose ํŒŒ์ผ์— ์ž„์˜์˜ ์…ธ ๋ช…๋ น์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋กํ•œ๋‹ค๋ฉด ์ด์‹์„ฑ์ด ํ›จ์”ฌ ๋–จ์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@aanand ๊ณต์ •ํ•˜๊ฒŒ docker exec ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ ํ•ด์„œ ์ž๋™์œผ๋กœ x-plat ๋น„ ํ˜ธํ™˜์„ฑ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ๊ณผ-์ด ๋ฌธ์ œ๋ฅผ ํ˜ธ์ŠคํŠธ ์ปดํ“จํ„ฐ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ž˜๋ชป ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ฒซ ๋ฒˆ์งธ ์š”์ ์€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

@aanand์˜ ์š”์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ docker-compose ๋Š” command , expose ๊ณผ ๊ฐ™์ด ์ผ๋ฐ˜ docker ์—”์ง„์ด ์ด๋ฏธํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ž‘์—…์„ ์ด๋ฏธ ๋งŽ์ด ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค expose , ports , build ๋“ฑ. exec ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด docker-compose ์— ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์„ค์ •์„์œ„ํ•œ ์ง„์ •ํ•œ ์› ์Šคํ†ฑ ์ƒ์ ์ด๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ.

@aanand ๋งŽ์€ ๊ฐœ๋ฐœ์ž ๋ฐ CI ํŒŒ์ดํ”„ ๋ผ์ธ์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ๋งค์šฐ ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์œ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. DB์˜ ๋คํ”„์ฒ˜๋Ÿผ. 1 ๋…„ ์ „์—์ด ํ‹ฐ์ผ“์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ๋„์ปค์—์„œ ์•„๋ฌด๊ฒƒ๋„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ผ๋ถ€ exec https://github.com/docker/compose/issues/1809#issuecomment -128073224๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Makefile ๋˜๋Š” Bashcript๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์›๋ž˜ ์ œ์•ˆํ•œ ๊ฒƒ์€ ๋ฉฑ ๋“ฑ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” onrun (๋˜๋Š” oncreate)์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค‘์ง€๋˜๊ฑฐ๋‚˜ ์ผ์‹œ ์ค‘์ง€ ๋œ ๊ฒฝ์šฐ ์ƒˆ ์‹œ์ž‘์€ onrun (๋˜๋Š” oncreate)์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ git ์ €์žฅ์†Œ์—๋Š” compose ํŒŒ์ผ, dockerfile ๋ฐ ๋ฉฑ ๋“ฑ์„ฑ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด์žˆ๋Š” makefile์ด ์žˆ์Šต๋‹ˆ๋‹ค (makefile์ด ์ƒํƒœ ํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ). ์ฒœ์žฌ!

command , expose ๋“ฑ๊ณผ exec ์‚ฌ์ด์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ทธ๋ฃน์€ ์ปจํ…Œ์ด๋„ˆ ์˜ต์…˜์ด๊ณ  exec ๋Š” ๋ช…๋ น / api ์—”๋“œ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์˜ต์…˜์ด ์•„๋‹ˆ๋ผ ๋ณ„๋„์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

Compose (https://github.com/docker/compose/issues/1809#issuecomment-128059030)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. onrun ์ด (๊ฐ€) ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. command ์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋คํ”„ํ•˜๊ฑฐ๋‚˜๋กœ๋“œํ•˜๋Š” ํŠน์ • ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ์ผ๋ฐ˜์ ์œผ๋กœ Makefile์—์„œ ์ˆ˜ํ–‰๋˜๋Š” "์›Œํฌ ํ”Œ๋กœ"๋˜๋Š” "๋นŒ๋“œ ์ž๋™ํ™”"์œ ํ˜•์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ชจ๋“  ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” dobi ๋ผ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ํ”„๋กœํ†  ํƒ€์ดํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Compose์™€ ๋งค์šฐ ์ž˜ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. Makefile์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” /๋กœ๋“œ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ์˜ˆ๋ฅผ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

@dnephin onrun ์€ ๋ฉฑ ๋“ฑ์„ฑ์„ ๋†“์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํ•œ command ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ์‹œ create ์ด๋ฉฐ ๋‹ค์‹œ๋Š” exec๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋คํ”„ ๋ฐ ๋ณต์›).

exec:
    create:
        - echo baby
    destroy:
        - echo keny
    start:
        - echo start
    stop:
        - echo bye

๋” ๋งŽ์€ ์˜ˆ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ :

dobi ๋•๋ถ„์— ์ž‘์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์„ฑ์ด ๋‚˜์˜๊ณ  ๋” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ compose๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ compose๋Š” ์ข‹์ง€ ์•Š์œผ๋ฉฐ ๋” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๋Š” "์šด์˜ ์ฒด์ œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ OS๊ฐ€ ๋‚˜์ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋„๊ตฌ๋„ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์œ ๋‹‰์Šค ์ฒ ํ•™์€ ํ•œ ๊ฐ€์ง€ ์ผ์„ํ•˜๊ณ  ์ž˜ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. Compose๋Š” "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์„์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ ์กฐ์ •"์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ์ž๋™ํ™” ๋„๊ตฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด๋Š” "์šด์˜ ์ฒด์ œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ OS๊ฐ€ ๋‚˜์ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋„๊ตฌ๋„ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์œ ๋‹‰์Šค ์ฒ ํ•™์€ ํ•œ ๊ฐ€์ง€๋ฅผํ•˜๊ณ  ์ž˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

์™€์šฐ ์ตœ๊ณ ์˜ ์•…์˜์— ๋„๋‹ฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊ทธ๋ ‡๋‹ค๋ฉด exec ๊ฐ€ ์ฝ”๋“œ์™€ cli ์ฐธ์กฐ์—์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? https://docs.docker.com/compose/reference/exec/ ?
  • ๋„ ์ปค๊ฐ€ ์œ ๋‹‰์Šค ์ฒ ํ•™์„ ์กด์ค‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์˜ค๋žœ ์‹œ๊ฐ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค https://coreos.com/blog/rocket

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

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์œ ๋‹‰์Šค ์ฒ ํ•™์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ปค ๋ชจ ๋†€๋ฆฌ ์‹ ๋ฐ”์ด๋„ˆ๋ฆฌ์— Go inside์—์„œ ์“ด "docker compose"๋ฅผ ๊ฒฐ์ฝ” ๋ณผ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://www.orchardup.com/blog/orchard-is-joining-docker

์›๋ž˜ ๋ชฉํ‘œ๋ฅผ ๊ณ„์†ํ•˜๊ธฐ ์œ„ํ•ด Docker์— ํ•ฉ๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค๋„ ์šฐ๋ฆฌ๋Š” Fig๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Fig์˜ ๊ฐ€์žฅ ์ข‹์€ ๋ถ€๋ถ„์„ Docker ์ž์ฒด์— ํ†ตํ•ฉํ•จ์œผ๋กœ์จ Docker๋ฅผ ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ์ตœ๊ณ ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ณ„์† ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๋ช…๊ธฐ๋ฅผ๋กœ๋“œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค ..? ๊นœ์ง ๋†€๋ž๋‹ค ..
๊ณต์‹์ ์ธ ๋ฐฉ๋ฒ•์€ ์ƒ์‚ฐ ์ปจํ…Œ์ด๋„ˆ์— ๊ณ ์ •๋ฌผ ๋กœ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ๋˜๋Š” ๋‚ด compose ํŒŒ์ผ ์ฃผ์œ„์— ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด? ๋‚˜์ค‘์˜ ๊ฒฝ์šฐ ์ด์ „์ฒ˜๋Ÿผ 'docker run'์„ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@discordianfish , ๋งŒ์•ฝ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ CI / CD ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์ตœ์†Œํ•œ ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ์ˆ˜์ค€์—์„œ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ด๋ฒคํŠธ์™€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜๋‹ค๋ฉด ๋ˆ„๊ฐ€ docker / docker-compose๊ฐ€ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํŒŒ์ดํ”„ ๋ผ์ธ ๋ฐ ํ…Œ์ŠคํŠธ ์ธํ”„๋ผ์—์„œ ๋ฒ—์–ด๋‚˜ ๋” ๋งŽ์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์žฅ์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์Šคํƒ์—์„œ ์ž‘์—…ํ•˜๋Š” ์‚ฌ๋žŒ์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ˆจ์„ ์ฐธ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋นŒ๋“œ ์‹œ๊ฐ„์— ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ž‘์—…์€ ๋Ÿฐํƒ€์ž„์— ํ•„์š”ํ•œ ์ž‘์—…๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Ÿฐํƒ€์ž„์— ํ•„์š”ํ•œ ์ž‘์—…์€ ๋ฐฐํฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‚ด ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์‹œ์ž‘ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ธ์‹ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ผ์ข…์˜ ์„ฑ๊ฐ€์‹  ์ž‘์—…์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ๋“ค์€ ์ˆ˜๋ช…์ฃผ๊ธฐ ํ›„ํฌ + ๋ช…๋ น + ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜์žˆ๋Š” ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ด€๋ฆฌ ํ”„๋ ˆ์ž„ ์›Œํฌ ๋ฐ ๊ธฐํƒ€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋„๊ตฌ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ docker-compose์—์„œ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

https://github.com/dnephin/dobi์— ๊ด€์‹ฌ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ๋„๊ตฌ๋Š” ์ด๋Ÿฌํ•œ ์›Œํฌ ํ”Œ๋กœ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

@dnephin ์€ ๋„๊ตฌ๋กœ์ด ๋ฌธ์ œ๋ฅผ ์ŠคํŒธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋ณด์•˜๊ณ  ๋Œ€๋‹ต์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Makefile / bash๋Š” ์•„๋งˆ๋„ n ๋ฒˆ์งธ "๋‚ด ๋„๊ตฌ ํ–ฅ์ƒ ๋„์ปค"๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

๊ฑด์„ค์ ์ธ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. 8 ๊ฐœ์›” ์ „์—์ด ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฏธ ๋„๋น„๋ฅผ ์–ธ๊ธ‰ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

Makefile / bash์— ๋งŒ์กฑํ•˜์‹ ๋‹ค๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค! ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์–ด ๋‹คํ–‰์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์ด ์ฃผ์ œ์™€ ๊ด€๋ จ๋œ ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/docker/compose/issues/1341#issuecomment -295300246

@dnephin , ๋‚ด ์˜๊ฒฌ์„ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์ง„ํ™”์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ๋ถˆํ™”๋กœ ์ธํ•ด ์ข…๊ฒฐ๋˜์–ด์„œ ๋„ˆ๋ฌด ์Šฌํ”„๋‹ค : ์‹ค๋ง :

Docker ๊ตฌ์„ฑ์˜ ๊ฐ€์žฅ ํฐ ๊ฐ€์น˜๋Š” ํ‘œ์ค€ํ™”์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ์š”์ ์ž…๋‹ˆ๋‹ค. Docker Compose๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  .sh ํŒŒ์ผ์ด๋‚˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด "๊ทธ๋ƒฅ"์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™œ Docker Compose๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๊นŒ? : ํ˜ผ๋ž€ :

@ shin-์ด ๋งํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์ด ํฐ ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆํƒ€๊น๊ฒŒ๋„ ํ”„๋กœ์ ํŠธ์˜ ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ถ€๋‹ด์ž…๋‹ˆ๋‹ค.

:์‹ฌ์žฅ:

ํ•˜์ง€๋งŒ "์Šคํฌ๋ฆฝํŠธ ๋งŒ๋“ค๊ธฐ"๋ผ๊ณ  ๋งํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. "์ด๋ด, ๋„ˆ๋ฌด ํž˜๋“ค์–ด. ์šฐ๋ฆฌ๋Š” ๋งŒ๋“ค์ง€ ์•Š์„๊ฑฐ์•ผ"๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๋ฉด "๋‹น์‹ ์˜ ์•„์ด๋””์–ด๊ฐ€ ํฅ๋ฏธ๋กญ๊ณ  ์•ฝ๊ฐ„์˜ ํ•„์š”๋ฅผ ์ฑ„์›Œ์ฃผ์ง€๋งŒ, ์ •๋ง ์–ด๋ ต๊ณ  ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๊ทธ๊ฒƒ์„ ํ•  ์ž์›์ด ์—†์Šต๋‹ˆ๋‹ค ... ์•„๋งˆ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ’€ ๋ฆฌํ€˜์ŠคํŠธ "๋˜๋Š” ๊ทธ์™€ ๋น„์Šทํ•œ ๊ฒƒ : bulb :

# 1341์—์„œ๋Š” docker-compose.yml ์—์„œ์™€ ๊ฐ™์ด ์ผ๋ถ€ ์ด๋ฒคํŠธ (์˜ˆ : ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ) ์ „ํ›„์— ์‹คํ–‰๋˜๋Š” nmp install ์™€ ๊ฐ™์€ docker-compose.yml ๋ช…๋ น์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ "๋งŒ"๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค docker exec <container id> npm install ์˜ˆ๋ฅผ ๋“ค์–ด

์‚ฌ์šฉ ์‚ฌ๋ก€

๋‚˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ NodeJS ์ด๋ฏธ์ง€๋ฅผํ•˜๊ณ  ๋‚œ ์‹คํ–‰ํ•˜๋ ค๋ฉด npm install ์œผ๋กœ, ๊ทธ๊ฒƒ์—์„œ ๋งŒ๋“  ์šฉ๊ธฐ์— docker-compose up --build .

๋‚ด ๋ฌธ์ œ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ docker-compose.yml ์ •์˜ ๋œ ๋ณผ๋ฅจ๊ณผ ํ•จ๊ป˜ ํƒ‘์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

custom-node:
    build: ../my_app-node/
    tty: true
    #command: bash -c "npm install && node"
    volumes:
     - /var/www/my_app:/usr/share/nginx/html/my_app

๋”ฐ๋ผ์„œ ์ข…์†์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Dockerfile์—์„œ npm install ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋™์ž‘์„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. http://stackoverflow.com/questions/43498098/what-is-the-order-of-events-in-docker-compose

npm install ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ธ command ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

command: bash -c "npm install && node"

์ •๋ง ๊นจ๋—ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค : ์‹ค๋ง : ๊ทธ๋ฆฌ๊ณ  Alpine ๋ฒ„์ „์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (Bash๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

Docker Compose๊ฐ€ ์ปจํ…Œ์ด๋„ˆ, eG์—์„œ exec ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

custom-node:
    build: ../my_app-node/
    tty: true
    command: node
    volumes:
     - /var/www/my_app:/usr/share/nginx/html/my_app
    exec:
     - npm install

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •๋ง ๋น ์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

compose๊ฐ€ ํ…Œ์ŠคํŠธ ์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์•„๋งˆ๋„ ํ‹€๋ ธ์„ ๊ฒƒ์ด๋ฉฐ ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋“ฑ์„ ์œ„ํ•ด ๋” ๋งŽ์€ ๊ฒƒ์„ ์˜๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์•„ ์ปจํ…Œ์ด๋„ˆ์™€ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„, ๊ฒฝ๋กœ ๋ฐ ์†Œ์œ ๊ถŒ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ• ์‚ฌ์ด์˜ ๋ถˆ๋ถ„๋ช… ํ•œ ๊ด€๊ณ„์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฑฐ์นœ ๊ฐ€์žฅ์ž๋ฆฌ์— ๋ถ€๋”ช ํ˜”์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ ๋“ฑ์— ์—ฌ๋Ÿฌ compose ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋ž˜์„œ ๋ชจ๋‘ CI์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋Œ€์‹  kubelet์„ ๋…๋ฆฝ ์‹คํ–‰ ํ˜•์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ CI์—์„œ ํ”„๋กœ๋•์…˜ k8 ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋งŽ์€ ์ ‘์ฐฉ์ œ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ ์–ด๋„ ์ด๋Ÿฐ ์‹์œผ๋กœ dev, test ๋ฐ prod์— ๋Œ€ํ•ด ๋™์ผํ•œ ์„ ์–ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ lucile-sticky๋Š” ์•ŒํŒŒ์ธ์—์„œ sh -c ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์€ docker-compose์˜ ์—ญํ• ์ด ์•„๋‹Œ "๋นŒ๋“œ ์ž๋™ํ™”"์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋„๋น„ ๋ดค์–ด ?

๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ :

  • ์ด๊ฒƒ์ด Docker Compose์˜ ์—ญํ• ์ด ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ํ•ต์‹ฌ์ด ํ•˜๋‚˜์˜ ๋„๊ตฌ ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‘๋ฅผ ์ง€๋ฐฐํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด Docker Compose๊ฐ€ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์—†๋Š” ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๊ธฐ๋Šฅ์€ ๋งค์šฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

@ lucile-sticky

์ด๊ฒƒ์ด Docker Compose์˜ ์—ญํ• ์ด ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Compose์˜ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋˜์–ด ์žˆ๊ณ  ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Compose๋Š” ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ Docker ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Compose์—์„œ๋Š” Compose ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹จ์ผ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ์—์„œ ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ์ด ํ•˜๋‚˜์˜ ๋„๊ตฌ ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์„ ์ง€๋ฐฐํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด Docker Compose๊ฐ€ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์—†๋Š” ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค ๋ชจ๋‘๋ฅผ ์ง€๋ฐฐํ•˜๋Š” ํ•˜๋‚˜์˜ ๋„๊ตฌ๊ฐ€๋˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์œ ๋‹‰์Šค ์ฒ ํ•™์„ ๋”ฐ๋ฅด๊ณ  "๊ฐ ํ”„๋กœ๊ทธ๋žจ์ด ํ•œ ๊ฐ€์ง€ ์ผ์„ ์ž˜ํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค. ์ƒˆ๋กœ์šด ์ž‘์—…์„ํ•˜๋ ค๋ฉด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ๋ง๊ณ  ์ƒˆ๋กœ ๋นŒ๋“œํ•˜์‹ญ์‹œ์˜ค."๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.
๊ทธ ์ฒ ํ•™์— ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€ ๋งŒ Docker์—์„œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ €๋Š” 2015 ๋…„ 8 ์›”์—์ด ๋ฌธ์ œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋งค๋…„ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋Œ“๊ธ€์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋™์ผํ•œ ๋‹ต๋ณ€์œผ๋กœ ๋™์ผํ•œ ์งˆ๋ฌธ์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ํ™•์‹คํžˆ @dnephin ์ด ๊ทธ์˜ ๋„๊ตฌ์— ๋Œ€ํ•œ ๊ด‘๊ณ ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

@์ •๊ฐ•์ด-

์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋„๊ตฌ์—์„œ "๋นŒ๋“œ"์™€ "ํ”„๋กœ๋น„์ €๋‹"์„ ๋ถ„๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑ ํ•  ๋•Œ์ด๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋žŒ๋‘ฅ์ด๋ฅผ ๋ฐฐํฌํ•˜๋ฉด ์ „์Ÿ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹ํ•ด์•ผํ•˜๊ณ , DB๋ฅผ ๋งŒ๋“ค๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹œ์ž‘๋˜์–ด์•ผํ•˜๋Š”์ง€์— ๊ด€๊ณ„์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ž…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ด๋ฏธ์ง€ ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•จ). Compose ์‚ฌ๋ก€์—์„œ "ํ”„๋กœ ๋น„ ์ €๋„ˆ"์˜ ์ฃผ๋œ ๋ชฉ์ ์€ "์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ํ•ญ๋ชฉ"๊ณผ "์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•ญ๋ชฉ"๊ฐ„์˜ ์˜คํ•ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"Compose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Compose ํŒŒ์ผ์„ ์‚ฌ์šฉ ํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์„œ๋น„์Šค๋ฅผ ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹จ์ผ ๋ช…๋ น์„ ์‚ฌ์šฉ ํ•˜์—ฌ ๊ตฌ์„ฑ์—์„œ ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ

์œ ๋‹‰์Šค ์ฒ ํ•™? ์›ƒ๊ฒŒ ํ•ด์ฃผ์„ธ์š”. ์ด ๋ฌธ์ œ https://github.com/docker/compose/issues/1809#issuecomment -237195021์—์„œ ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋‹ต๋ณ€์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.
"moby"๊ฐ€ ์œ ๋‹‰์Šค ์ฒ ํ•™์—์„œ ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ ํ•  ๊ฒƒ์ธ์ง€ ๋ณด์ž.

@shin docker-compose๋Š” ์ƒ์ƒ๋ ฅ์˜ ํ™•์žฅ์œผ๋กœ ์œ ๋‹‰์Šค ์ฒ ํ•™์„ ๊ณ ์ˆ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. docker-compose๊ฐ€ Unix ์ฒ ํ•™์„ ๊ณ ์ˆ˜ํ•œ๋‹ค๋ฉด build, up, rm, start, stop ๋“ฑ ๊ฐ๊ฐ์— ๋Œ€ํ•œ ๊ฐœ๋ณ„ ๋ช…๋ น์ด์žˆ์„ ๊ฒƒ์ด๋ฉฐ ๊ฐ๊ฐ ์ผ๊ด€๋˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ stdin, stdout ๋ฐ stderr์„ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. System V, HP-UX, AIX, Solaris ๋ฐ Linux๋ฅผ ํฌํ•จํ•˜์—ฌ 20 ๋…„ ์ด์ƒ์˜ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์œ ๋‹‰์Šค ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๊ฐ€ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ž‘์„ฑ ๊ฐœ์š”๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Compose๋Š” ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ Docker ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Compose์—์„œ๋Š” Compose ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹จ์ผ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ์—์„œ ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ถ๊ทน์ ์œผ๋กœ docker-compose๋Š” docker ์ด๋ฏธ์ง€์—์„œ ์ƒ์„ฑ ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค ๊ทธ๋ฃน์„ ๊ด€๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ๊ธฐ๋Šฅ์€ docker-compose.yml ํŒŒ์ผ์— ์ •์˜ ๋œ ์„œ๋น„์Šค๋ฅผ '์ƒ์„ฑ', '์‹œ์ž‘', '์ค‘์ง€', 'ํ™•์žฅ'๋ฐ '์ œ๊ฑฐ'ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์„œ๋น„์Šค๋Š” ์ด๋Ÿฌํ•œ ๊ฐ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ „ํ™˜ ๋™์•ˆ ์ถ”๊ฐ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ™•์žฅํ•˜๋ ค๋ฉด ์ข…์ข… ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฉค๋ฒ„๋ฅผ ๊ฒฐํ•ฉํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ™•์žฅํ•˜๋ ค๋ฉด ์ข…์ข… ๊ตฌ์„ฑ์›์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ–ˆ์Œ์„๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์— ์•Œ๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํŽธ์ง‘์ฆ์ ์ธ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ๊ทธ๋ฅผ ๊ฐ•์ œ๋กœ ๋น„์šฐ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ข…๋ฃŒ ํ•  ๋•Œ ์ฒดํฌ ํฌ์ธํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋„๊ตฌ์—๋Š” ์ƒํƒœ ์ „ํ™˜์— ๋Œ€ํ•œ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. AWS์˜ ๋„๊ตฌ, Google์˜ ๋„๊ตฌ, ๊ฐ๋…, ์š”๋ฆฌ์‚ฌ ๋“ฑ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ณต๊ฐ„์—์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ•ญ๋ชฉ์—๋Š” ์ผ์ข…์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ ํ›„ํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋„๊ตฌ์ด๊ณ  ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ธ์‹ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋„์ปค-์ปด ํฌ์ฆˆ์˜ ์˜์—ญ์— ํ™•๊ณ ํ•˜๊ฒŒ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋‚˜ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ฉฑ ๋“ฑ์„ฑ์ด ์•„๋‹ˆ๋ฉฐ ์ด๋ฒคํŠธ๋ฅผ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•˜๋Š” '๋‘ ๋ฒˆ์งธ'์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํ›„ํฌ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

ํ•˜๋ฃจ๊ฐ€ ๋๋‚˜๋ฉด docker-compose ์‚ฌ์šฉ์ž๊ฐ€ ํ‘œํ˜„ํ•˜๋Š” ์‹ค์ œ ์š”๊ตฌ๊ฐ€ ์žˆ์œผ๋ฉฐ @aanand , @dnephin , @ shin-์€ ๊ทธ๊ฒƒ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋กœ๋“œ๋งต์— ํฌํ•จ ๋œ ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ํ…Œ์ŠคํŠธ ๋ฐ ํ”„๋กœ๋•์…˜ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ์—์„œ Docker ์ฑ„ํƒ์„ ์ฐจ๋‹จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ํ•ด๊ณ ๋˜๊ธฐ๋ณด๋‹ค๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ์ •๋ง๋กœ๋ณด๊ณ  ์‹ถ๋‹ค.

์ด๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

๋‚˜์—๊ฒŒ ๋ฌธ์ œ๋Š” ์„œ๋น„์Šค b๋ฅผ ์‹คํ–‰ํ•˜๋Š” db ์ปจํ…Œ์ด๋„ˆ B์— ์˜์กดํ•˜๋Š” ์„œ๋น„์Šค 'a'๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์•ฑ ์ปจํ…Œ์ด๋„ˆ A๊ฐ€์žˆ์„ ๋•Œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ B๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด A ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
๊ณ ์œ  ํ•œ Dockerfile์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  Docker ํ—ˆ๋ธŒ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ A๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ์œ ์ผํ•œ ์˜ต์…˜์€

  1. B๋ฅผ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ ์œ  ํ•œ Dockerfile์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. A๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ์—์„œ b๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  A๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.

@ lucile-sticky์™€ ๋˜‘๊ฐ™์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

@lekhnath ๋‚ด ๊ฒฝ์šฐ์—, ๋‚˜๋Š” ํŽธ์ง‘ํ•˜์—ฌ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐ command ๋‚ด์—์„œ ์˜ต์…˜ docker-compose.yml :

command: bash -c "npm install && node"

๊ทผ๋ฐ ๋„ˆ๋ฌด ๋ชป ์ƒ๊ฒผ์–ด TT

@ lucile-sticky ์ด๊ฒƒ์€ ์ปจํ…Œ์ด๋„ˆ์˜ Dockerfile ์— ์„ค์ •๋œ ๋ชจ๋“  ๋ช…๋ น์„ ๋ฌด์‹œํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์‰˜ ์Šคํฌ๋ฆฝํŠธ ์„ค์น˜ํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค volumes ๋งŒ๋“œ๋Š” command ์Šคํฌ๋ฆฝํŠธ, ๊ทธ๋ฆฌ๊ณ  ์›๋ณธ์„ ํฌํ•จํ•˜์—ฌ ๋‚˜์˜ ๋„์ปค ์ž‘์„ฑ ํŒŒ์ผ ์‹คํ–‰์— CMD ๋กœ๋ถ€ํ„ฐ Dockerfile .

์ด ๋ฌธ์ œ๊ฐ€ ์ข…๊ฒฐ ๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? _bash ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ _ ๋˜๋Š” _ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ์ด ๋„๊ตฌ ์‚ฌ์šฉ _์€์ด ๋ฌธ์ œ๋ฅผ ์ข…๊ฒฐ ํ•  ์œ ํšจํ•œ ์ด์œ ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ compose๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ํ•„์š”ํ•œ ๋งค์šฐ ์œ ์šฉํ•˜๊ณ  ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

@dnephin init ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ๋ฒ”์œ„ ๋ฐ–์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ฒฐ๊ตญ compose๋Š” "Docker๋กœ ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰"ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์—ฌ๊ธฐ์— ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€ ๋„๋น„๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. :)
image

์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. docker-compose ํŒŒ์ผ ๋‚ด์—์„œ @ ahmet2mir๊ฐ€ ์ œ๊ณต ํ•œ ์˜ˆ์ œ์™€ ๊ฐ™์ด ๋ช…๋ น์ด ์‹คํ–‰๋˜์–ด์•ผํ•˜๋Š”์‹œ๊ธฐ๋ฅผ ๊ธฐ๋ก ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ฒƒ์„๋ณด๊ณ  ๋งค์šฐ ์Šฌํ”•๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค. ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ํ›„ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์•ผํ•˜๋Š” ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ Docker ๊ตฌ์„ฑ ํ›„ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๊ฐ์‚ฌ

์ด ๊ธฐ๋Šฅ์ด ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ด ๋†€๋ž์Šต๋‹ˆ๋‹ค!

@dnephin์€ ๋งค์šฐ ํ˜•ํŽธ์—†๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ฃผ๋กœ ์ž๊ธฐ ํ™๋ณด๋กœ ๋ณด์ด๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ์ฐพ๋Š” ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„์„ ๊ธˆ์ง€ํ–ˆ์œผ๋ฉฐ ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•  ์˜์‚ฌ์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ข€ ๋” ์˜จํ™”ํ•œ ์–ธ์–ด๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.์ด ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•˜์—ฌ ๋‹ค๋ฅธ ๋งŽ์€ ๊ฐœ๋ฐœ์ž ๋ฐ ํŒ€๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์›Œํฌ ํ”Œ๋กœ์— ์ผ๋ถ€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค ..

์•„, ๊ทธ๋Ÿผ unix-way ๋กœํ•ฉ์‹œ๋‹ค.
_Just_ (๋ฉ€ํ‹ฐ ํ”Œ๋ ‰์Šค ํ›„) docker-compose up stdin์„ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์˜ CMD ?
๊ทธ๋Ÿฐ yaml ํŒŒ์ผ์ด

services:
  node:
    command: sh -

์ด ์ผ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค : cat provision.sh | docker-compose up
์ปจํ…Œ์ด๋„ˆ๋Š” exec uting์„์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช…๋ น์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค stdin์„ ๋” ์ž˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋Œ€์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

services:
  node:
    localscript: provision.sh

ํ”„๋กœ๋น„์ €๋‹ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ 99 %๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์•ฝ๊ฐ„์˜ ์‰˜ ์ค‘์‹ฌ์ด์ง€๋งŒ.

์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๊ณ  ์ด์— ๋Œ€ํ•œ ๋งŽ์€ ์ฐฌ์„ฑ ํˆฌํ‘œ๊ฐ€ ์žˆ์ง€๋งŒ ... ์—ฌ์ „ํžˆ ๋ถ„๋ช…ํžˆ ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์žˆ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ €๋„ ์ด๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด +์˜ ํฐ ์Šคํƒ์— ๋‚ด +1 ์ถ”๊ฐ€

... ์—ฌ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ +1!

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ทธ๋Ÿฌํ•œ ์š”์ฒญ์ด ์žˆ์œผ๋ฉด ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ๋„๊ตฌ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์œผ๋ฉฐ ์‚ถ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก์ด๋ฅผ ์„ฑํ˜•ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณ ์ˆ˜ํ•˜๋Š” ์ฒ ํ•™์„ ์ดํ•ดํ•˜์ง€๋งŒ ์–ด๋–ค ์ข…๋ฅ˜์˜ "ํ›„ํฌ ๋ช…๋ น"์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

+1 +1

์ด ๊ธฐ๋Šฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

docker-start.sh

#!/usr/bin/env bash

set -e
set -x

docker-compose up -d
sleep 5

# #Fix1: Fix "iptable service restart" error

echo 'Fix "iptable service restart" error'
echo 'https://github.com/moby/moby/issues/16137#issuecomment-160505686'

for container_id in $(docker ps --filter='ancestor=reduardo7/my-image' -q)
  do
    docker exec $container_id sh -c 'iptables-save > /etc/sysconfig/iptables'
  done

# End #Fix1

echo Done

@ reduardo7 ๊ทธ๋Ÿฐ ๋‹ค์Œ docker-compose๋ฅผ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๋ฉด ์ข…์†์„ฑ์ด ํ•˜๋‚˜ ์ค„์–ด ๋“ญ๋‹ˆ๋‹ค.

@omeid , ๋‹น์‹ ์ด ๋งž์•„์š”! ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

@ reduardo7 ์‚ฌ๊ณผ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ ํ•œ ๋‚ด์šฉ์ด ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋‹จ์ง€ ์›๋ž˜์˜ ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์œ ํšจํ•˜๋ฉฐ ์ข…๊ฒฐ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ์ ์„ ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. :)

@dnephin ์˜ ์Šคํƒ ๋“œ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์–ธ๊ธ‰ ๋œ ๊ธฐ๋Šฅ์€ ์ถฉ๋ถ„ํžˆ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์œผ๋กœ ๋Œ€์ฒด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ํŒจํ„ด์ด ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ€์ด๋“œ (๋˜๋Š” ์ผ๋ถ€ ํ…Œ์ŠคํŠธ)๋ฅผ ์ œ์‹œํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”?

์ด ํŒจํ„ด์ด ์ž์ฃผ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@MaybeS ์œ ์ผํ•œ ๋ถˆ์ผ์น˜๋Š” @dnephin ์ด docker-compose๋ฅผ ๋” ๋‚˜์€ ์ œํ’ˆ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ๋Œ€์‹  ๊ทธ์˜ ๋ฉ์ฒญํ•œ ๋„๊ตฌ๊ฐ€ ํ™๋ณด๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@omeid ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

onrun ํ˜•์‹์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•˜๋Š” ์˜ค๋Š˜์˜ ์˜ˆ

version: "3.3"
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'gitlab'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # NOTE: this URL needs to be right both for users, and for the runner to be able to resolve :() - as its the repo URL that is used for the ci-job, and the pull url for users.
        external_url 'http://gitlab:9090'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '9090:9090'
      - '2224:22'
  gitlab-runner:
    image: gitlab/gitlab-runner:latest
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock

๋ฌผ๋ก  ์ฃผ์ž๋Š” ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•˜๋ ค๋ฉด

  1. gitlab์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ† ํฐ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  2. ๋Ÿฌ๋„ˆ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ ˆ์ง€์Šคํ„ฐ ์‹คํ–‰

๋”ฐ๋ผ์„œ docker-compose์—์„œ ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฐฐํฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๋Œ€์‹  ๋ณด์กฐ ์ˆ˜๋‹จ์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ ... ๋ฌธ์„œ?

export GL_TOKEN=$(docker-compose exec -u gitlab-psql gitlab sh -c 'psql -h /var/opt/gitlab/postgresql/ -d gitlabhq_production -t -A -c "SELECT runners_registration_token FROM application_settings ORDER BY id DESC LIMIT 1"')
docker-compose exec gitlab-runner gitlab-runner register -n \
  --url http://gitlab:9090/ \
  --registration-token ${GL_TOKEN} \
  --executor docker \
  --description "Docker Runner" \
  --docker-image "docker:latest" \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock \
  --docker-network-mode  "network-based-on-dirname-ew_default"

์Œ, ๋ญ”๊ฐ€ ํ•ดํ‚น ํ•  ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชฐ๋ผ ๋„์ปค ์†Œ์ผ“์ด์žˆ๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๊ณ  docker exec's

๋‚ด๊ธฐํ•ด์•ผ ํ•  ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค ....

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  gitlab-initializer:
    image: docker/compose:1.18.0
    restart: "no"
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - ./gitlab-compose.yml:/docker-compose.yml
    entrypoint: bash
    command: -c "sleep 200 && export GL_TOKEN=$(docker-compose -p sima-austral-deployment exec -T -u gitlab-psql gitlab sh -c 'psql -h /var/opt/gitlab/postgresql/ -d gitlabhq_production -t -A -c \"SELECT runners_registration_token FROM application_settings ORDER BY id DESC LIMIT 1\"') && docker-compose exec gitlab-runner gitlab-runner register -n --url http://gitlab:9090/ --registration-token ${GL_TOKEN} --executor docker --description \"Docker Runner\" --docker-image \"docker:latest\" --docker-volumes /var/run/docker.sock:/var/run/docker.sock --docker-network-mode  \"simaaustraldeployment_default\""

๋‚ด ์ž‘์„ฑ ํŒŒ์ผ์—-gitlab์ด ์ฆ‰์‹œ ์ค€๋น„๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ข…์˜ ๋ฃจํ”„ / ๊ธฐ๋‹ค๋ฆผ์ด ํ•„์š”ํ•˜์ง€๋งŒ sleep 200 ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ-๋‹น์‹ ์€ __can__ docker-compose.yml ์—์„œ ์ง์ ‘ ์ด์™€ ๊ฐ™์€ ํŒจํ„ด์„ ํ•ดํ‚นํ•ฉ๋‹ˆ๋‹ค-ํ•˜์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ์ด๊ฒƒ๋ณด๋‹ค ๋” ๊นจ๋—ํ•œ ์ง€์›์„ ์›ํ•ฉ๋‹ˆ๋‹ค :)

@SvenDowideit onrun ์ด (๊ฐ€) ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. entrypoint ๋˜๋Š” cmd ์ž…๋‹ˆ๋‹ค.

์ด ์ด๋ฏธ์ง€์˜ ์ง„์ž… ์  ์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ํ›„ํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. $GITLAB_POST_RECONFIGURE_SCRIPT ๋Š” ๋ชจ๋“  ์„ค์ •์ด ์™„๋ฃŒ๋œ ํ›„ ์‹คํ–‰ํ•  ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด๋ฏธ์ง€์—์„œ /assets/wrapper ์ฐธ์กฐ). env ๋ณ€์ˆ˜๋ฅผ psql + register๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  ์„ค์ •์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๊ฐ€์ด ํ›„ํฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ด๋ฏธ์ง€๋ฅผ ํ™•์žฅํ•˜๋ฉด ์ƒ๋‹นํžˆ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gitlab์ด ๋ฐ”๋กœ ์ค€๋น„๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ข…์˜ ๋ฃจํ”„ / ๊ธฐ๋‹ค๋ฆผ์ด ํ•„์š”ํ•˜์ง€๋งŒ sleep 200์€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"exec-after-start"์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง„์ž… ์  ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ค์ œ๋กœ ํ›„ํฌ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์†”๋ฃจ์…˜์—์„œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ œ๊ฐ€ ๋ณด์—ฌ์ฃผ๊ณ ์žˆ๋Š” ๋ฌธ์ œ์˜ ์ผ๋ถ€๋ฅผ ๋†“์นœ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ๋‘ ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋‘์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง„์ž… ์  / ๋ช…๋ น์€ ์ด๊ฒƒ์„ ์ œ๊ณตํ•˜์ง€ _ ์•Š์Šต๋‹ˆ๋‹ค _.

GL_TOKEN ๋Š” gitlab ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ gitlab-runner ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋“ฑ๋กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ œ๊ฐ€ํ•˜๊ณ ์žˆ๋Š” ํ•ดํ‚น์€ docker/compose ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•œ ์ปจํ…Œ์ด๋„ˆ์˜ config / entrypoint / settings๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ, ์™„์ „ํžˆ (์‚ฌ์†Œํ•œ) ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ฒƒ์„ ํ•„์š”๋กœํ•˜๋Š” ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ์กฐ์ •.

๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์ข€ ๋” ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ๋ณธ์ ์œผ๋กœ gitlab์ด ์ž์ฒด์ ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ์— ์•ฝ๊ฐ„์˜ ์ˆ˜๋ฉด ๋ฃจํ”„๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

TBH, ์ €๋Š” compose ํŒŒ์ผ ์ž์ฒด์™€ docker / compose ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” init-container์—์„œ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ณต์žก์„ฑ์„ ์ˆจ๊ธฐ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋Š๋ผ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ๋ฐ–์œผ๋กœ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์ž‘๋™ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค "์ด๋Ÿฐ ์ƒํ™ฉ.

_IF_ ๋‚˜๋Š” ๋„์›€์ด ๋  ์ด์ƒํ•œ ๊ตฌ๋ฌธ ์  ์„คํƒ•์„ ๊ณ ๋ คํ•ด์•ผํ–ˆ๋‹ค. ์•„๋งˆ๋„ ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ•  ๊ฒƒ์ด๋‹ค.

gitlab-initializer:
    image: docker/compose:1.18.0
    restart: "no"
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - ./gitlab-compose.yml:/docker-compose.yml
    entrypoint: ['/bin/sh']
    command: ['/init-gitlab.sh']
    file:
      path: /init-gitlab.sh
      content: |
            for i in $(seq 1 10); do
                export GL_TOKEN=$(docker-compose -f gitlab-compose.yml -p sima-austral-deployment exec -T -u gitlab-psql gitlab sh -c 'psql -h /var/opt/gitlab/postgresql/ -d gitlabhq_production -t -A -c "SELECT runners_registration_token FROM application_settings ORDER BY id DESC LIMIT 1"')
                echo "$i: token($?) == $GL_TOKEN"
                ERR=$?

                if [[ "${#GL_TOKEN}" == "20" ]]; then
                    break
                fi
                sleep 10
            done
            echo "GOT IT: token($ERR) == $GL_TOKEN"

            for i in $(seq 1 10); do
                if  docker-compose -f gitlab-compose.yml  -p sima-austral-deployment exec -T gitlab-runner \
                    gitlab-runner register -n \
                    --url http://gitlab:9090/ \
                    --registration-token ${GL_TOKEN} \
                    --executor docker \
                    --description "Docker Runner" \
                    --docker-image "docker:latest" \
                    --docker-volumes '/var/run/docker.sock:/var/run/docker.sock' \
                    --docker-network-mode  "simaaustraldeployment_default" ; then
                        echo "YAY"
                        break
                fi
                sleep 10
            done

์ฆ‰, cloud-init : http://cloudinit.readthedocs.io/en/latest/topics/examples.html#writing -out-arbitrary-files

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์— ๊ด€ํ•ด์„œ๋Š”-์šฐ๋ฆฌ๋Š” docker-compose-yml ๋‚ด๋ถ€์—์„œ ๋ณต์žกํ•œ ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์กฐ์ •ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์ •์˜ ๋œ ํ† ํฐ์„ ์„ค์ •ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ gitlab-runner ์˜ ์ง„์ž… ์  ์Šคํฌ๋ฆฝํŠธ์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์˜ ์„ ๋‘๋ฅผ ์ •ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๊นŒ?

@dnephin ๋‹น์‹ ์ด ๋Œ€๋ณธ์„ ์–ธ๊ธ‰ํ•˜๋Š” ์ˆœ๊ฐ„, ๋‹น์‹ ์€ ์ง€๋‚˜๊ณ  ๋‚˜์„œ ์•ฝ๊ฐ„์˜ ์กฑ์ ์„ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

onrun ๋Š” entrypoint ๋˜๋Š” cmd ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

entrypoint / cmd ๋Š” ์ปจํ…Œ์ด๋„ˆ init / PID 1๋กœ ์‹คํ–‰๋  ์‹คํ–‰ ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์™€ ๋งŽ์€ ๊ด€๋ จ ๋ฌธ์ œ์—์„œ ์–ธ๊ธ‰ ๋œ ์•„์ด๋””์–ด๋Š” init scripts ์— ๋Œ€ํ•œ ๊ฒƒ์ธ๋ฐ, ์ด๋Š” ๋ถ€ํŒ…์˜ ๋งฅ๋ฝ์—์„œ init ์™€ ๋‹ค๋ฅด๋ฉฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@dnephin ํŠน์ • ์ปจํ…Œ์ด๋„ˆ ์„ธํŠธ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ ์„ธํŠธ์— ์ดˆ์ ์„ ๋งž์ถ˜ ๊ฒฝ์šฐ ๋” ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ์—์„œ, ๊ทธ๊ฒƒ์€ ์ƒ์„ฑ ๋œ ๋น„๋ฐ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ์ด๊ฒƒ์€์ด ์ž‘์€ ํ”Œ๋ ˆ์ด ์‹œ์Šคํ…œ์˜ ์œ ์ผํ•œ ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ์กฐ์ • ์š”๊ตฌ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ณต๊ฐœ์ ์œผ๋กœ ํ”„๋กœํ†  ํƒ€์ž….

v1 ์ดํ›„ compose ํŒŒ์ผ์—์„œ entrypoint ๋ฐ command ๋ฅผ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? -v1 / # entrypoint) ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž‘๋™ ์ค‘์ผ ๋•Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•œ onrun ์™€ ๊ฐ™์€ ์ง€์‹œ๋ฌธ์ด ์•„์ง ์—†์Šต๋‹ˆ๊นŒ?

TBH, ์ €๋Š” onrun ์ด ๊ทธ๋Ÿด๋“ฏํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Docker, ๋˜๋Š” ์˜ค์ผ€ ์ŠคํŠธ๋ ˆ์ดํ„ฐ๊ฐ€ "์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ชจ๋‘ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค"๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์— HEALTHCHECK๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ •๋ณด๋ฅผ ์–ป๊ณ  ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ถ”๊ฐ€ "๋ฌผ๊ฑด"์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  _if_ ๋งž์•„์š”, ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ์„๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ๊ฐ์ง€ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์—ฐ์‚ฐ์ž ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์ฝ”๋“œ๊ฐ€์žˆ๋Š” ๋„์ปค ์ž‘์„ฑ ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด (๋„์ปค ์ž‘์„ฑ์—์„œ) ๊ฐ€์žฅ ์ž˜ ํ•ด๊ฒฐ๋˜๋Š” ์ž‘์—…์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

์ด ์—ฐ์‚ฐ์ž๋ฅผ ๋„์ปค ๋ฌด๋ฆฌ ์Šคํƒ์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ๋†€ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด).

์ปจํ…Œ์ด๋„ˆ์— "์ด๊ฒƒ์€ ์šด์˜์ž์ž…๋‹ˆ๋‹ค. ๋งˆ๋ฒ• ๋Šฅ๋ ฅ์„ ๋ถ€์—ฌํ•˜์‹ญ์‹œ์˜ค"๋ผ๊ณ  ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด docker-compose์— ์ถ”๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ๊ตฌ๋ฌธ ์„คํƒ•์ด ๋งŽ์ด ์žˆ๋Š”์ง€ ํ™•์‹  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋ง์„ ๋“ฃ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค .. ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. docker-compose๊ฐ€ ํฐ ๊ณ ํ†ต์ž…๋‹ˆ๋‹ค. docker-composer์—์„œ ๋นŒ๋“œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค ... ์ €๋Š” SIMPLE ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ํ™œ์„ฑ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.

docker-composer๋Š” ๋‹จ์ˆœํžˆ NOT DONE ์ƒํƒœ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ๋‚ด ์ž‘์„ฑ ํŒŒ์ผ์— onrun ์ด ๋  ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

__BUT__, ์ปจํ…Œ์ด๋„ˆ๋„ ์ž‘์„ฑ๋„ onrun ์˜๋ฏธ๋ฅผ ์•Œ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—ฐ์‚ฐ์ž ํŒจํ„ด์ด ์กด์žฌํ•˜๋Š” ์ด์œ ์ด๋ฉฐ https://github.com/docker/compose/issues/1809#issuecomment -362126930์—์„œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“  ์ด์œ ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์ด ์ž‘์—…์„ __is__ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ๋‹ค๋ฅธ ์„œ๋น„์Šค๊ฐ€ ์‹ค์ œ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ค€๋น„๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” onrun ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ ํ•œ ๋‹ค์Œ (gitlab์˜ ๊ฒฝ์šฐ์—๋Š” ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค) ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ดํ•ด์•ผ โ€‹โ€‹ํ•  ์ผ์€ ๋ฌด์—‡์ด๋“ .

๊ทธ๊ฒƒ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ €ํฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ์„ธ์š”. ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

๋‚˜๋„ ์ž‘์„ฑ ํŒŒ์ผ์—์„œ ์‹คํ–‰๋  ๋ฌด์–ธ๊ฐ€๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ปจํ…Œ์ด๋„ˆ๋„ ๊ตฌ์„ฑ๋„ onrun์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์•Œ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€๋ณด๊ธฐ์— ์„œ๋น„์Šค ๋‹น onrun ๋Š” ์ฒซ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋˜๋Š”์‹œ๊ธฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์–ด์จŒ๋“  ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์› ๋ฌธ์ œ๋Š” RUN์ด Dockerfile์—์„œ Linux ๋ช…๋ น์„ ์˜๋ฏธ ํ•  ํ•„์š”๊ฐ€์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ docker exec ํ†ตํ•ด ๋ช…๋ น์ด ์™„์ „ํžˆ OS์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์ „์— ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-docker/manage-windows-dockerfile

onrun ๊ธฐ๋Šฅ ๋Œ€๊ธฐ ์ค‘

์ด onrun ๊ธฐ๋Šฅ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.์ด ๋„๊ตฌ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ 2 ๊ฐœ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„,์ด docker-compose ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค๊ณ ์ด onrun ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”? ๋„ˆํฌ๋“ค์€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@ reduardo7 ์˜ˆ, docker-composei ๋ผ๋Š” ์Šคํฌ๋ฆฝํŠธ์™€ onrun ์†์„ฑ์„ ํฌํ•จํ•˜๋Š” docker-composei.yml ๋กœ ๋ž˜ํ•‘ ํ•  ์ƒ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
Btw, docker-composei ๋Š” docker-compose improved ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์†”๋ฃจ์…˜์€ ์•„๋งˆ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ '์•ฑ ์ด๋ฏธ์ง€'(์•„๋งˆ๋„ ๋„์ปค๋ฅผ ์‚ฌ์šฉ)๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” (bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด) '์˜ค์ผ€ ์ŠคํŠธ๋ ˆ์ดํ„ฐ'์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด "์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹Œ"๋„๊ตฌ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํ•ญ์ƒ ์š”๊ตฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Docker ๋‚ด์—์„œ Docker๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ ๋œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด. onrun์€ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ ์ž ์žฌ์  ์ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ์™€ ๋ฏธ๋ž˜์˜ ์ฆ๊ฑฐ๋ฅผ ์กฐ๊ธˆ ํ™•๋Œ€ํ•˜๋ ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋” ๊ด‘๋ฒ”์œ„ํ•œ 'onevent'์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ดํŽด ๋ด์•ผํ•˜๋ฉฐ ๊ทธ์ค‘ ํ•˜๋‚˜๋Š” onrun์ž…๋‹ˆ๋‹ค.

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

์ œ ๊ฒฝ์šฐ์—๋Š” redis ์ปจํ…Œ์ด๋„ˆ๊ฐ€ redis ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋œ ํ›„ lua ์Šคํฌ๋ฆฝํŠธ๋ฅผ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋น„ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ๋Š” ์‹œ์ž‘ ํ›„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก systemd๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์™€ ๋‹จ์ˆœํ•˜๊ณ  ์ผ๊ด€์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ํ•  ์ปจํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ์—ญํ• ์„ ๊ณ ๋ คํ•  ๋•Œ compose์— ๋Œ€ํ•ด์„œ๋„ ์œ ์‚ฌํ•œ ์›์น™์ด ์กด์žฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์ธํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์กฐ์–ธ์œผ๋กœ ๊ฐœ์ธ์  ์„ ํ˜ธ๊ฐ€ ์•„๋‹Œ ์ž…์ฆ ๋œ ์šด์˜ ์›์น™์— ์ดˆ์ ์„ ๋งž์ถ”์‹ญ์‹œ์˜ค.

๊ทธ๋ž˜์„œ ํ•ด๊ฒฐ์ฑ…์€ (์ด ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์€ ํ›„) bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

thx dev๋Š” ๋‹น์‹ ์˜ ๋ฌผ๊ฑด์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๋ง์„ ๋“ฃ๊ณ  :)

๊ฐ„๋‹จํ•œ ์ œ์•ˆ (์˜ˆ : ์˜จ๋Ÿฐ ์ด๋ฒคํŠธ)๊ณผ ์‹ธ์šฐ๋Š” ๋…ผ์Ÿ ๋ฐ ๋ฐ˜๋ก ์ด ํฌํ•จ ๋œ ๋ฉ”์‹œ์ง€์˜ ์–‘์„ ๋ณด๋ฉด Github Issues๊ฐ€ _owners_ (ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์ž)๊ฐ€ ์‚ฌ์šฉ์„ ํ†ตํ•ด ์ž์‹ ์˜ ์ž์•„์™€ ํ˜„๋ช…ํ•จ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ณณ์œผ๋กœ ๋ฐ”๋€Œ ์—ˆ๋‹ค๋Š” ์ฒซ ๋ฒˆ์งธ ์†”์งํ•œ ์ธ์ƒ์€ ์‚ฌ์šฉ์ž์˜ ์ง€๋Šฅ์ ์ธ ๊ธฐ์—ฌ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ทธ๋“ค์˜ ์ง€์‹๊ณผ ๊ธฐ์ˆ ์  ์ธ ์•„๋ฅด๊ณค.

์ œ๋ฐœ, ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ์ง„์ •์œผ๋กœ _open_ํ•ฉ์‹œ๋‹ค.

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌด์—‡์ด ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

@ v0lume ์ด ๊ธฐ์‚ฌ ์ „์ฒด์—์„œ ์‹ค์ œ๋กœ ๋‹ต๋ณ€์„ ์ฝ๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ํ•ด๊ฒฐ์ฑ…์ด์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ... ๊ทธ๋ž˜๋„ ํ•ดํ‚ค ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
docker-compose.yml์—์„œ ๋ฒ„์ „ "2.1"์„ ์ง€์ •ํ•˜๋ฉด ์ƒํƒœ ํ™•์ธ ํ…Œ์ŠคํŠธ๋ฅผ ๋‚จ์šฉํ•˜์—ฌ ์‹œ์ž‘๋  ๋•Œ ์ด๋ฏธ์ง€ ๋‚ด์—์„œ ์ถ”๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

version: '2.1'
services:
    elasticsearch:
        image: docker.elastic.co/elasticsearch/elasticsearch:5.4.3
        healthcheck:
            test: |
                curl -X PUT elasticsearch:9200/scheduled_actions -H "ContentType: application/json" -d '{"settings":{"index":{"number_of_shards":'1',"number_of_replicas":'0'}}}' &&
                curl --silent --fail localhost:9200/_cat/health ||
                exit 1
            interval: 11s 
            timeout: 10s 
            retries: 3
        environment:
            - discovery.type=single-node
            - ES_JAVA_OPTS=-Xms1g -Xmx1g
            - xpack.security.enabled=false
    main:
        image: alpine
        depends_on:
            elasticsearch:
                condition: service_healthy

์ž‘์„ฑํ•œ healthcheck-test ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฝ”๋“œ> = 1๋กœ ์ข…๋ฃŒ๋˜๋ฉด ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„œ๋น„์Šค์˜ ์ƒํƒœ ํ™•์ธ์€ ๋‹ค๋ฅธ ์„œ๋น„์Šค๊ฐ€ ์—ฌ๊ธฐ์— ์˜์กดํ•˜๊ณ  ์˜ˆ์ œ์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ service_healthy ์กฐ๊ฑด์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” @ T-vK ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ข‹์•„ํ•˜๊ณ  ์ด์ „์— ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ•ดํ‚น์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

# Run Docker container here

until echo | nc --send-only 127.0.0.1 <PORT_EXPOSED_BY_DOCKER>; do
  echo "Waiting for <YOUR_DOCKER> to start..."
  sleep 1
done

# Do your docker exec stuff here

+1
๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๊ณ  ์ด๋ฏธ kubernetes์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„์ปค ์˜ค์ผ€ ์ŠคํŠธ๋ ˆ์ดํ„ฐ์— ์˜ํ•ด ๊ตฌํ˜„ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์ด๊ฒƒ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋ผ์ดํ”„ ์‚ฌ์ดํด ํ›„ํฌ๊ฐ€ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ ์— ๋ฌธ์„œํ™”๋˜์–ด

ํ•˜์ง€๋งŒ Dockerfiles๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜์—†๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„์— ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜๊ณ  ์ด์ „์— ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ •ํ™•ํ•œ ์ด๋ฆ„์„ ๋ชฐ๋ผ๋„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ณผ๋ฅจ์œผ๋กœ์˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌํ•˜๋Š” ํ™˜๊ฒฝ์— ๋”ฐ๋ผ dir ์ด๋ฆ„์ด ๋™์ ์ด๋ผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๊ณ  ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์œผ๋ฉฐ ๋‘˜ ์ด์ƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ํ›„ํฌ๋Š” ํ•ดํ‚นํ•˜๊ณ  Dockerfile์„ ๊ต์ฒดํ•˜์ง€ ์•Š๊ณ ๋„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜์žˆ๋Š” ์œ ์—ฐ์„ฑ๊ณผ ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ช‡ ๋…„ ๋™์•ˆ Docker์™€ Docker compose๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ง„์ง€ํ•˜๊ฒŒ ์‹œ์Šคํ…œ ํ™•์žฅ์„ ์‹œ์ž‘ํ•˜๋Š” ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. 1 ~ 2 ๋…„์— ํ•œ ๋ฒˆ ํ™•์ธ ํ•˜๊ฒ ์ง€๋งŒ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž์˜ ํƒœ๋„์— ๋”ฐ๋ผ ์Šคํฌ๋ฆฝํŠธ ๋‚˜ ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜์ง€ ์•Š์•„์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ ํŒ : ์›Œํฌ ํ”Œ๋กœ๋ฅผ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๋„๊ตฌ๋กœ ์ด๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์‚ฌ๋žŒ์ด ์ด๋ฏธ ์—ฌ๊ธฐ์— ์„ค๋ช… ๋œ ๋‚ด์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์ด๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” '์ด์œ '์— ๋Œ€ํ•ด ๋‹ค์‹œ ์ƒ๊ฐํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๋‹น์‹ ์€ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์• ์ดˆ์— ๊ทธ ๊ฒƒ์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์€ ์•„๋งˆ๋„ ๊ทธ๋“ค์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์„ ์ค„ ์ˆ˜์žˆ๋Š” ๋งค์šฐ ๊ฐœ๋ฐฉ์ ์ด์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋‘ ์ œ์ผ ์ข‹๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜๋ฉด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ด๋“  ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋‚ด ์—ฌ์ž ์นœ๊ตฌ ์ œ์™ธ). ๋‚˜๋Š” ๋ชจ๋“  ์šฐ์ฃผ์—์„œ ๊ฐ€์žฅ ํ–‰๋ณตํ•œ ์‚ฌ๋žŒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค :)

์ด ์ œ์•ˆ ๋œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด. onrun์€ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ ์ž ์žฌ์  ์ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ์™€ ๋ฏธ๋ž˜์˜ ์ฆ๊ฑฐ๋ฅผ ์กฐ๊ธˆ ํ™•๋Œ€ํ•˜๋ ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋” ๊ด‘๋ฒ”์œ„ํ•œ 'onevent'์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ดํŽด ๋ด์•ผํ•˜๋ฉฐ ๊ทธ์ค‘ ํ•˜๋‚˜๋Š” onrun์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ดํ•˜์‹ญ์‹œ์˜ค.

services:
    web:
        image: node:8-alpine
        depends_on:
            - db
    db:
        image: postgres:alpine
        onrun: "echo hi"

๊ต์ฐจ ์ด๋ฒคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๊นŒ?

    web:
        events:
            db_onrun: "connectAndMigrate.sh"

์ œ ์ƒ๊ฐ์— ์ด๊ฒƒ์„ docker-compose์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ compose ํŒŒ์ผ ๋ฐ compose ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ท€ํ•˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒ€์˜ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋„ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณ„๋„์˜ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ-๋ชจ๋‘๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ปค์Šคํ…€ Dockerfile ์ž‘์„ฑ-์•ฝ 20 ๊ฐœ์˜ ์„œ๋น„์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์„œ๋น„์Šค์— ๋Œ€ํ•ด Dockerfile์„ ์žฌ์ • ์˜ํ•˜์—ฌ ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ์ธ์ฆ์„œ๋ฅผ ๊ฐ–๋„๋ก ๋ชจ๋“  ํ™˜๊ฒฝ์— mkcert ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ตฌ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์Šคํ…Œ์ด์ง€ / ํ”„๋กœ๋•์…˜์—์„œ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” Dockerfile์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ์ ์ ˆํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด๋ฉฐ compose ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์€ ๋’ค์—์„œ ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์ง€๊ณ  ์žˆ๋Š”์ง€ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ถ”๊ฐ€ :

์›Œ๋“œ ํ”„๋ ˆ์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด docker-compose.yaml์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. docker-compose up โ€“ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ํ”Œ๋Ÿฌ๊ทธ์ธ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํŒŒ์ผ ๊ถŒํ•œ์„ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ... ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ๋œ ํ›„ ๊ถŒํ•œ์„ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ์—์„œ ์ผ๋ถ€ ํŒŒ์ผ์„ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์žˆ๊ณ  ์œ ์ผํ•œ ๋ฐฉ๋ฒ• ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. fs ๊ถŒํ•œ์„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ chown -Rf www-data.www-data /var/www/wp-content ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ž์‹ ์˜ Dockerfile์„ ์ž‘์„ฑํ•˜๊ณ  ๋นŒ๋“œํ•˜์‹ญ์‹œ์˜ค. ์ €์—๊ฒŒ๋Š” ์–ด๋ฆฌ์„์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ ์œ„์— ์ œ๊ณต๋œ healthcheck ํ•ดํ‚น์„ ํ†ตํ•ด์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋„์ปค ๋ณผ๋ฅจ์— ๋Œ€ํ•œ ์„ค์ • ๊ถŒํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์›น์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ์•ˆ ๋œ ์†”๋ฃจ์…˜์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ๊ฒŒ์ดํŠธ ํ‚คํผ @dnephin , @aanand , @ shin-์ด์ด๋ฅผ ์œ„ํ•ด ์—„์ฒญ๋‚œ ์—ด์„ ๋ฐ›๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ํฐ ์†Œ๋ฆฌ๋กœ ๋น„๋ช…์„ ์ง€๋ฅด๊ณ  ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž๋ฆฌ๋ฅผ ์žก๊ณ  ์ž๋ฆฌ๋ฅผ ์žก๊ณ  ๋“ฃ์ง€ ์•Š์„ ๋•Œ ์ •๋ง ํฐ ์†Œ๋ฆฌ๋ฅผ๋ƒ…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์ข‹์•„์š”์˜ ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋‹ตํ•œ 34 ๋ช…์˜ ์‚ฌ์šฉ์ž๋„ ์„ธ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
01) sshishov
02) ํŽ˜์Šค ์ฝ”๋ฐ”
03) sandor11
04) ์›น ๊ธฐ๋ฐ˜
05) v0lume
06) ์›น ํด๋ฆฌ์Šค
07) ์Šค์ปฌ ์˜ค๋„ค
08) usergoodvery
09) ์›ก์ž ํ•˜์šฐ
10) MFQ
11) ์š”์„ธ ํ”„๋กœ
12) ๋ฐฐ๊ฑฐ ๋งจ
13) daqSam
14) ์˜ค ๋ฉ”์ด๋“œ
15) ๋‹จํ…Œ ๋ฐ”๋ฅด๋ฐ”
16) ์œŒ๋ฆฌ ์–‘
17) SharpEdgeMarshall
18) ๋ถ„์‹ค ์บ๋ฆฌ์–ด
19) ์œ ๋ น
20) ๋กœ๋“œ๋ฆฌ๊ณ  ๋กœ๋“œ๋ฆฌ๊ฒŒ์Šค ์ฝ”์Šคํƒ€
21) ๋ฐ์ดํ„ฐ ์œ ํ˜•
22) ๋ฑ์Šค ํ…€๋ธŒ
23) ๋ ˆํฌ ๋‚˜์Šค
24) ๋ฃจ์‹ค ๋ˆ์ 
25) rav84
26) ๋„ํ”„ ๋ฆฌ
27) ์•„๋ฉง ํˆฌ ๋ฏธ๋ฅด
28) montera82
29) Discordianfish
30) jasonrhaas
31) ํŽ˜๋ผ๋ฆฌ ์Šค
32) ํ•˜์ดํผ ๊ธฑ
33) ์–‘์‚ฐ
34) ์Šคํˆด ๋ธŒ

๊ทธ๋ฆฌ๊ณ  ๊ฑฐ์ ˆ ํ•œ ๋ฒˆํ˜ธ๋Š”? ๋ฌด๋ ค 3 :
01) ๋“œ๋„ค ํ•€
02) ์•„๋‚œ๋“œ
03) ์‹ -

์Œ ... 34 ~ 3 ...

@ rm-rf-etc ์ข‹์€ ๋ถ„์„ ... @dnephin ๋˜๋Š” @aanand ๊ฐ€ ๋” ์ด์ƒ docker-compose ์ž‘์—…์„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์ด ์ข‹์œผ๋ฉด Docker๋Š” ์Šคํƒ์„ ์œ„ํ•ด compose๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ณ„ํš์ด๋ฉฐ ์—ฌ๊ธฐ์— ๋ถˆ๋งŒ์„ ์ œ๊ธฐ ํ•  ํŒ€์ด ๋‚จ์•„ ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์ œํ’ˆ์— ๋Œ€ํ•œ ํ–ฅํ›„ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋‹ค์‹œ๋ณด๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ถ”๊ฐ€ :

์›Œ๋“œ ํ”„๋ ˆ์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด docker-compose.yaml์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. docker-compose up โ€“ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ํ”Œ๋Ÿฌ๊ทธ์ธ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํŒŒ์ผ ๊ถŒํ•œ์„ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ... ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ๋œ ํ›„ ๊ถŒํ•œ์„ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ์—์„œ ์ผ๋ถ€ ํŒŒ์ผ์„ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์žˆ๊ณ  ์œ ์ผํ•œ ๋ฐฉ๋ฒ• ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. fs ๊ถŒํ•œ์„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ chown -Rf www-data.www-data /var/www/wp-content ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ Compose ํŒŒ์ผ์—์„œ user ์†์„ฑ ์„

๋‚ด ์ž์‹ ์˜ Dockerfile์„ ์ž‘์„ฑํ•˜๊ณ  ๋นŒ๋“œํ•˜์‹ญ์‹œ์˜ค. ์ €์—๊ฒŒ๋Š” ์–ด๋ฆฌ์„์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ•ํ•œ ์˜๊ฒฌ์„ ๋‚ด๋†“์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์‹ค์ ์œผ๋กœ ํ•„์š”์— ๋งž๊ฒŒ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด Dockerfile์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด "์–ด๋ฆฌ์„์€"๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ชจ๋“  ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์˜ ์›๋ž˜ ์˜๋„์ž…๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ ์œ„์— ์ œ๊ณต๋œ healthcheck ํ•ดํ‚น์„ ํ†ตํ•ด์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋„์ปค ๋ณผ๋ฅจ์— ๋Œ€ํ•œ ์„ค์ • ๊ถŒํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์›น์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ์•ˆ ๋œ ์†”๋ฃจ์…˜์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ๊ฒŒ์ดํŠธ ํ‚คํผ @dnephin , @aanand , @ shin-์ด์ด๋ฅผ ์œ„ํ•ด ์—„์ฒญ๋‚œ ์—ด์„ ๋ฐ›๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜, ์ข‹์€ ํƒœ๋„ ์นœ๊ตฌ. :๋””


@ rm-rf-etc ์ข‹์€ ๋ถ„์„ ... @dnephin ๋˜๋Š” @aanand ๊ฐ€ ๋” ์ด์ƒ docker-compose ์ž‘์—…์„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ด์ œ ๋ช‡ ๋…„์ด ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ณ„์† ํ•‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์šด์ด ์ข‹์œผ๋ฉด Docker๋Š” ์Šคํƒ์„ ์œ„ํ•ด compose๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ณ„ํš์ด๋ฉฐ ์—ฌ๊ธฐ์— ๋ถˆ๋งŒ์„ ์ œ๊ธฐ ํ•  ํŒ€์ด ๋‚จ์•„ ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์ œํ’ˆ์— ๋Œ€ํ•œ ํ–ฅํ›„ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋‹ค์‹œ๋ณด๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ™„

@ shin-ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๊ทธ ์‘๋‹ต์œผ๋กœ ๊ทธ๊ฒƒ์„ ํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ ์—์ด ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ ๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 2.1์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ๊ณ ์œ  ํ•œ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๋Š” ๊ณต์‹ ์ž…์žฅ์ด ๋‚˜์—๊ฒŒ๋Š” ๋†€๋ž์Šต๋‹ˆ๋‹ค.
๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ "์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์—์„œ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ƒˆ ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ MongoDB ๋˜๋Š” MySQL Docker ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ..์˜ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ Dockerfile์„ ๋งŒ๋“ค๊ณ  ๋นŒ๋“œ ํ•œ ๋‹ค์Œ ์ž ์žฌ์ ์œผ๋กœ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ‘ธ์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์ด๋Š” docker-compose.yml์—์„œ image: mongo:3.0.2 ๋ฅผ image: mongo:3.0.3 ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋น„ํ•ด ์—„์ฒญ๋‚œ ์‹œ๊ฐ„๊ณผ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ธด ๋นŒ๋“œ ์‹œ๊ฐ„์— ๋Œ€ํ•ด ์™ธ์น˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž ์žฌ์ ์œผ๋กœ ๊ท ๋“ฑํ•˜์ง€ ์•Š์€ ์„œ๋น„์Šค์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์›ํ•  ๋•Œ Dockerfiles ๋ฐ docker build ๋กœ ๊ท€์ฐฎ๊ฒŒํ•ด์•ผํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ์™ธ์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค๋Š” ์ฃผ์žฅ๋„ ์ •๋ง ์•…์ทจ๊ฐ€๋‚ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ docker ํ†ตํ•ด ๋‹ค๋ฅธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ docker run , docker build , docker exec , docker pull ๋“ฑ์ด ๋ชจ๋‘ ๋™์ผํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๋ถ€์ธ ์ด์œ ์— ๋Œ€ํ•ด์„œ๋„ ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด ์ง€๊ธˆ์€ ์œ„์„ ์ ์œผ๋กœ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@ shin-, ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋งํฌ๋ฅผ ๋”ฐ๋ผ ๊ฐ”๊ณ  ์‚ฌ์šฉ์ž ์†์„ฑ์ด ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์†Œ์œ ์ž๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํฌํŠธ์™€ ๊ด€๋ จ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Re : ํƒœ๋„ : ์‚ฌ๋žŒ๋“ค์ด ์ €์—๊ฒŒ ๋™์˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ๊ฐ•๋ ฅํ•œ ํ”ผ๋“œ๋ฐฑ์œผ๋กœ ๋ฐ›์•„๋“ค์ด์„ธ์š”. ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ๋ฏธ์•ˆํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ๊ฐ€ ๋ฌด์‹œ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•˜์‹ญ๋‹ˆ๊นŒ?

๋‚˜๋Š” onrun๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ธฐ๋Œ€ํ•˜๋ฉฐ ์—ฌ๊ธฐ์— ์™”์Šต๋‹ˆ๋‹ค. compose๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ดํ‹€ ๋ฐ–์— ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜๊ณ  ์ด์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€์ด ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋„์ปค ํŒŒ์ผ๋กœ ๋Œ์•„๊ฐ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ๊ฐ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์€ ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์˜ ํ† ํฐ์„ ์ด์ „์— ๋‚ด dockerfile์ด ์œ ์—ฐํ–ˆ๋˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ฃผ์ž…ํ•˜๊ณ  ์‹ถ์„๋ฟ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ„๋‹จํ•œ ๋ชฉ์ ์„ ์œ„ํ•ด docker-composer.yml ๋ฐ ์†”๋ฃจ์…˜๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์  ์žฅ, ๋‚˜๋Š” "์ข‹์•„, ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ๋ฉ‹์ง€๋‹ค๋Š” ๊ฒƒ์„ ๋งˆ์นจ๋‚ด ๊นจ๋‹ฌ์•˜๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค"๋ผ๋Š” ๋‹ต์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์—ˆ๋‹ค. ์ด๊ฒƒ์ด ์•ž์œผ๋กœ ๋‚˜์•„ ๊ฐ€์ง€ ์•Š์€ ๊ฒƒ์„๋ณด๊ณ  ์Šฌํ”„๋‹ค.
์˜จ๋Ÿฐ์— +1!

@fabiomolinar , ์šฐ๋ฆฌ๊ฐ€ ์ƒ์‚ฐ ๋ฌด๋ฆฌ์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์†”๋ฃจ์…˜์ด ์žˆ์ง€๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๋งŒ ํผ ์ข‹์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์•ต์ปค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

#### configure a service to run only a single instance until success
x-task: &task
  # for docker stack (not supported by compose)
  deploy:
    restart_policy:
      condition: on-failure
    replicas: 1
  # for compose (not supported by stack)
  restart: on-failure

์„ฑ๊ณตํ•  ๋•Œ๊นŒ์ง€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฉฑ๋“ฑ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐ ์„ค์ • ์ž‘์—…์„์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๊ณ  ๋กœ์ปฌ ์ž‘์„ฑ ๋ฐ ์Šคํƒ์—์„œ ์ด์™€ ๊ฐ™์ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์— ์˜์กดํ•˜๋Š” ์„œ๋น„์Šค๋Š” ๊ตฌ์„ฑ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์†Œ ์ •์ƒ์ ์œผ๋กœ ์‹คํŒจํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๊ดœ์ฐฎ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ํ™˜๊ฒฝ์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ตœ์ข… ์ผ๊ด€์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž‘์—… ์™„๋ฃŒ ์ „ํ›„ ์ƒํƒœ ๋ชจ๋‘์—์„œ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ข…์† ์„œ๋น„์Šค๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „ ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ›„ ์Šคํ‚ค๋งˆ ๋ชจ๋‘์—์„œ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ ์กฐ์ •์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ํ•ด์•ผํ•˜์ง€๋งŒ ์ด๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค์˜ ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰.

@fabiomolinar , ๋‹ค์Œ์€ ์ž‘์„ฑ ์„œ๋น„์Šค์—์„œ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค ...

#### configure a service to run only a single instance until success
x-task: &task
  # for docker stack (not supported by compose)
  deploy:
    restart_policy:
      condition: on-failure
    replicas: 1
  # for compose (not supported by stack)
  restart: on-failure

#### configure a service to always restart
x-service: &service
  # for docker stack (not supported by compose)
  deploy:
    restart_policy:
      condition: any
  # for compose (not supported by stack)
  restart: always

services: 
  accounts: &accounts
    <<: *service
    image: internal/django
    ports:
      - "9000"
    networks:
      - service
    environment:
      DATABASE_URL: "postgres://postgres-master:5432/accounts"
      REDIS_URL: "hiredis://redis:6379/"

  accounts-migrate:
    <<: *accounts
    <<: *task
    command: ./manage.py migrate --noinput

@dopry๋ฅผ ์ง€์  ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ ๊ฒฝ์šฐ๋Š” ์ข€ ๋” ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹คํ–‰ ํ•œ ํ›„์—์•ผ ๋ช‡ ๊ฐ€์ง€ ๋ฐฐํฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์ €๋Š” ๋‹จ์ผ CMD ๋ผ์ธ ๋‚ด์—์„œ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๋ฐ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ๊ฐ server ๋ฐ deploy ํ•ด๋ณด์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

CMD set -m; server $ deploy && fg server

์œ„์˜ ์ค„์€ bash์˜ ๋ชจ๋‹ˆํ„ฐ ๋ชจ๋“œ๋ฅผ ์„ค์ • ํ•œ ๋‹ค์Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ server ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•œ ๋‹ค์Œ deploy ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ server ํ”„๋กœ์„ธ์Šค๋ฅผ Docker ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฃฝ์ด๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ํฌ ๊ทธ๋ผ์šด๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๋™์•ˆ ๋ˆ„๊ตฌ๋‚˜ docker-compose up ์‹คํ–‰์‹œ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ํ˜ธ์ŠคํŠธ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฐ์‚ฌ!

@fabiomolinar , ๊ท€ํ•˜๊ฐ€ ์ œ์•ˆํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ช‡ ๊ฐ€์ง€ 12 ์š”์†Œ ์•ฑ ์ฃผ์ฒด๋ฅผ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ์ธํ”„๋ผ๋ฅผ ์ปจํ…Œ์ด๋„ˆํ™”ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ธํ”„๋ผ๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ

  1. ๋Š๋ฆฐ ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘.
  2. ์ปจํ…Œ์ด๋„ˆ๋กœ ์„œ๋น„์Šค๋ฅผ ํ™•์žฅ ํ•  ๋•Œ ๋ฐฐํฌ๋Š” ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์”ฉ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ž ์žฌ์ ์œผ๋กœ ํฅ๋ฏธ๋กœ์šด ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๊ด€๋ฆฌ ๋ฐ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด '์ž‘์—…'๋ฐ ์„œ๋น„์Šค์—์„œ ๋กœ๊ทธ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๋‚ด๊ฐ€ ์ถ”์ฒœํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋ฐ˜ ์ง๊ด€์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. docker-compose, docker swarms ๋ฐ mesos / marathon ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ๋กœ ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ 'onrun'๋ถ€์กฑ์„ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์‹ค์ œ๋กœ ๋งค์šฐ ์ถ”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ž ์‹œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฒ„๊ฐ€ ๊ฐ€๋™๋˜๊ณ  ์‹คํ–‰ ๋œ ํ›„ ์‹œ์ž‘์  ์Šคํฌ๋ฆฝํŠธ์™€ at ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์ด๋ฏธ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‚ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ PID 1๋กœ ์˜ฌ๋ฐ”๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰๋˜๊ณ  ๋ชจ๋“  ์‹ ํ˜ธ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘ํ•œ ํ›„ ์—ฌ๋Ÿฌ Makefile์—์„œ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กค์—…์„ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@ victor-perov๋Š” ๋กค์—… ์ž‘์—…์„์œ„ํ•œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ณ„๋„์˜ ์„œ๋น„์Šค๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ํƒœ์Šคํฌ ์„œ๋น„์Šค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์˜ ์ผ๋ถ€ ์Šค ๋‹ˆํŽซ์ž…๋‹ˆ๋‹ค.

x-task: &task
  # run once deploy policy for tasks
  deploy:
    restart_policy: 
      condition: none
    replicas: 1

service:
  automata-auth-migrate:
    <<: *automata-auth
    <<: *task
    # without the sleep it can't lookup the host postgres.  maybe the command is ran before the network set is complete.
    command: sleep 5 && python /code/manage.py migrate --noinput

์Œ, ์ด๋ฒˆ์ด์ด ๋…ผ์˜๊ฐ€ ํ™•์žฅ ๋œ 4 ๋…„์ฐจ์ž…๋‹ˆ๋‹ค. onrun ๊ฐ€ ํ•„์š”ํ•œ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— +1์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ถ”์‹  : ์ „์ฒด ์‹ค์— ํŒ์ฝ˜์„ ์‚ฌ์•ผ ํ–ˆ์–ด์š”.

๋‚˜๋„ onrun ๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ๊ฒƒ (ํฌ์ŠคํŠธ ๋Ÿฐ?)์ด ํ•„์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ž˜ํผ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ์— docker exec๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ง€ ... ์ถ”ํ•ฉ๋‹ˆ๋‹ค.

IMO docker compose๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์šธ ์ˆ˜ ์žˆ์Œ์„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ™•์‹ ์‹œํ‚ค๋Š” ํ›Œ๋ฅญํ•œ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ MVP์˜€์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ํ”„๋กœ๋•์…˜ ์ค€๋น„ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์†”๋ฃจ์…˜ (์˜ˆ : kubernetes)์ด ํ™•์‚ฐ๋จ์— ๋”ฐ๋ผ "์œ ์ง€ ๊ด€๋ฆฌ ๋ชจ๋“œ"๋กœ ๊ฐ„์ฃผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ข…์†์„ฑ๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ด "์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ€๋™ ๋œ ํ›„์ด ์ž‘์—…์„ ์‹คํ–‰"๊ณผ ๊ฐ™์€ ๋ถ€์žฌ ๊ธฐ๋Šฅ๊ณผ ๊ฒฐํ•ฉ ๋œ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋‹จ์ˆœํžˆ ์ •์ฒด ์ƒํƒœ์— ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ์— ๋ถ€ํ•ฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„์ด ๊ธฐ๋Šฅ์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Dockerfile๋กœ ๋ชจ๋“  ๊ฒƒ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์— ์ž์ฒด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด mysql ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์ ธ ์™€์„œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์‹ญ์‹œ์˜ค.
๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • mysql์˜ Dockerfile ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ง„์ž… ์  ์•ž์— ์ปจํ…Œ์ด๋„ˆ์— ์ž์ฒด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค CMD ์— Dockerfile ๊ฐ€์— ์ธ์ˆ˜ ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ENTRYPOINT .
  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ ํ•œ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [ docker cp , docker exec ].

๊ทธ๋ž˜์„œ Dockerfile์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— onrun ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋คํ”„, ์™œ ์ด๊ฒƒ์ด ๋‹ซํ˜€ ์žˆ์Šต๋‹ˆ๊นŒ? Cassandra์™€ ๊ฐ™์€ ๊ณต์‹ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹œ์ž‘๋œ ํ›„ ์Šคํ‚ค๋งˆ๋ฅผ๋กœ๋“œํ•ด์•ผ ํ•  ๋•Œ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.์ด๋ฅผ ์œ„ํ•ด ์ž์ฒด bash ์Šคํฌ๋ฆฝํŠธ ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@somebi ๋Š” compose๊ฐ€ ๋‹ซํžŒ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...

2 ์„ผํŠธ ๋งŒ : ํ˜„์žฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค Apache ๋ชจ๋“ˆ์„ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์™”์Šต๋‹ˆ๋‹ค (SSL์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Docker Hub wordpress ์ด๋ฏธ์ง€์—์„œ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์Œ). ์„ธ์ƒ์˜ ๋์€ ์•„๋‹ˆ์ง€๋งŒ, ์˜ฌ๋ผ๊ฐˆ ๋•Œ๋งˆ๋‹ค ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•ํƒ€ํ•˜์ง€ ์•Š๊ณ ๋„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ์œ„์•„๋ž˜๋กœ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2 ์„ผํŠธ ๋งŒ : ํ˜„์žฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค Apache ๋ชจ๋“ˆ์„ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์™”์Šต๋‹ˆ๋‹ค (SSL์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Docker Hub wordpress ์ด๋ฏธ์ง€์—์„œ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์Œ). ์„ธ์ƒ์˜ ๋์€ ์•„๋‹ˆ์ง€๋งŒ, ์˜ฌ๋ผ๊ฐˆ ๋•Œ๋งˆ๋‹ค ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•ํƒ€ํ•˜์ง€ ์•Š๊ณ ๋„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ์œ„์•„๋ž˜๋กœ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๋ชจ๋“ˆ์ด ํ™œ์„ฑํ™” ๋œ wordpress ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋ฉด์ด ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋Œ€์‹  Dockerfile์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

FROM wordpress:php7.1
RUN a2enmod ssl

๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ ์›Œ๋“œ ํ”„๋ ˆ์Šค Dockerfile์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๊ทธ ์•ˆ์— ๋ชจ๋“ˆ ํ™œ์„ฑํ™”๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Docker ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๊ฒƒ์€ PHP 7.1์„ ์‚ฌ์šฉํ•˜๋Š” wordpress 5.2 ์šฉ Dockerfile์ž…๋‹ˆ๋‹ค.

์›Œ๋“œ ํ”„๋ ˆ์Šค ๋„์ปค ํŒŒ์ผ

63 ํ–‰์—์„œ ๋” ๋งŽ์€ ๋ชจ๋“ˆ์„ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ssl ์ƒ์„ฑ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋…ผ์˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์‹œ์ž‘๋  ๋•Œ์™€ ๊ฐ™์ด ์ปจํ…Œ์ด๋„ˆ ์ˆ˜๋ช…์ฃผ๊ธฐ์—์„œ ๋™์  ํ›„ํฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ docker-compose์— ์ข‹์€ ์ถ”๊ฐ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์ด ์Šค๋ ˆ๋“œ์—์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ต๋ณ€์€ Kubernetes๊ฐ€ Docker (๊ธฐ์ˆ )๊ฐ€ ์ƒ์‚ฐํ•˜๋Š” "๋ชจ๋“ " ๋ˆ์„ ์œ ์ง€ํ•˜๋Š” ์ด์œ ์ด๋ฉฐ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณง Docker (ํšŒ์‚ฌ)๋ฅผ ๊ตฌ๋งคํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ ์ œ์•ˆ / ์š”์ฒญ์„ ํ™˜์˜ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. / ๋ถ„์„ ๋จ ...

์ด ์Šค๋ ˆ๋“œ์—์žˆ๋Š” ๋‹ต๋ณ€๊ณผ ๊ฐ™์€ ๋‹ต๋ณ€์€ Kubernetes๊ฐ€ Docker (๊ธฐ์ˆ )๊ฐ€ ์ƒ์‚ฐํ•˜๋Š” _ "๋ชจ๋“ "_์„ ์œ ์ง€ํ•˜๋Š” ์ด์œ ์ด๋ฉฐ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณง Docker (ํšŒ์‚ฌ)๋ฅผ ๊ตฌ๋งคํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ ์ œ์•ˆ / ์š”์ฒญ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ™˜์˜ / ๋ถ„์„ ...

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

์ด๊ฒƒ์€ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ค๋งŒํ•œ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ ๋’ค์— ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ 4 ๋…„ ๋™์•ˆ ๋ฌด์–ธ๊ฐ€๋ฅผ ์š”๊ตฌํ•˜๊ณ  ๋‹น์‹  (Docker)์ด ๋ˆˆ์„ ๊ฐ ์œผ๋ฉด ๋‹น์‹ ์ด ๊ทธ๋“ค๊ณผ ๊ฐ™์€ ๋ฐฉํ–ฅ์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๋„์ปค๋Š” ํฌ๊ธฐํ•˜๊ณ  ๋งค์ง„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋“ค์€๋“ค์„ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ... ๊ทธ๋“ค์€์กŒ์Šต๋‹ˆ๋‹ค.

์ˆ˜์น˜์‹ฌ-ํ•˜์ง€๋งŒ ํ—ค์ด ํ˜ธ.

์ด๋Ÿฐ ๊ฒƒ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์ •๋ง ๋ถ€๋„๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ํ™•์ธ์ด ์‹คํŒจ ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” onFailure ํ›„ํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰

services:
  app:
    image: myapp:latest
    hooks:
      onFailure:
        - # Call a monitoring service (from the host machine) to tell it that the service is offline.

์ด๊ฒƒ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์†Œ์ผ“ / ํฌํŠธ์— ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฟ  ๋ฒ„๋„ค ํ‹ฐ์Šค๋Š” ์•„๋งˆ๋„ ๊ฐˆ ๊ธธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋งค์šฐ ์ž‘์€ ํ™˜๊ฒฝ์—์„œ ์ƒ๋‹นํžˆ ํฐ ์ธํ”„๋ผ ๋ณ€๊ฒฝ์ด๋ฉฐ ๊ณผ์ž‰์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ์„ "๋ž˜ํ•‘"ํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ์˜ ์ง„์ž… ์ ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰

# /app/bin/run_with_monitor
#!/bin/bash
set -eE

updateMonitoringSystem() {
 # do something here... This is run from the container, though, unfortunately.
 if [[ $? -eq 1 ]]; then
  # Failed!
 else
  # All is good!
 fi
}

trap 'updateMonitoringSystem' EXIT

$@
# Dockerfile
....
CMD ["/app/bin/run_with_monitor", "./my-app"

๊ทธ๋ž˜๋„ ์ด๋ฏธ์ง€๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”์—†์ด์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

: man_shrugging : ๊ฒฝ์Ÿ์ž (Kubernetes)๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š”์ด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์ฐพ๊ณ  ๋Œ€์‹  ์“ฐ๋ ˆ๊ธฐํ†ต ํ™”์žฌ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ •๋ง ๋ถ€๋„๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ƒˆํ•ด ๋ณต ๋งŽ์ด ๋ฐ›์œผ์„ธ์š” : roll_eyes :

image

@LukeStonehm๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„ธ์›Œ์ง„ ํ›„ ํ•˜๋‚˜์˜ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜์ง€๋งŒ ๋Œ€์‹  ๋œจ๊ฑฐ์šด ์“ฐ๋ ˆ๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ์ด๋ฏธ์ง€๊ฐ€ 90 % ์ด์ƒ์„ ๊ฐ€์ ธ ์˜ค๋ฉด ๋‚ด ์ด๋ฏธ์ง€์™€ ๋„์ปค ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒ๋‹น๋Ÿ‰์˜ ํ”„๋กœ๊ทธ๋žจ์€ ์‹œ์ž‘์‹œ ํŠน์ • ์„œ๋น„์Šค์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด MySQL ๋˜๋Š” MongoDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ docker-compose ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • Dockerfiles ์ž‘์„ฑ ๋ฐฉ๋ฒ• ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฐ์šฐ๊ธฐ
  • Docker images ๋นŒ๋“œ ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ
  • ์›๋ณธ ์ด๋ฏธ์ง€์—์„œ ์ƒ์† ๋œ Dockerfiles ๋ฅผ ๋งŒ๋“ค๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„œ๋กœ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์˜ ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ํ™•์ธ
  • Dockerfiles ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋ฅผ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ์ •๊ธฐ์ ์œผ๋กœ ๊ตฌ์ถ• Docker images ๊ฒƒ๊ณผ Dockerfiles

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์งœ์ฆ๋‚ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„์žˆ๋Š” ๊ฒƒ์„ ๋ฐฐ์šฐ๋Š” ๋ฐ ๋ง‰๋Œ€ํ•œ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž์‹ ์ด Docker images ๋งŒ๋“ค๊ณ  ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์—…๋กœ๋“œ / ๋‹ค์šด๋กœ๋“œ (ํ’€๋ง / ํ‘ธ์‹œ)ํ•˜๋Š” ๋ฐ ์ •๊ธฐ์ ์œผ๋กœ ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • Dockerfiles , ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ์ˆ˜์ • ๋“ฑ์— ์ •๊ธฐ์ ์œผ๋กœ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌด์—‡์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ž ์žฌ์ ์œผ๋กœ ์ด๋ฏธ์ง€์˜ ๋ณด์•ˆ์„ ์†์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต์‹์ ์œผ๋กœ ํ™•์ธ / ์„œ๋ช… ๋œ Docker images ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์žƒ์Šต๋‹ˆ๋‹ค.

์Šคํƒ€ํŠธ ์—… ํ™•์ธ์ด ์žˆ์—ˆ๋‹ค๋ฉด์ด ๋ชจ๋“  ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๊ณ  ๋๋‚ผ ๋•Œ๋งˆ๋‹ค image: mysql:8.0.18 ๋ฅผ image: mysql:8.0.19 ๊ฐ„๋‹จํžˆ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

ํ˜„์‹ค์ ์œผ๋กœ ์ด๊ฒƒ์€ ํ˜„์žฌ ํ˜„์‹ค ์„ธ๊ณ„์—์„œ ์ผ์–ด๋‚˜๊ณ ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

  • ์‚ฌ๋žŒ๋“ค์€ docker-compose ์ž‘์—… ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž์‹  ๋งŒ์˜ Dockerfiles ๋งŒ๋“ค์–ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋“ค์€ ํ•œ ๋ฒˆ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ •๊ธฐ์ ์œผ๋กœ ํŒจ์น˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค
  • ํ•ด์ปค๋Š” ํ–‰๋ณตํ•ด

๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ docker-compose ์ด ์ด๋ฏธ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— "ํ•œ๊ฐ€์ง€ ์ผ์„ํ•ด์•ผํ•œ๋‹ค"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. depends_on ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๋ฏธ์ง€ ๊ฐ€์ ธ ์˜ค๊ธฐ ๋ฐ ๋นŒ๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ docker ์ž…๋‹ˆ๋‹ค.

@ binman-docker @crosbymichael @dmcgowan @ebriney @ehazlett @eunomie @guillaumerose @jeanlaurent @justincormack @lorenrh @manishtomar @olegburov @routelastresort @spencerhcheng @StefanScherer @thaJeztah @tonistiigi @ulyssessouza @aiordache @ chris-crone @aiordache
์ด ๊ธฐ๋Šฅ์„ ์žฌ๊ณ ํ•˜๊ฑฐ๋‚˜ ์ ์–ด๋„ ์ด์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ๋…ผ์˜๋ฅผํ•ฉ์‹œ๋‹ค.

task service ๊ธฐ์ˆ ์€์ด ์‹œ์ ์—์„œ ์ €์—๊ฒŒ ๊ฝค ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ํŠน์ดํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด compose ํŒŒ์ผ์— ํŒจํ„ด์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„ฑ๊ณต์ ์ธ ์ƒํƒœ ํ™•์ธ ๋˜๋Š” ์„ฑ๊ณต์ ์ธ ์ข…๋ฃŒ / ์ž‘์—… ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๋” ๋‚˜์€ 'depends_on'์ด ๋งŽ์€ ์ž‘์—…์„ ๋” ์‰ฝ๊ณ  ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Kubernetes๊ฐ€ postStart ์ˆ˜๋ช…์ฃผ๊ธฐ๋ฅผ ํ†ตํ•ด์ด ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

k8s! = ๋„์ปค ์ž‘์„ฑ. ์ž˜๋ชป๋œ ์ฑ„๋„

๋ช…ํ™•ํ•˜์ง€ ์•Š์•„์„œ ๋ฏธ์•ˆํ•˜์ง€๋งŒ ๋‚ด ์š”์ ์€ Kubernetes๊ฐ€ ์ด๊ฒƒ์„ ์ง€์›ํ•˜๊ณ  Kubernetes์™€ Docker compose๊ฐ€ ๋™์ผํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ / ๋ชฉ์ ์„ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์„ฑ์— ๋Œ€ํ•œ ๋…ผ์Ÿ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž˜ ๋ชจ๋ฅด๊ฒ  ์œผ๋ฉด ๋ฏธ์•ˆ ํ•ด์š”.

์ข‹์€ ์†Œ์‹!!

๋‚˜๋Š” docker๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ๋“ค์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์ด ๋ฌธ์ œ์™€ ๋‹ค๋ฅธ ๋ช‡ ๊ฐ€์ง€). https://www.docker.com/blog/announcing-the-compose-specification/

์ปค๋ฎค๋‹ˆํ‹ฐ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์–‘์— ๋Œ€ํ•ด ์ž‘์—… ํ•ด ๋ด…์‹œ๋‹ค. ์ด๋ฒˆ ์žฌ๊ฐœ๋ฅผ ํ†ตํ•ด์ด ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๊ฐœ๋ฐฉ์ ์ด๊ณ  ์นœ๊ทผํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์†Œ์‹!!

๋‚˜๋Š” docker๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ๋“ค์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์ด ๋ฌธ์ œ์™€ ๋‹ค๋ฅธ ๋ช‡ ๊ฐ€์ง€). https://www.docker.com/blog/announcing-the-compose-specification/

์ปค๋ฎค๋‹ˆํ‹ฐ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์–‘์— ๋Œ€ํ•ด ์ž‘์—… ํ•ด ๋ด…์‹œ๋‹ค. ์ด๋ฒˆ ์žฌ๊ฐœ๋ฅผ ํ†ตํ•ด์ด ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๊ฐœ๋ฐฉ์ ์ด๊ณ  ์นœ๊ทผํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์•ˆํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฉ”์ผ ๋ง๋ฆฌ์ŠคํŠธ๋Š” ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ฐจ์„ ์ฑ…์ด ์—ฌ๊ธฐ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค : https://github.com/compose-spec/compose-spec

์ด ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ณด์ด์ง€ ์•Š์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ ์žฅ์†Œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : https://github.com/compose-spec/compose-spec/issues/84 ์—์„œ ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค

HEALTHCHECK ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ์˜ˆ์ œ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•”ํ˜ธ

Dockerfile

FROM ubuntu

COPY healthcheck.sh /healthcheck.sh
RUN chmod a+x /healthcheck.sh

HEALTHCHECK --interval=5s CMD /healthcheck.sh

CMD bash -c 'set -x; set +e; while true; do cat /test.txt; sleep 3; done'

healthcheck.sh

#/usr/bin/env bash

set -e

FIRST_READY_STATUS_FLAG='/tmp/.FIRST_READY_STATUS_FLAG'

# Health check

echo 'Run command to validate the container status HERE'

# On success
if [ ! -f "${FIRST_READY_STATUS_FLAG}" ]; then
  # On first success...
  touch "${FIRST_READY_STATUS_FLAG}"

  # Run ON_RUN on first health check ok
  if [ ! -z "${DOCKER_ON_RUN}" ]; then
    eval "${DOCKER_ON_RUN}"
  fi
fi
  1. _health check_๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

    • ์‹คํŒจํ•˜๋ฉด ์ข…๋ฃŒ ์ฝ”๋“œ 1 ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

    • _health check_๊ฐ€ ์ •์ƒ์ด๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

  2. ์ฒซ ๋ฒˆ์งธ _health check OK_์ด๊ณ  DOCKER_ON_RUN ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ

docker-compose.yml

version: "3.7"

services:
  test:
    build:
      context: .
    image: test/on-run
    environment:
      DOCKER_ON_RUN: echo x >> /test.txt

DOCKER_ON_RUN ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ํ›„ ์‹คํ–‰ํ•  ์‚ฌ์šฉ์ž ์ง€์ • ๋ช…๋ น์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ

docker-compose build
docker-compose up

์‚ฐ์ถœ:

Creating network "tmp_default" with the default driver
Creating tmp_test_1 ... done
Attaching to tmp_test_1
test_1  | + set +e
test_1  | + true
test_1  | + cat /test.txt
test_1  | cat: /test.txt: No such file or directory
test_1  | + sleep 3
test_1  | + true
test_1  | + cat /test.txt
test_1  | cat: /test.txt: No such file or directory
test_1  | + sleep 3
test_1  | + true
test_1  | + cat /test.txt
test_1  | x
test_1  | + sleep 3
test_1  | + true
test_1  | + cat /test.txt
test_1  | x
test_1  | + sleep 3
test_1  | + true
test_1  | + cat /test.txt
test_1  | x
test_1  | + sleep 3
  • _health check_๊ฐ€ ์ค€๋น„ ๋  ๋•Œ๊นŒ์ง€ cat: /test.txt: No such file or directory ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ํ›„ /test.txt ๋‚ด๋ถ€์—์„œ x ํ•˜๋‚˜๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํŽธ์ง‘ 1

_health check_๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‚˜๋จธ์ง€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋“ฑ๊ณผ ๊ฐ™์ด ๋ช…๋ น 1์„ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ touch "${FIRST_READY_STATUS_FLAG}" ๋Œ€ํ•œ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜ ์ค‘ ์ƒ๋‹น์ˆ˜๋Š”์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์œ ํšจํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ง„์ž… ์  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด ๋‹ค์Œ์„ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
ENTRYPOINT ["./entrypoint.sh"]

์‹ค์ œ ์„œ๋น„์Šค ๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋” ๋ณต์žกํ•œ ๋…ผ๋ฆฌ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
์ปจํ…Œ์ด๋„ˆ ๋ผ์ดํ”„ ์‚ฌ์ดํด์— ๋กœ์ง์„ ์‚ฝ์ž… ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํ›„ํฌ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

  • ๋งŒ๋“ค๊ธฐ ์ „์—
  • ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—
  • ์‹œ์ž‘ ํ›„
  • ํŒŒ๊ดดํ•˜๊ธฐ ์ „์—
  • ํŒŒ๊ดด ํ›„์—๋„
  • ๋“ฑ ...

์œ„์˜ ๋ชจ๋“  ๊ฒƒ์ด ์˜๋ฏธ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ํฌ์ธํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ง„์„ ์ฐ์—ˆ ์œผ๋ฉดํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ง€์‹œ๋ฌธ๊ณผ ํ•จ๊ป˜ docker-compose ํฌํ•จ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

lifecycle:
    before_start: "./beforeStartHook.sh"
    after_destroy: "./afterDestroyHook.sh"

๋˜๋Š” ์‹ฌ์ง€์–ด ๊ทธ๋ ‡๊ฒŒ :

hooks:
    before_destroy: "./beforeDestroyHook.sh"
    before_create: "./fixFsRights.sh"

๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›„ํฌ ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ ์Šคํฌ๋ฆฝํŠธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจํŠธ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ํŒŒ์ผ์„ ๋ฎ์–ด ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์™€, ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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