레이블이 alpine인 게시물을 표시합니다. 모든 게시물 표시
레이블이 alpine인 게시물을 표시합니다. 모든 게시물 표시

add timezone in alpine

# golang 에서 타임존이 변경된 time 사용을 위해 time.LoadLocation 를 사용했다.
loc, _ := time.LoadLocation("Asia/Seoul")
t = t.In(loc)

# 로컬에서는 동작했지만,
# 배포된 도커에서는 loc 를 찾을 수 없어 panic 이 발생하고 있었다.
[PANIC RECOVER] time: missing Location in call to Time.

# 컨테이너 사이즈를 줄이기 위해 alpine 이미지를 사용하고 있었는데,
# LoadLocation 가 참조하는 zoneinfo 데이터가 존재하지 않아 발생한 문제였다.

# dockerfile 에 tzdata 를 설치를 추가하자.
RUN apk add tzdata

# 이제 다음과 같은 위치에 timezone 데이터 값이 추가되고,
# time.LoadLocation 도 사용할 수 있다.
/usr/share/zoneinfo/Asia/Seoul

docker alpine not found error

# app(바이너리파일)을 추가한 apline 도커 이미지에서 다음과 같은 에러가 발생했다.
/ysoftman # ./app
/bin/sh: ./app: not found

# 다음과 같이 lib6-compat(glibc 호환 라이브러리 패키지)를 설치하면 된다.
RUN apk add libc6-compat

# 추가로 libstdc++, libgcc 등 을 찾을 수 없는 경우 설치하자.
RUN apk add libstdc++ libgcc

docker multistage

# dockerfile 에서 
# RUN, ADD, COPY 명령마다 layer 가 생성된다. 기존의 이미지에서 이 명령들 중 수정되면 수정되는 곳 부터 새로운 layer 가 생성된다.
# CMD, LABEL, ENV, EXPOSE 임시 layer 로 생성되지만 실제 도커이미지에는 저장되지 않는다.

# layer 개수와 해시값(sha256)은 다음 명령으로 확인할 수 있다.
docker image inspect nginx:latest  | jq '.[0].RootFS'

# 최적화된 도커 이미지 생성하기
# 베이스가 될 이미지 사이즈가 작은것을 선택한다.
# alpine linux 는 유닉스 기본 명령어가 포함된 busybox(https://www.busybox.net/) 와 musl(https://musl.libc.org/) C 라이브러리만 포함하고 있어 사이즈가 아주 작다.
# 다만 python 을 사용한다면 apline 기반에서는 패키지 철치, 빌드 시간, 기타 취약점등 단점이 많기 때문에 debian(https://www.debian.org/releases/) 10(buster)나 11(bullseye) 을 사용하는것이 좋다.

# RUN 하나로 layer 개수를 줄이자.
# 다음의 경우 RUN 마다 layer 가 생성되지만 
RUN apt-get update
RUN apt-get install -y gcc
RUN apt-get install -y git

# 다음과 같이 하나로 합치면 layer 도 1개 된다.
RUN apt-get update && apt-get install -y gcc && apt-get install -y git

# 자주 내용이 바뀔 수 있는 COPY 명령은 변경이 있을 때마다 새로 layer 생성을 위해 빌드 시간이 추가되기 때문에 변경이 없는 명령 이후에 위치하여 불필요한 빌드 시간을 단축하는것이 좋다.

# 멀티 스테이지 사용하기
# Docker 17.05 부터 Dockerfile 하나에 여러개의 빌드 스테이지를 둘 수 있다.
# FROM 만큼 스테이지를 생성(이미지 빌드)하고
# 이전 스테이지의 결과를 다음 스테이즈로 복사해서 사용할 수 있다.
# 스테이지1) 소스 빌드 바이너리 --> 스테이지2) 바이너리만 포함된 이미지
# 와 같은 작업을 dockerfile 하나로 작성할 수 있어 편하다.

# Dockerfile
# buildstage 이름의 스테이지로 지정
FROM ubuntu:latest AS buildstage

