728x90
๋ฐ˜์‘ํ˜•

4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๋„์ปค ์ด๋ฏธ์ง€ ๊นŒ์ง€

4.1 Dockerfile ์ด ์žˆ๋Š”๋ฐ ๋นŒ๋“œ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ• ๊นŒ?

  • ํŒ€ ๋‹จ์œ„์˜ ์ž‘์—…์ด ์ง„ํ–‰๋  ๊ฒฝ์šฐ ๋นŒ๋“œ ๋„๊ตฌ ํ†ต์ผ์ด ํ•„์š”ํ•˜๋‹ค.
  • ํ•ด๋‹น ์ž‘์—…์€ ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์œ„ํ•œ ํฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜, Dockerfile ๋กœ ๋นŒ๋“œ ํˆด ์ฒด์ธ์„ ํ•œ ๋ฒˆ์— ํŒจํ‚ค์ง•ํ•ด์„œ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์œ ์ง€ ๋ณด์ˆ˜ ๋น„์šฉ์ด ๋Œ€ํญ ๊ฐ์†Œํ•˜๊ฒŒ ๋œ๋‹ค.
FROM diamol/base AS build-stage
RUN echo 'Building...' > /build.txt

FROM diamol/base AS test-stage
COPY --from=build-stage /build.txt /build.txt
RUN echo 'Testing...' >> /build.txt

FROM diamol/base
COPY --from=test-stage /build.txt /build.txt
CMD cat /build.txt
  • ๊ฐ ๋นŒ๋“œ ๋‹จ๊ณ„๋Š” ์„œ๋กœ ๊ฒฉ๋ฆฌ๋ผ ์žˆ๋‹ค.
  • ๋นŒ๋“œ ๋‹จ๊ณ„๋ณ„๋กœ ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€๋„ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋„ ๋‹ฌ๋ผ์ง„๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋นŒ๋“œ ๋‹จ๊ณ„์˜ ์‚ฐ์ถœ๋ฌผ์€ ์ด์ „ ๋น„๋“œ ๋‹จ๊ณ„์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ณต์‚ฌํ•ด ์˜จ ๊ฒƒ๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•œ ๋‹จ๊ณ„๋ผ๋„ ๋ช…๋ น์ด ์‹คํŒจํ•˜๋ฉด ์ „์ฒด ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•œ๋‹ค.
$ docker image build -t multi-stage .
[+] Building 4.0s (9/9) FINISHED                                                                                                                                                             docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                   0.0s
 => => transferring dockerfile: 566B                                                                                                                                                                   0.0s
 => WARN: DuplicateStageName: Duplicate stage name "test-stage", stage names should be unique (line 13)                                                                                                0.0s
 => [internal] load metadata for docker.io/diamol/base:latest                                                                                                                                          3.4s
 => [internal] load .dockerignore                                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                                        0.0s
 => [build-stage 1/2] FROM docker.io/diamol/base:latest@sha256:787fe221a14f46b55e224ea0436aca77d345c3ded400aaf6cd40125e247f35c7                                                                        0.0s
 => => resolve docker.io/diamol/base:latest@sha256:787fe221a14f46b55e224ea0436aca77d345c3ded400aaf6cd40125e247f35c7                                                                                    0.0s
 => => sha256:787fe221a14f46b55e224ea0436aca77d345c3ded400aaf6cd40125e247f35c7 1.40kB / 1.40kB                                                                                                         0.0s
 => => sha256:bd5e8ce69bca67190f789625870f8130d67069c4761b36ed7ecfa6dcbc6fdfd7 738B / 738B                                                                                                             0.0s
 => => sha256:e65ed3e91e579a862befe0d866ffe1e3377d64245c9e9fd82fffaf9e3c961f49 1.65kB / 1.65kB                                                                                                         0.0s
 => [build-stage 2/2] RUN echo 'Building...' > /build.txt                                                                                                                                              0.2s
 => [test-stage 2/3] COPY --from=build-stage /build.txt /build.txt                                                                                                                                     0.0s
 => [test-stage 3/3] RUN echo 'Testing...' >> /build.txt                                                                                                                                               0.1s
 => [stage-4 2/2] COPY --from=test-stage /build.txt /build.txt                                                                                                                                         0.0s
 => exporting to image                                                                                                                                                                                 0.0s
 => => exporting layers                                                                                                                                                                                0.0s
 => => writing image sha256:499c256287f9fa71674b34f0a2d3ea3b25af235104c75c473091ec53fca12b59                                                                                                           0.0s
 => => naming to docker.io/library/multi-stage                                                                                                                                                         0.0s

 2 warnings found (use docker --debug to expand):
 - DuplicateStageName: Duplicate stage name "test-stage", stage names should be unique (line 13)
 - JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 19)
  • 1๋‹จ๊ณ„. ์˜์กด ๋นŒ๋“œ ๋ชจ๋“ˆ์„ ๋‚ด๋ ค๋ฐ›๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•œ๋‹ค.
  • 2๋‹จ๊ณ„. ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณต์‚ฌํ•œ ํ›„ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
  • 3๋‹จ๊ณ„. ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณต์‚ฌํ•œ๋‹ค.
  • ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ •ํ•œ ์ด์‹์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ด์šฉํ•ด ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋“  ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์ค‘์•™ ์ง‘์ค‘์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ, ๋„์ปค ํ—ˆ๋ธŒ๋ฅผ ํ†ตํ•ด ์ฃผ์š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋œ ์ด๋ฏธ์ง€๋“ค์ด ์žˆ์–ด. ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ตœ์‹ ํ™” ๋ฐ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

