posted by 귀염둥이채원 2019. 1. 4. 17:20

문제: CentOS base docker 이미지로 컨테이너를 생성하고 접속하면 아래와 같은 Warning이 출력되었다.

bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory

bash: warning: setlocale: LC_COLLATE: cannot change locale (en_US.UTF-8): No such file or directory

bash: warning: setlocale: LC_MESSAGES: cannot change locale (en_US.UTF-8): No such file or directory

bash: warning: setlocale: LC_NUMERIC: cannot change locale (en_US.UTF-8): No such file or directory

bash: warning: setlocale: LC_TIME: cannot change locale (en_US.UTF-8): No such file or directory


locale 커멘드를 이용해서 현재 시스템에서 사용중인 로케일을 확인해본다.

[root@7b3a3ede1d74 /]# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

locale -a 명령어를 사용해서 현재 시스템에서 사용가능한 로케일을 확인한다.

[root@7b3a3ede1d74 /]# locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
POSIX

이 정보는 /usr/lib/locale/locale-archive에 있는 정보이다. 위와 비교해보니 en_US.UTF-8 로케일이 없는 것이 문제 상황으로 파악됬다.

로케일을 정의한 파일들은 /usr/share/i18n/locales 폴더 아래에 있고, charmap(캐릭터맵)에 대한 정보는 /usr/share/i18n/charmaps 폴더 아래에 있다. 이 두가지 정보가 localedef의 명령어로 컴파일 되며 컴파일 된 내용은 위에서 보았던 /usr/lib/locale/locale-archive 파일안으로 들어가게 된다.

Centos/Fedora에는 locale-gen가 없다. 대신에 localedef를 사용하면 된다.

아래와 같이 입력해서 필요한 로케일을 컴파일 시킨다.

localedef -v -c -i en_US -f UTF-8 en_US.UTF-8

option 설명

  • v: 일반적으로 무시되는 오류에 대한 추가 경고를 생성
  • c: 경고가 발생하더라도 출력 파일을 작성
  • i: 로케일의 정의 파일
  • f: charmap(캐릭터맵) 정의

중요한 옵션은 if 두 가지이다. 이 두개의 옵션으로 로케일 및 캐릭터 맵을 지정한다. 즉 이 두개가 합쳐져서 en_US.UTF-8이 되는 것이다. 다시 아래와 같이 locale -a를 입력한다.

[root@7b3a3ede1d74 /]# locale -a
C
en_US.utf8
POSIX

en_US.utf8이 추가되었고 에러도 사라졌다.

만약 localedef 명령어가 없다면 아래와 같이 설치한다.

yum reinstall glibc-common


참고: https://blog.seotory.com/post/2017/02/docker-container-locate-error-fix

posted by 귀염둥이채원 2018. 12. 28. 11:05

Dockerfile 작성 및 도커 이미지를 빌드하는 방법이다.


Dockerfile에는 대략적으로 아래와 같은 내용이 기술되어 있다.

1. FROM: centos7 이미지를 사용한다.

2. RUN: yum을 이용해서 필요한 패키지를 설치한다.

3. ARG: 변수에 값을 설정하기 위해서 사용한다.

4. RUN: OS 그룹 및 유저를 생성한다. (sudo를 사용할수 있도록 추가)

5. RUN: 디렉토리를 생성 및 권한 추가


# Dockerfile

 FROM centos:centos7

MAINTAINER Programmer


RUN yum -y update;

RUN yum -y install java-1.8.0-openjdk \

    java-1.8.0-openjdk-devel \

    net-tools \

    which \

    initscripts \

    openssh-server \

    sudo \

    tree


ARG GROUP=project

ARG USER=service

ARG USER_PASS=service

RUN groupadd ${GROUP}

RUN useradd -g ${GROUP} ${GROUP}

RUN useradd -G ${GROUP} ${USER}

RUN echo "${USER_PASS}" | passwd ${USER} --stdin

RUN echo "${USER}    ALL=(ALL)       ALL" >> /etc/sudoers


RUN mkdir -p /system

RUN mkdir -p /log


RUN chown ${GROUP}:${GROUP} /system

RUN chown ${GROUP}:${GROUP} /log


RUN chmod 775 /system

RUN chmod 775 /log


ENV JAVA_HOME /usr/java/jdk1.8.0_171-amd64/jre/


# build docker image

$ docker build -t test_image .


# Run container

$ docker run -d \

--name=test_container \

--cap-add=SYS_ADMIN \

-e "container=docker" \

-v /sys/fs/cgroup:/sys/fs/cgroup:ro \

--tmpfs /run \

--tmpfs /run/lock \

test_image \

/sbin/init


# Start bash in container

$ docker exec -it test_container /bin/bash

posted by 귀염둥이채원 2018. 12. 28. 11:03

도커 컨테이너로 Ubuntu, CentOS 베이스 이미지를 사용할 경우,

기본적인 패키지를 설치가 필요해서 정리한다.


# Ubuntu 기본 패키지 설치

$ apt -y update

$ apt -y install \

net-tools \

vim \

htop \

iftop \

openssh-server \

lrzsz \

tree


# Centos 기본 패키지 설치

$ yum -y update

$ yum -y install \

net-tools \

vim \

htop \

iftop \

openssh-server \

which \

sudo \

tree \

initscripts