문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
|
docker:build [2017/01/01 12:12] kwon37xi |
docker:build [2022/02/16 14:49] (현재) kwon37xi [주의할 점] |
||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| ====== Docker Image Build ====== | ====== Docker Image Build ====== | ||
| + | [[: | ||
| + | ===== 주의할 점 ===== | ||
| + | * 최종 프로세스실행 사용자를 '' | ||
| + | * 그렇지 않으면 Docker Container의 프로세스가 뚫리면 Host 운영체제의 '' | ||
| + | * 항상 동일한 '' | ||
| + | * '' | ||
| + | * Timezone 을 명확히 맞춘다. | ||
| + | * multi stage build로 최소 용량이 될 수 있게 한다. | ||
| + | * 내 경험상 [[linux: | ||
| ===== 한 컨테이너에서 다중 프로세스 실행 ===== | ===== 한 컨테이너에서 다중 프로세스 실행 ===== | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | |||
| + | ===== 용량 줄이기 ===== | ||
| + | * Dockerfile 의 각 '' | ||
| + | * 따라서 '' | ||
| + | <code sh> | ||
| + | RUN yum update -y && \ | ||
| + | yum instal .... && \ | ||
| + | yum clean all | ||
| + | </ | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | ===== 실행 사용자 변경 ===== | ||
| + | * 기본적으로 root 사용자로 ENTRYPOINT, CMD 의 명령이 실행되는데 이 경우 보안상 문제가 될 수 있다. Docker 컨테이너가 해킹당하면 '' | ||
| + | * 따라서 항상 non-root 권한으로 명령을 실행할 수 있도록 해야 한다. | ||
| + | |||
| + | <code sh> | ||
| + | # alpine linux 사용자 추가 | ||
| + | RUN adduser -D -h / | ||
| + | USER worker | ||
| + | </ | ||
| + | ===== COPY와 ADD chown ===== | ||
| + | * Docker 17.x 이후부터 '' | ||
| + | <code sh> | ||
| + | COPY --chown=< | ||
| + | </ | ||
| 줄 16: | 줄 51: | ||
| RUN ln -snf / | RUN ln -snf / | ||
| </ | </ | ||
| + | * '' | ||
| + | * [[linux: | ||
| + | |||
| + | ===== LANG ===== | ||
| + | * **UTF-8**로 인코딩 설정 필요. | ||
| + | |||
| + | <code sh> | ||
| + | ENV LANG=ko_KR.UTF-8 | ||
| + | </ | ||
| + | |||
| + | ===== JAVA JMX ===== | ||
| + | '' | ||
| + | < | ||
| + | -Dcom.sun.management.jmxremote=true \ | ||
| + | -Dcom.sun.management.jmxremote.port=$JMX_PORT \ | ||
| + | -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT \ | ||
| + | -Dcom.sun.management.jmxremote.ssl=false \ | ||
| + | -Dcom.sun.management.jmxremote.authenticate=false \ | ||
| + | -Djava.rmi.server.hostname=$HOST_IP" | ||
| + | </ | ||
| + | docker 실행시 '' | ||
| + | |||
| + | ===== Latest 올리기 ===== | ||
| + | Local에 있는 빌드에 버전이 있는 tag 와 :latest 태그를 함께 만들고 둘 다 push 하면 된다. tag가 달라도 이미 push 된 데이터가 있으면, 중복 Push하지 않기 때문에 데이터가 중복저장되거나 하지는 않는다. | ||
| + | |||
| + | <code sh> | ||
| + | docker build --tag my/ | ||
| + | docker tag my/ | ||
| + | docker tag my/ | ||
| + | docker push my/ | ||
| + | dpcler push my/ | ||
| + | </ | ||
| + | |||
| + | ===== Multi Stage Build ===== | ||
| + | * [[https:// | ||
| + | * 소스에서 바이너리를 빌드 한 뒤에 실제로 필요한 바이너리만 최종 Docker 이미지로 만들거나 할 수 있는 방식 | ||
| + | ===== 참조 ===== | ||
| + | * [[https:// | ||
| + | * * [[https:// | ||