4.2 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ ์‹ค์ „ ์˜ˆ์ œ: ์ž๋ฐ” ์†Œ์Šค ์ฝ”๋“œ

# maven, OpenJDK ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€
FROM diamol/maven AS builder

# pom.xmnl ๋ณต์‚ฌ
WORKDIR /usr/src/iotd
COPY pom.xml .
# ํ•„์š”ํ•œ ์˜์กด์„ฑ ๋‹ค์šด๋กœ๋“œ
RUN mvn -B dependency:go-offline

# ๋‚˜๋จธ์ง€ ์†Œ์Šค์ฝ”๋“œ ๋ณต์‚ฌ. 
# ๋„์ปค ๋นŒ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํฌํ•จ๋œ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ์„œ๋ธŒ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํ˜„์žฌ ์ด๋ฏธ ๋‚ด ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌ
COPY . .
# ๋นŒ๋“œ ํŒจํ‚ค์ง•
RUN mvn package

FROM diamol/openjdk

# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
WORKDIR /app
# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์— ๋นŒ๋“œ๋ฅผ ํ†ตํ•ด ๋‚˜์˜จ jar ํŒŒ์ผ ๋ณต์‚ฌ
COPY --from=builder /usr/src/iotd/target/iotd-service-0.1.0.jar .

# 80 ํฌํŠธ ์™ธ๋ถ€๋กœ ๊ณต๊ฐœ
EXPOSE 80
# jar ํŒŒ์ผ ์‹คํ–‰
ENTRYPOINT ["java", "-jar", "/app/iotd-service-0.1.0.jar"]
$ docker build -t image-of-the-day .

$ docker network create nat

$ docker container run --name iotd -d -p 8080:80 --network nat image-of-the-day
  • ์ตœ์ข…์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฏธ์ง€์— ๋นŒ๋“œ ๋„๊ตฌ๋Š” ํฌํ•จ๋˜์ง€ ์•ˆํ”๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฏธ์ง€์—๋Š” ๋„์ปค ํŒŒ์ผ์— ์ •์˜๋œ ๋นŒ๋“œ ๋‹จ๊ณ„ ์ค‘ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์˜ ์ปจํ…์ธ ๋งŒ ํฌํ•จ๋œ๋‹ค.
  • ์ฆ‰, ํฌํ•จ์‹œํ‚ค๊ณ  ์‹ถ์€ ์ปจํ…์ธ ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ตœ์ข… ๋‹จ๊ณ„์—์„œ ๋ช…์‹œ์ ์„ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณต์‚ฌํ•ด ์™€์•ผ ํ•œ๋‹ค.

