์ถ์ฒ์ ๋ด์ฉ์ ํ๊ธ๋ก ๋ฒ์ญํ์์ต๋๋ค.
์ถ์ฒ : https://stackoverflow.com/questions/32163955/how-to-run-shell-script-on-host-from-docker-container
๋์ปค ์ปจํ ์ด๋์์ ํธ์คํธ์ ์๋ ๋ช ๋ น์ด๋ฅผ ํธ์คํธ๊ฐ ์ง์ ์คํํ๊ฒ ํ๊ณ ์ถ๋ค.
๋ค์๋ ํ์ดํ(Named Pipe, ๋ช ๋ช ๋ ํ์ดํ)๋ฅผ ์ด์ฉํ์ฌ ์ปจํ ์ด๋์ ํธ์คํธ ๊ฐ ํต์ ์ ํ์ฌ ๊ตฌํํ ๊ฒ์ด๋ค.
ํ์ดํ๋ ํ๋ก์ธ์ค๊ฐ ํต์ ์ ํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค.
- ๋ฆฌ๋ ์ค ํ์ดํ ๊ด๋ จ ์๋ฃ ์ฐธ๊ณ
ํธ์คํธ์์, named pipe๋ฅผ ์ํ๋ ์์น์ ์๋ ๋ช ๋ น์ด๋ก ์์ฑํ๋ค.
mkfifo /path/to/pipe/mypipe
Type์ด p์ธ ํ์ผ์ด ์์ฑ๋๋ค.
ls -l /path/to/pipe/mypipe
prw-r--r-- 1 root root 0 5์ 18 15:08 /path/to/pipe/mypipe
ํฐ๋ฏธ๋์ 2๊ฐ ์ด์ด์, ํ์ดํ๋ก ๋ฉ์์ง๋ฅผ ์์ /์ก์ ํด๋ณด์.
ํฐ๋ฏธ๋ 1์์ ํ์ดํ์์ ๋ฉ์์ง๋ฅผ ์์ ํ๋๋ก ํ๋ค.
# ํฐ๋ฏธ๋ 1
tail -f /path/to/pipe/mypipe
ํฐ๋ฏธ๋ 2์์ ํ์ดํ๋ก ๋ฉ์์ง๋ฅผ ์ก์ ํ๋ค.
# ํฐ๋ฏธ๋ 2
echo "hello world!" > /path/to/pipe/mypipe
ํฐ๋ฏธ๋ 1์์ "hello world!" ๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๋์ง ํ์ธํ๋ค.
Ctrl + C
๋ฅผ ์
๋ ฅํ์ฌ ๋น ์ ธ๋์ฌ ์ ์๋ค.
ํฐ๋ฏธ๋ 1์์ tail -f
๋์ ์๋ ๋ช
๋ น์ด๋ก ํ์ดํ์์ ์ฝ์ ๋ฉ์์ง๋ฅผ ์ํํ๋๋ก ํ๋ค.
# ํฐ๋ฏธ๋ 1
eval "$(cat /path/to/pipe/mypipe)"
ํฐ๋ฏธ๋ 2์์ ls -l
๋ช
๋ น์ด๋ฅผ ํ์ดํ๋ก ์ก์ ํ๋ค.
# ํฐ๋ฏธ๋ 2
echo "ls -l" > /path/to/pipe/mypipe
ํฐ๋ฏธ๋ 1์์ ls -l
๋ช
๋ น์ด์ ์ํ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋์ง ํ์ธํ๋ค.
2๋ฒ ๋ฐฉ๋ฒ์์ ํ๋์ ๋ช ๋ น์ด๋ฅผ ์์ ํ ๋ค ๋ฉ์ถ๊ธฐ ๋๋ฌธ์, ์๋ ๋ช ๋ น์ด๋ก ๊ณ์ ์์ ํ๊ฒ ํ๋ค.
# ํฐ๋ฏธ๋ 1
while true; do eval "$(cat /path/to/pipe/mypipe)"; done
์ด์ ํฐ๋ฏธ๋ 2์์ ํ์ดํ๋ก ์ฌ๋ฌ ๋ฒ ๋ช ๋ น์ด๋ฅผ ์ก์ ํด๋ ์ฒ์ ์์ ํ ๋ฉ์ถ์ง ์๊ณ ๊ณ์ํด์ ๋ช ๋ น์ด๋ฅผ ์์ ๋ฐ๋ ๊ฒ์ ํ์ธํ๋ค.
Ctrl + C
๋ฅผ ์
๋ ฅํ์ฌ ๋น ์ ธ๋์ฌ ์ ์๋ค.
์๋ ๋ด์ฉ์ ์คํฌ๋ฆฝํธ๋ก ์์ฑํ๋ค.
#!/bin/bash
while true; do eval "$(cat /path/to/pipe/mypipe)"; done
๋ง์ฝ ํ์ดํ๋ก ์ ์ก๋ ๋ฉ์์ง ์ํํ ๊ธฐ๋ก์ ํ์ผ๋ก ๋จ๊ธฐ๊ณ ์ถ๋ค๋ฉด ์๋ ๋ด์ฉ์ผ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค.
#!/bin/bash
while true; do eval "$(cat /path/to/pipe/mypipe)" &> /somepath/output.txt; done
# /somepath/output.txt ํ์ผ์ ๊ธฐ๋ก์ด ๋จ๋๋ค.
# &>> ๋ก ๋ณ๊ฒฝํ๋ฉด ๋ฎ์ด์ฐ์ง ์๊ณ ๋ค์ ๋ถ์ฌ์ด๋ค.
์์ฑํ ์คํฌ๋ฆฝํธ๋ฅผ chmod +x
๋ก ์คํ๊ถํ์ ์ค๋ค.
๊ทธ๋ฆฌ๊ณ crontab์ reboot ์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋๋ก ์ถ๊ฐํ๋ค.
crontab -e
# ์๋ ๋ด์ฉ์ ์ถ๊ฐ
@reboot /path/to/pipe/exec_pipe.sh
dockerfile ๋๋ ์ปจํ ์ด๋๋ฅผ ์คํํ ๋, ์์ฑํ ํ์ดํ ํ์ผ์ ๋ง์ดํธํ๋๋ก volumn์ ์ค์ ํ๋ค.
ํธ์คํธ์ /path/to/pipe
๋๋ ํ ๋ฆฌ๋ฅผ ์ปจํ
์ด๋์ /hostpipe
๋๋ ํ ๋ฆฌ์ ๋ง์ดํธํ๋ค.
# dockerfile ์์ ์ค์
volumes:
- /path/to/pipe:/hostpipe
# ์ปจํ
์ด๋ ์คํ ์ ์ค์
docker run test -d --name <container> -v /path/to/pipe:/hostpipe ubuntu:20.04 bash
์ปจํ ์ด๋์ ์ ์ํด์ ํ์ดํ์ ๋ช ๋ น์ด๋ฅผ ์ก์ ํด๋ณด์.
์ปจํ ์ด๋์ ์ ์ํ๋ค.
docker exec -it <container> bash
์ปจํ ์ด๋์ ํธ์คํธ์ ํ์ดํ๊ฐ ๋ง์ดํธ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
cd /hostpipe && ls -l
์ปจํ ์ด๋์์ ํ์ดํ๋ก ๋ช ๋ น์ด๋ฅผ ์ก์ ํ๋ค.
echo "touch this_file_was_created_on_main_host_from_a_container.txt" > /hostpipe/mypipe
ํ์ดํ๋ฅผ ํตํด this_file_was_created_on_main_host_from_a_container.txt
ํ์ผ์ด ํธ์คํธ์ ์์ฑ๋์์์ ํ์ธํด๋ณด์.
๋ฆฌ๋ ์ค host, ๋ฆฌ๋ ์ค container์์ ์ ์ ์๋ํ๋ค.
macOS ๋๋ Windows ๊ธฐ๋ฐ์ ์์คํ ์์๋ ์ ์ ์๋ํ์ง ์์ ์ ์๋ค.