Author: byun1114

  • Docker Private Registry

    Debian 도커 이미지의 경우 apt update 부터 실행해야 할 정도로 날 것이기 때문에 최소한의 사용에 맞게 설정해야 할 필요가 있다. 이번에는 별도의 컴퓨터에 Registry를 설치해서 push와 pull 을 할 수 있도록 했다.

    인터넷에서 관련 정보를 찾으면 보통 registry 이미지를 5000번 포트를 이용해서 사용하는 예제들이 있다. 이를 따라해 보도록 한다.

    # sudo docker run --name private-repository -d -p 5000:5000 registry

    이미지를 build 할 때 IP 와 포트 등을 지정한다.

    # sudo docker build 192.168.88.250:5000/byun1114/my-debian

    Docker는 설치 단계에서 repository 의 정보를 받을 때 HTTPS를 이용한다. 그래서 그런지 build 할 때에도 기본적으로 https를 이용하는 것을 전제하고 있다. HTTPS를 이용하지 않는다면 오류가 발생한다. “http: server gave HTTP response to HTTPS client” 이런 오류 메세지가 나타나면 2가지 방법으로 해결할 수 있다고 하는데 그 중에 하나인 daemon.json 을 이용하는 방법을 사용하였다. 이 방법은 Docker 를 build 하는 컴퓨터에서 적용하는 것이다. 이 파일의 내용을 추가한 다음 Docker 를 재시작하고 build 하면 된다.

    /etc/docker/daemon.json
    {
        "insecure-registries": ["192.168.88.250:5000"]
    }
  • RxNorm 매핑하기

    한국의약품안전관리원에서 주관하는 MOA-CDM에 참여하고 있다. 약물에 대한 concept_id는 RxNorm 이나 RxNorm Extension 으로 해야 한다고 한다. EDI에서 ATC로 변환하는 것은 심평원에서 정기적으로 제공하는 파일이 있어서 어렵지 않은데 RxNorm으로 하려면 상당히 난감하다. 의약품안전관리원에서 일부 EDI 코드에 대한 concept_id 매핑 테이블은 제공하지만, 반수 이하만이 가능할 뿐이다. 그래서 RxNorm 으로 매핑을 진행하기로 했다. 유지 비용을 받으니 일을 해야 한다. ㅠ

    처음에는 아무런 concept_id를 하고 있었는데 확인해 봤더니 class를 ‘Clinical Drug’로 해야 한다고 한다. 이게 골 때리는 부분이다. 정리하면 다음과 같다.

    • 우선 약물 처방 코드로는 무슨 종류의 약물인지 알기가 매우 어렵다.
    • EDI에서 RxNorm 매핑에 대한 자료는 없다.

    이 2가지 부분은 난감한 부분이지만 좀 편하게 해결하기 위한 방법이 있다.

    • 그래도 다행인점은 약물 이름에 대한 정보가 있다는 점이다.
    • 약물 이름이 성분명에 가까우면 ‘Clinical Drug’ class에서 검색이 되는 경우가 있다.
    • 약물 이름으로 검색을 하면 ‘Branded Drug Comp’ class 에서 해당 내용을 찾을 수 있다. 약물 이름은 끝부분에 [약물이름] 형식으로 되어 있다.
    • 그리고 앞 부분에는 성분명, 용량이 제시된다. 이 다음이 중요한데 성분명, 용량이 제시되는 순서를 그대로 다시 concept_name에서 검색을 하면 ‘Clinical Drug’ class에 대부분 전방 일치로 정보가 있다는 것이다. 보통 추가되는 정보는 투여 경로와 제형으로 이 정보를 이용하면 추가로 확인할 수 있다.

    말로 하면 어려우니 캡쳐 화면을 직접 보면 이해가 쉽다.

    이 것을 적당히 함수로 구현해서 작업을 들어가면 예전보다 훨씬 더 빠른 속도로 진행할 수 있다.

  • 사람은 무엇으로 사는가, 레프 톨스토이, 홍대화 옮김

    이 책은 톨스토이 단편집 모음이다. 제목인 ‘사람은 무엇으로 사는가’는 이 책에서 처음으로 소개하고 있는 소설이다. 이 책의 여러 단편들을 읽어 보면, 왠만하면 한 번쯤은 들어봄직한 그런 이야기들이 많이 있다.

    다 읽지는 못하고 반납을 한 ‘전쟁과 평화’와 동일한 작가라는 것이 믿어지지 않을 정도로 다루고 있는 주제가 다르다. ‘전쟁과 평화’에서는 귀족 사회, 전쟁, 이혼, 결투 등에 대한 이야기드를 다루고 있었다. 그에 비하여 이 단편집에서는 기독교적인 사랑 이야기, 하나님에 대한 이야기, 과욕에 대한 경계가 많이 다루어 지고 있다.

    그 중에서 가장 마음을 울리는 것은 처음이 아닌 마지막 이야기의 마지막 문단이다. 이 책에서 소개하는 마지막 단편집은 ‘세 가지 질문’이다. 그리고 마지막 구절은 다음과 같다.

    그러니 기억하게. 가장 중요한 시간은 바로 지금이라네. 가장 중요한 이유는 그 시간에만 우리는 자신을 통제할 수 있기 때문이네. 가장 필요한 사람은 지금 만나고 있는 그 사람인데, 다른 사람과 어떤 관계를 맺게 될지 아무도 모르기 때문이지. 그리고 가장 중요한 것은 그에게 선을 행하는 것이라네. 우리는 오직 그것을 위해서만 살아가도록 보냄을 받았기 때문이라네.

  • Docker 에서 build 하기

    Docker를 사용한다고 했을 때 자기가 원하는 이미지를 만들 수 있어야, 최소한 이 사람은 Docker를 어느 정도는 사용할 수 있겠구나라고 할 수 있을 것 같다.

    Python이나 R 을 사용할 경우 패지키 별 상호 의존성이 있는 경우가 많다. 나중에 가면 이 패키지가 기본인지 아니면 내가 어떤 경로를 통하여 설치했는지 기억이 가물거리게 된다. 물론 Anaconda에서도 가상 환경을 지원해 주고 있기 때문에 이것을 이용해 볼 수도 있겠다. 그렇다고 하더라도 시스템에서 설치하는 프로그램에 따른 종속성도 있으므로 Docker로 구현해 보도록 하겠다.

    Docker에서 이미지를 생성하는 것은 어렵지 않다. 빈 폴더에서 Dockerfile 이라는 파일을 만들고, 여기에 적절한 명령어를 입력해 둔다. 잘 구성된 파일이라면 새로운 이미지를 생성할 수 있다.

    예전에 apt-cacher-ng를 알게 되었을 때, Docker와 commit 이야기가 나왔었는데, 실제로 해보니 알 것 같다. Docker로 commit 까지 작업을 하는 곳에서는 미러나 캐시 서버가 있어야 확실히 편하다.

    Ubuntu에서 Python 을 컴파일하여 설치하는 것을 구현한 것은 다음과 같다. 블로그 가로폭의 문제로 잘려 보일지라도 알아서 잘 설정하면 된다.

    • 우선 도커 이미지에서 캐시 서버를 이용할 수 있도록 미리 설정된 apt.conf 파일을 컨테이너 내부의 /etc/apt 폴더에 복사해 둔다.
    • Python 파일도 복사한다.
    • 나중에 프로그램 설치하는 과정에서 시간대 설정 부분이 나오기 때문에 미리 시간대를 맞추어 둔다.
    • 여러 번의 삽질을 통하여 미리 파악한 최소한의 패키지를 설치한다.
    • Python을 컴파일 한다.
    FROM ubuntu
    ADD http://file.welovedoctor.com/share/FILE/PYTHON/apt.conf /etc/apt/
    ADD http://file.welovedoctor.com/share/FILE/PYTHON/Python-3.9.6.tgz /tmp
    RUN rm -rf /etc/localtime 
    RUN ln -s /usr/share/zoneinfo/Asia/Seoul/etc/localtime
    WORKDIR /tmp
    RUN tar -xzf Python-3.9.6.tgz && rm Python-3.9.6.tgz
    RUN apt -y update && apt -y upgrade
    RUN apt -y install curl build-essential \
     libssl-dev libssl-ocaml-dev libbz2-dev libgdbm-dev liblzma-dev \
     libffi-dev uuid-dev libzip-dev libzip-ocaml-dev libsqlite3-dev \
     libdb-dev tk libreadline-dev tk8.6-dev
    WORKDIR /tmp/Python-3.9.6
    RUN ./configure --enable-optimizations && make -j 8 && make install