4.3 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ ์‹ค์ „ ์˜ˆ์ œ: Node.js ์†Œ์Šค ์ฝ”๋“œ

  • Node.js ๋Š” Java ์˜ ์ปดํŒŒ์ผ ์–ธ์–ด์™€๋Š” ๋‹ค๋ฅธ ์ธํ„ฐํ”„๋ฆฌํ„ฐํ˜• ์–ธ์–ด๋กœ ๋ณ„๋„์˜ ์ปดํŒŒ์ผ ์ ˆ์ฐจ๊ฐ€ ํ•„์š” ์—†๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆํ™”๋œ Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด Node.js ๋Ÿฐํƒ€์ž„๊ณผ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฏธ์ง€์— ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค.
FROM diamol/node AS builder

# ์˜์กด์„ฑ์ด ์ •์˜๋œ package.json ํŒŒ์ผ ๋ณต์‚ฌ
WORKDIR /src
COPY sr/package.json .

# ์˜์กด์„ฑ ๋‹ค์šด๋กœ๋“œ
RUN npm install

#app
FROM diamol/node

EXPOSE 80
CMD ["node", "server.js"]

WORKDIR /app
# ํ˜ธ์ŠคํŠธ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‹ฐํŒฉํŠธ ๋ชจ๋‘ ๋ณต์‚ฌ
COPY --from=builder /src/node_modules/ /app/node_modules/
COPY src/ .
  • ์œ„์™€ ๊ฐ™์ด ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜์กด์„ฑ ๋ชจ๋“ˆ์€ ๋„์ปค ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด ์บ์‹œ์— ์ €์žฅ๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๋ณ„๋„์˜ ์˜์กด ๋ชจ๋“ˆ ์ถ”๊ฐ€๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋‹ค์Œ ๋ฒˆ ๋นŒ๋“œ๋Š” ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰๋œ๋‹ค.

4.4 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ ์‹ค์ „ ์˜ˆ์ œ: Go ์†Œ์Šค ์ฝ”๋“œ

  • Go ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ํ˜„๋Œ€์ ์ธ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์–ธ์–ด๋‹ค.
  • ์ฆ‰, ์–ด๋–ค ํ”Œ๋žซํผ(์œˆ๋„์šฐ, ๋ฆฌ๋ˆ…์Šค, amd64, ARM) ์ด๋“  ํ•ด๋‹น ํ”Œ๋žซํผ์— ๋งž๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ, ๋ณ„๋„์˜ ๋Ÿฐํƒ€์ž„์ด ํ•„์š”์—†์–ด ๋„์ปค ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ๋งค์šฐ ์ž‘์•„์ง„๋‹ค.
  • Docker ๋˜ํ•œ Go ์–ธ์–ด๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.
FROM diamol/golang AS builder

COPY main.go .
# ์˜์กด์„ฑ ์—†์ด ๋ฐ”๋กœ ๋นŒ๋“œ
RUN go build -o /server

# app
FROM diamol/base

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •
ENV IMAGE_API_URL="<http://iotd/image>" \\
		ACCESS_API_URL="<http://accesslog/access-log>"
CMD ["/web/server"]

WORKDIR web
COPY index.html .
COPY --from=builder /server .
RUN chmod +x server
$ docker image ls -f reference=diamol/golang -f reference=image-gallery
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
image-gallery   latest    412cedb50233   27 seconds ago   26.2MB
diamol/golang     latest    e0b7365f308e    2  hours   ago   803MB
  • ์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€์˜ ์„ ํƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ + ๋นŒ๋“œ ๋„๊ตฌ ํฌํ•จ๋œ ์ด๋ฏธ์ง€๋Š” ์•ฝ 800MB ์ด์ง€๋งŒ, ๋„์ปค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งŒ ์žˆ๋Š” ์ด๋ฏธ์ง€๋Š” ์•ฝ 26MB ์ •๋„์ด๋‹ค.
  • Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‹คํ–‰ ์‹œ ๋ณ„๋„์˜ ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์œ„์™€ ๊ฐ™์ด ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™” ํ•ด์„œ Docker ์˜ ํŠน์žฅ์ ์ธ ๊ฒฝ๋Ÿ‰ํ™”๋ฅผ ์‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค.