WORKDIR /root
RUN echo "test" > output.txt

# 만약 또다른 스테이지(buildstage123)가 있으면 이 buildstage, buildstage123 스테이지 둘다 동시에 진행되고,   
# buildstage 에서 다음과 같이 buildstage123 의 결과물을 복사명령이 있다면 buildstage123 가 완료 후 COPY 가 수행된다.
# COPY --from=buildstage123 /xxx.txt .

##########

# 마지막 스테이지
FROM archlinux/base:latest

# buildstage 의 결과물을 현재 스테이지의 . 위치로 복사
COPY --from=buildstage /root/output.txt .
CMD ["/bin/bash"]

# multistage 를 빌드하면 최종 스테이지 말고는 
# 모두 <none> dangling 이미지가 생성되니 지워준다.
# docker image prune -f

# 참고로 dive(https://github.com/wagoodman/dive) 툴을 이용하면 docker image layer 별 사이즈 및 세부내용을 볼수 있어 이미지 분석에 도움이 된다.


centos7 docker 이미지 locale 설정 오류

# centos7 기본 도커 이미지를 받아 실행한다.
# .bashrc 파일에 다음과 같이 언어 설정을 하고 접속을 하게 되면
export LANG=ko_KR.utf8
export LC_ALL=ko_KR.utf8

# 다음과 같이 locale 을 설정할 수 없다는 에러가 발생하는 경우가 있다.
bash: warning: setlocale: LC_ALL: cannot change locale (ko_KR.utf8): No such file or directory

# 사용 가능한 모든 지역 언어(locale -a)설정 리스트를 확인해보면
# 지원되는 언어 3개 밖에 없다.
locale -a
C
POSIX
en_US.utf8

# 언어 패키지가 설치 안된것 같아 다음과 같이 설치해보았지만 설치자체가 안된다.
sudo yum groupinstall korean-support

# 이와 같은 이슈를 고민하는 사람들이 있다.
https://serverfault.com/questions/616790/how-to-add-language-support-on-centos-7-on-docker

# 도커 centos7 최근 이미지에서 영어, c, posix 를 제외한 로케일을 일부러 삭제한것으로 보인다.
# 우선 glibc 패키지를 재설치하라고 했지만 해결되지 않는다.
sudo yum reinstall -y glibc-common glibc

# 해결 방법
# (centos8의 경우) glibc-locale-source 설치
sudo yum install glibc-locale-source

# 이렇게 하면 /usr/lib/locale/locale-archive (locale 이 참고하는 파일)에 추가된다고 한다.
# -f UTF-8 :charmap 지정, /usr/share/i18n/charmaps/UTF-8.gz 심벌, 인코딩 정보
# -i ko_KR : sourcefile 지정, /usr/share/i18n/locales/ko_KR 언어 정의
# ko_KR.utf : 아카이브에 추가할 이름
sudo localedef -f UTF-8 -i ko_KR ko_KR.utf8

# 추가로  UTC 로 설정(링크)되어 있는 링크를 한국시간으로 변경해보자.
https://yoonbh2714.blogspot.kr/2017/11/centos-localtime.html
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# 참고
# centos7 기본이라 패키지가 설치된게 거의 없다.
# dockerfile 로 다음 패키지들은 설치하도록 한다.
# yum 으로 패키지 설치후 locale 이 변경될 수 있어 localedef 는 뒤에 실행 하자.
RUN yum install -y sudo tar git rsync gcc gcc-c++ net-tools which iproute man-pages man setuptool ncurses-devel python-devel libevent-expat-devel bzip2-devel
RUN yum groupinstall -y 'development tools'
RUN localedef -f UTF-8 -i ko_KR ko_KR.utf8 && ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# 추가로 
# ubuntu 에서 타임존 설정
RUN apt-get update && \
apt-get install -y rsync apt-utils && \
rm -f /etc/localtime && \
ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# alpine 에서 타임존 설정
RUN apk --no-cache add tzdata && \
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
echo "Asia/Seoul" > /etc/timezone