Dockerfile
Docker Format
# Comment
INSTRUCTION arguments
๋ช ๋ น์ด๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ด๋ก๋ ์ธ์์ ๋ ์ฝ๊ฒ ๊ตฌ๋ณํ๊ธฐ ์ํด ๋๋ฌธ์๋ก ์ง์ ํ๋ ๊ฒ์ ๋๋ค.
Dockerfile๋ ๋ฌด์กฐ๊ฑด
FROM
๋ช ๋ น์ด๋ก ์์ํด์ผ ํ๋ค.์ด๊ฒ์
parser
directives
,comments
, ์ ์ ์ญARGs
๋ค์ ์์ ์ ์๋ค.FROM
๋ช ๋ น์ด๋ ๋น๋ฉํ๋ ค๊ณ ํ๋Parent Image
๋ฅผ ์ง์ ํ๋คFROM
์์๋ Dockerfile ์ FROM ํ์ ์ฌ์ฉํ๋ ์ธ์๋ฅผ ์ ์ธํ๋ ํ๋ ์ด์์ARG
๋ช ๋ น์ด๋ง ์ฌ ์ ์๋ค.Docker๋
#
์ผ๋ก ์์ํ๋ ์ค์ดParser directives
์ด ์๋๋ฉด์ฃผ์
์ผ๋ก ์ฒ๋ฆฌํ๋ค.
# Comment
RUN echo 'we are running some # of cool things'
Parser directives
Parser directives
์ ์ ํ ์ฌํญ์ด๋ฉฐ Dockerfile์ ํ์ ๋ผ์ธ์ด ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ์ํฅ์ ์ค๋ค.
Parser directives
์ # directive=value
ํ์์ ํน์ ์ ํ์ ์ฃผ์์ผ๋ก ์์ฑ๋ฉ๋๋ค. ๋จ์ผ ์ง์๋ฌธ์ ํ ๋ฒ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฃผ์, ๋น ์ค ๋๋ ๋น๋ ๋ช
๋ น์ด ์ฒ๋ฆฌ๋๋ฉด Docker๋ ๋ ์ด์ Parser directives
์ ์ฐพ์ง ์์ต๋๋ค.๋ฐ๋ผ์ ๋ชจ๋ ํ์ ์ง์๋ฌธ์ Dockerfile
์ ๋งจ ์์ ์์ด์ผ ํฉ๋๋ค.
Invalid due to appearing twice:
# directive=value1
# directive=value2
FROM ImageName
Parser directives
์ด ์๋ ์ฃผ์ ๋ค์ ์์ผ๋ฉด ์ฃผ์์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
Parser directives
์ด ์๋ ์ฃผ์ ๋ค์ ์์ผ๋ฉด ์ฃผ์์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.# About my dockerfile
# directive=value
FROM ImageName
The following parser directives are supported:
syntax
์ด ๊ธฐ๋ฅ์ BuildKit ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ ๋๋ง ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํด๋์ ๋น๋ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฌด์๋ฉ๋๋ค.
BuildKit์ ๋ ๊ฑฐ์ ๋น๋๋ฅผ ๋์ฒดํ๊ธฐ ์ํด ๊ฐ์ ๋ ๋ฐฑ์๋์ ๋๋ค. BuildKit์ ๋ฒ์ 23.0๋ถํฐ Docker Desktop ๋ฐ Docker Engine ์ฌ์ฉ์๋ฅผ ์ํ ๊ธฐ๋ณธ ๋น๋์ ๋๋ค.
escape
# escape=\ (backslash)
# escape=` (backtick)
escape
์ง์๋ฌธ์ Dockerfile์์ ๋ฌธ์๋ฅผ escape
ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฌธ์๋ฅผ ์ค์ ํฉ๋๋ค. ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ์ด์ค์ผ์ดํ ๋ฌธ์๋ \์
๋๋ค.
Environment replacement
ํ๊ฒฝ ๋ณ์(ENV
๋ฌธ์ผ๋ก ์ ์ธ๋จ)๋ ํน์ ๋ช
๋ น์์ Dockerfile
์์ ๋ณ์๋ก ์ฌ์ฉ๋ ์๋ ์์ต๋๋ค.
ํ๊ฒฝ ๋ณ์๋ Dockerfile
์์ $variable_name
๋๋ ${variable_name}
์ผ๋ก ํ์๋ฉ๋๋ค.
${variable_name}
syntax์ ์๋์ ์ง์ ๋ ๋ช ๊ฐ์ง ํ์ค bash ์์ ์๋ ์ง์ํฉ๋๋ค.
${variable_name}
syntax์ ์๋์ ์ง์ ๋ ๋ช ๊ฐ์ง ํ์ค bash ์์ ์๋ ์ง์ํฉ๋๋ค.${variable:-word}
๋ ๋ณ์๊ฐ ์ค์ ๋๋ฉด ๊ฒฐ๊ณผ๊ฐ ํด๋น ๊ฐ์ด ๋จ์ ๋ํ๋ ๋๋ค. ๋ณ์๊ฐ ์ค์ ๋์ง ์์ผ๋ฉด ๋จ์ด๊ฐ ๊ฒฐ๊ณผ๊ฐ ๋ฉ๋๋ค.${variable:+word}
๋ ๋ณ์๊ฐ ์ค์ ๋๋ฉด ๋จ์ด๊ฐ ๊ฒฐ๊ณผ๊ฐ ๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฒฐ๊ณผ๋ ๋น ๋ฌธ์์ด์์ ๋ํ๋ ๋๋ค
ํ๊ฒฝ ๋ณ์๋ Dockerfile์ ๋ค์ ์ง์๋ฌธ ๋ชฉ๋ก์์ ์ง์ํ๋ค
ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
ONBUILD
(when combined with one of the supported instructions above)
.dockerignore
docker CLI๋ ์ปจํ ์คํธ๋ฅผ docker ๋ฐ๋ชฌ์ผ๋ก ๋ณด๋ด๊ธฐ ์ ์ ์ปจํ ์คํธ์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ์์ .dockerignore๋ผ๋ ํ์ผ์ ์ฐพ์ต๋๋ค.
FROM
FROM [--platform=<platform>] <image> [AS <name>]
Or
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
Or
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
FROM ๋ช ๋ น์ด๋ ์ ๋น๋ ๋จ๊ณ๋ฅผ ์ด๊ธฐํํ๊ณ ํ์ ๋ช ๋ น์ด์ ๋ํ ๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ฅผ ์ค์ ํฉ๋๋ค.
optional --platform
ํ๋๊ทธ๋ FROM์ด ๋ค์ค ํ๋ซํผ ์ด๋ฏธ์ง๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ์ด๋ฏธ์ง์ ํ๋ซํผ์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์: linux/amd64
, linux/arm64
๋๋ windows/amd64
RUN
RUN์ 2๊ฐ์ง ํํ
RUN <command>
(shell
form, the command is run in a shell, which by default is/bin/sh -c
on Linux orcmd /S /C
on Windows)
RUN /bin/bash -c 'source $HOME/.bashrc && \
echo $HOME'
RUN ["executable", "param1", "param2"]
(exec form)
RUN /bin/bash -c 'source $HOME/.bashrc && echo $HOME'
RUN --mount
RUN --mount
๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ฐ ์ก์ธ์คํ ์ ์๋ ํ์ผ ์์คํ
๋ง์ดํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํธ์คํธ ํ์ผ ์์คํ ๋๋ ๊ธฐํ ๋น๋ ๋จ๊ณ์ ๋ฐ์ธ๋ ๋ง์ดํธ ์์ฑ
๋น๋ ๋น๋ฐ ๋๋ ssh-agent ์์ผ์ ์ก์ธ์ค
์๊ตฌ ํจํค์ง ๊ด๋ฆฌ ์บ์๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ ์๋ ํฅ์
Mount types
bind
(default)
๋ฐ์ธ๋ ๋ง์ดํธ ์ปจํ ์คํธ ๋๋ ํ ๋ฆฌ(์ฝ๊ธฐ ์ ์ฉ)
cache
์ปดํ์ผ๋ฌ ๋ฐ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ํ ์บ์ ๋๋ ํฐ๋ฆฌ์ ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง์ดํธํฉ๋๋ค.
secret
๋น๋ ์ปจํ ์ด๋๊ฐ ๊ฐ์ธ ํค์ ๊ฐ์ ๋ณด์ ํ์ผ์ ์ด๋ฏธ์ง์ ๊ตฝ์ง ์๊ณ ์ก์ธ์คํ๋๋ก ํ์ฉ
ssh
๋น๋ ์ปจํ ์ด๋๊ฐ ์ํธ๋ฅผ ์ง์ํ๋ SSH ์์ด์ ํธ๋ฅผ ํตํด SSH ํค์ ์ก์ธ์คํ๋๋ก ํ์ฉํฉ๋๋ค.
RUN --network
Network types
default
(default)
๊ธฐ๋ณธ ๋คํธ์ํฌ์์ ์คํ
none
๋คํธ์ํฌ ์ก์ธ์ค ์์ด ์คํ
host
ํธ์คํธ์ ๋คํธ์ํฌ ํ๊ฒฝ์์ ์คํํฉ๋๋ค
CMD
CMD
๋ช
๋ น์๋ ์ธ ๊ฐ์ง ํ์์ด ์์ต๋๋ค
CMD ["executable","param1","param2"]
(exec form, this is the preferred form)CMD ["param1","param2"]
(as default parameters to ENTRYPOINT)CMD command param1 param2
(shell form)
CMD
์ ์ฃผ์ ๋ชฉ์ ์ ์คํ ์ค์ธ ์ปจํ
์ด๋์ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค
LABEL
LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL ๋ช ๋ น์ด๋ ์ด๋ฏธ์ง์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค. LABEL์ ํค-๊ฐ ์์ ๋๋ค.
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
EXPOSE
EXPOSE <port> [<port>/<protocol>...]
EXPOSE
๋ช
๋ น์ด๋ ์ปจํ
์ด๋๊ฐ ๋ฐํ์ ์ ์ง์ ๋ ๋คํธ์ํฌ ํฌํธ
์์ ์์ ๋๊ธฐํจ์ Docker์ ์๋ฆฝ๋๋ค. ํฌํธ๊ฐ TCP
๋๋ UDP
์์ ์์ ํ๋์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ ํ๋กํ ์ฝ์ด ์ง์ ๋์ง ์์
๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ TCP
์
๋๋ค.
ENV
ENV <key>=<value> ...
ENV ๋ช ๋ น์ ํ๊ฒฝ ๋ณ์๋ฅผ ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
ADD
ADD์๋ ๋ ๊ฐ์ง ํ์
ADD [--chown=<user>:<group>] [--chmod=<perms>] [--checksum=<checksum>] <src>... <dest>
ADD [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]
ADD ๋ช
๋ น์ <src>
์์ ์ ํ์ผ, ๋๋ ํฐ๋ฆฌ ๋๋ ์๊ฒฉ ํ์ผ URL์ ๋ณต์ฌํ์ฌ <dest>
๊ฒฝ๋ก์ ์๋ ์ด๋ฏธ์ง์ ํ์ผ ์์คํ
์ ์ถ๊ฐํฉ๋๋ค.
COPY
COPY [--chown=<user>:<group>] [--chmod=<perms>] <src>... <dest>
COPY [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]
COPY --link
COPY ๋๋ ADD ๋ช ๋ น์์ ์ด ํ๋๊ทธ๋ฅผ ํ์ฑํํ๋ฉด ํ์ผ์ด ์์ฒด ๋ ์ด์ด์์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ง๋๊ณ ์ด์ ๋ ์ด์ด์ ๋ช ๋ น์ด ๋ณ๊ฒฝ๋ ๋ ๋ฌดํจํ๋์ง ์๋ ํฅ์๋ ์๋ฏธ๋ก ํ์ผ์ ๋ณต์ฌํ ์ ์์ต๋๋ค.
--link ์ฌ์ฉ์ ์ด์
์ด์ ๋ ์ด์ด๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ --cache-from
์ ์ฌ์ฉํ์ฌ ํ์ ๋น๋์์ ์ด๋ฏธ ๋น๋๋ ๋ ์ด์ด๋ฅผ ์ฌ์ฌ์ฉํ๋ ค๋ฉด --link
๋ฅผ ์ฌ์ฉํ๋ค
ENTRYPOINT
ENTRYPOINT ๋ ๊ฐ์ง ํ์
The exec form, which is the preferred form:
ENTRYPOINT ["executable", "param1", "param2"]
The shell form:
ENTRYPOINT command param1 param2
ENTRYPOINT
๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ ํ์ผ
๋ก ์คํ๋ ์ปจํ
์ด๋
๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
VOLUME
VOLUME ["/data"]
VOLUME
๋ช
๋ น์ ์ง์ ๋ ์ด๋ฆ์ผ๋ก ๋ง์ดํธ ์ง์ ์ ์์ฑํ๊ณ ๊ธฐ๋ณธ ํธ์คํธ ๋๋ ๋ค๋ฅธ ์ปจํ
์ด๋์์ ์ธ๋ถ ๋ง์ดํธ๋ ๋ณผ๋ฅจ์ ๋ณด์ ํ๋ ๊ฒ์ผ๋ก ํ์ํฉ๋๋ค.
USER
USER <user>[:<group>]
USER <UID>[:<GID>]
USER ๋ช ๋ น์ ์ฌ์ฉ์ ์ด๋ฆ(๋๋ UID) ๋ฐ ์ ํ์ ์ผ๋ก ํ์ฌ ๋จ๊ณ์ ๋๋จธ์ง ๋ถ๋ถ์ ๋ํด ๊ธฐ๋ณธ ์ฌ์ฉ์ ๋ฐ ๊ทธ๋ฃน์ผ๋ก ์ฌ์ฉํ ์ฌ์ฉ์ ๊ทธ๋ฃน(๋๋ GID)์ ์ค์ ํฉ๋๋ค.
WORKDIR
WORKDIR /path/to/workdir
WORKDIR ๋ช ๋ น์ด๋ Dockerfile์์ ๋ค์ ์ค๋ RUN, CMD, ENTRYPOINT, COPY ๋ฐ ADD ๋ช ๋ น์ด์ ๋ํ ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ค์ ํฉ๋๋ค.
ARG
ARG <name>[=<default value>]
ARG ๋ช ๋ น์ด๋ ์ฌ์ฉ์๊ฐ --build-arg <varname>=<value> ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ docker build ๋ช ๋ น์ผ๋ก ๋น๋ ์ ๋น๋์ ์ ๋ฌํ ์ ์๋ ๋ณ์๋ฅผ ์ ์ํฉ๋๋ค.
ONBUILD
ONBUILD <INSTRUCTION>
ONBUILD ๋ช ๋ น์ ์ด๋ฏธ์ง๊ฐ ๋ค๋ฅธ ๋น๋์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ๋ ๋ ๋์ค์ ์คํํ ํธ๋ฆฌ๊ฑฐ ๋ช ๋ น์ ์ด๋ฏธ์ง์ ์ถ๊ฐํฉ๋๋ค.
์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
ONBUILD
๋ช ๋ น์ ๋ง๋๋ฉด ๋น๋๋ ๋น๋ ์ค์ธ ์ด๋ฏธ์ง์ ๋ฉํ๋ฐ์ดํฐ์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ช ๋ น์ ํ์ฌ ๋น๋์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.๋น๋๊ฐ ๋๋๋ฉด ๋ชจ๋ ํธ๋ฆฌ๊ฑฐ ๋ชฉ๋ก์ด ์ด๋ฏธ์ง ๋งค๋ํ์คํธ์
OnBuild
ํค ์๋์ ์ ์ฅ๋ฉ๋๋ค.docker inspect
๋ช ๋ น์ผ๋ก ๊ฒ์ฌํ ์ ์์ต๋๋ค.๋์ค์
FROM
๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ ๋น๋์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.FROM
๋ช ๋ น ์ฒ๋ฆฌ์ ์ผ๋ถ๋ก ๋ค์ด์คํธ๋ฆผ ๋น๋๋ONBUILD
ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฐพ๊ณ ๋ฑ๋ก๋ ์์๋๋ก ์คํํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ ์ค ํ๋๋ผ๋ ์คํจํ๋ฉดFROM
๋ช ๋ น์ด ์ค๋จ๋์ด ๋น๋๊ฐ ์คํจํฉ๋๋ค. ๋ชจ๋ ํธ๋ฆฌ๊ฑฐ๊ฐ ์ฑ๊ณตํ๋ฉดFROM
๋ช ๋ น์ด ์๋ฃ๋๊ณ ํ์๋๋ก ๋น๋๊ฐ ๊ณ์๋ฉ๋๋ค.ํธ๋ฆฌ๊ฑฐ๋ ์คํ ํ ์ต์ข ์ด๋ฏธ์ง์์ ์ง์์ง๋๋ค. ์ฆ, "์์" ๋น๋์ ์ํด ์์๋์ง ์์ต๋๋ค.
STOPSIGNAL
STOPSIGNAL
๋ช
๋ น์ ์ข
๋ฃํ๊ธฐ ์ํด ์ปจํ
์ด๋๋ก ์ ์ก๋ ์์คํ
ํธ์ถ ์ ํธ๋ฅผ ์ค์ ํฉ๋๋ค.
HEALTHCHECK
HEALTHCHECK ๋ช ๋ น์ ๋ ๊ฐ์ง ํ์
HEALTHCHECK [OPTIONS] CMD
๋ช ๋ น(์ปจํ ์ด๋ ๋ด๋ถ์์ ๋ช ๋ น์ ์คํํ์ฌ ์ปจํ ์ด๋ ์ํ ํ์ธ)HEALTHCHECK NONE
(๊ธฐ๋ณธ ์ด๋ฏธ์ง์์ ์์๋ ๋ชจ๋ ์ํ ํ์ธ ๋นํ์ฑํ)
SHELL
SHELL ["executable", "parameters"]
SHELL
๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ๋ช
๋ น์ ์
ธ ํ์์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ์
ธ์ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
Here-Documents
Here-documents๋ ํ์ Dockerfile ํ์ RUN
๋๋ COPY
๋ช
๋ น์ ์
๋ ฅ์ผ๋ก ๋ฆฌ๋๋ ์
ํ๋๋ก ํ์ฉํฉ๋๋ค.
Example
# syntax=docker/dockerfile:1
FROM debian
RUN <<EOT bash
set -ex
apt-get update
apt-get install -y vim
EOT
Reference
Last updated
Was this helpful?