4.5 ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ Dockerfile ์Šคํฌ๋ฆฝํŠธ ์ดํ•ดํ•˜๊ธฐ

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

A. ํ‘œ์ค€ํ™”

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

B. ์„ฑ๋Šฅ ํ–ฅ์ƒ

  • ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ์˜ ๊ฐ ๋‹จ๊ณ„๋Š” ์ž์‹ ๋งŒ์˜ ์บ์‹œ๋ฅผ ๋”ฐ๋กœ ๊ฐ–๋Š”๋‹ค.
  • ๋„์ปค๋Š” ๋นŒ๋“œ ์ค‘์— ๊ฐ ์ธ์ŠคํŠธ๋Ÿญ์…˜์— ํ•ด๋‹นํ•˜๋Š” ์บ์‹œ๋ฅผ ์ฐพ๋Š”๋‹ค.
  • Dockerfile ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ตœ์ ํ™” ํ•œ๋‹ค๋ฉด ์บ์‹œ ์žฌ์‚ฌ์šฉ์„ ํ†ตํ•ด 90% ์ด์ƒ์˜ ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

C. ์ž‘์€ ์ด๋ฏธ์ง€

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

4.6 ์—ฐ์Šต๋ฌธ์ œ

  • Go ์–ธ์–ด ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ Dockerfil ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ Linux ํ™˜๊ฒฝ ์ด๋ฏธ์ง€๋Š” ์•ฝ 15MB, ์œˆ๋„์šฐ ํ™˜๊ฒฝ ์ด๋ฏธ์ง€๋Š” ์•ฝ 260MB ๊ฐ€ ๋˜๋„๋ก ๋งŒ๋“ค๊ธฐ.
  • HTML ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด๋„ ์žฌ๋นŒ๋“œ ์‹œ ๋นŒ๋“œ ๋‹จ๊ณ„๊ฐ€ ํ•œ ๋‹จ๊ณ„๊ฐ€ ๋˜๋„๋ก ์ˆ˜์ •ํ•˜๊ธฐ.

๋ฌธ์ œ Dockerfile ์Šคํฌ๋ฆฝํŠธ

FROM diamol/golang 

WORKDIR web
COPY index.html .
COPY main.go .

RUN go build -o /web/server
RUN chmod +x /web/server

CMD ["/web/server"]
ENV USER=sixeyed
EXPOSE 80
  • ์‹ฑ๊ธ€ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ โ†’ ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋กœ ๋ณ€๊ฒฝ.
  • diamol/golang ์˜ ๊ฒฝ์šฐ ๋นŒ๋“œ์— ํ•„์š”ํ•œ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ
  • Go ์–ธ์–ด์˜ ๊ฒฝ์šฐ ์‹คํ–‰ ์‹œ ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ํ•„์š” ์—†์œผ๋ฏ€๋กœ diamol/base ์ด๋ฏธ์ง€๋กœ ๋ณ€๊ฒฝ

๋‚˜์˜ ํ’€์ด

FROM diamol/golang AS builder

COPY main.go .
RUN go build -o /web/server

# app
FROM diamol/base

WORKDIR /web

ENV USER=sixeyed

EXPOSE 80
CMD ["./server"]

COPY index.html .
COPY --from=builder /web/server ./server

RUN chmod +x ./server

$ docker image build -t ch04-lab .

$ docker image ls
REPOSITORY                    TAG        IMAGE ID       CREATED              SIZE
ch04-lab                      latest     a21288fc2013   About a minute ago   25.9MB

์ •๋‹ต

FROM diamol/golang AS builder

COPY main.go .
RUN go build -o /server
RUN chmod +x /server

# app
FROM diamol/base

EXPOSE 80
CMD ["/web/server"]
ENV USER="sixeyed"

WORKDIR web
COPY --from=builder /server .
COPY index.html .
  • chmod ๊ถŒํ•œ ๋ช…๋ น์˜ ๊ฒฝ์šฐ์—๋„ builder ๋กœ ์˜ฎ๊ฒผ์œผ๋ฉด ์ •๋ง ๊ทผ์ ‘ํ–ˆ์„ ๋“ฏ.
728x90
๋ฐ˜์‘ํ˜•
MyeongDev