ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Dockerfile
    Devops/Docker 2019. 11. 1. 09:12
    반응형

    docker 를 쓰기 시작했다면 dockerfile을 사용할수 밖에 없다. 도커 이미지를 만들때 꼭 필요하기 때문이다. dokcerhub 에 가봐도 dockfile 을 제공을 해준다. 개인적으로 설정이 귀찮거나 반복되는것들은 dockerfile 를 받아서 약간의 수정을하여 별도 관리를한다. 

     많이 쓰는 도커 파일 중 mysql 파일 하나를 샘플로 기록해놓으려고한다. 개발할때 AWS 에서 인스턴스를 받고 설정하고 하는 과정이 굉장히 긴경우가 많다. 결재도 올려야하고 방화벽도 확인해야하고.... Mac 을 쓴다면 도커를 좀더 편하게 쓰겠지만 난 Windows 유저이기 때문에 일단 Docker for Windows 를 사용하고 있다. 

    FROM debian:stretch-slim
    
    # add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
    RUN groupadd -r mysql && useradd -r -g mysql mysql
    
    RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/*
    
    # add gosu for easy step-down from root
    ENV GOSU_VERSION 1.7
    RUN set -x \
    	&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
    	&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
    	&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
    	&& export GNUPGHOME="$(mktemp -d)" \
    	&& gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
    	&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
    	&& gpgconf --kill all \
    	&& rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc \
    	&& chmod +x /usr/local/bin/gosu \
    	&& gosu nobody true \
    	&& apt-get purge -y --auto-remove ca-certificates wget
    
    RUN mkdir /docker-entrypoint-initdb.d
    
    RUN apt-get update && apt-get install -y --no-install-recommends \
    # for MYSQL_RANDOM_ROOT_PASSWORD
    		pwgen \
    # for mysql_ssl_rsa_setup
    		openssl \
    # FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
    # File::Basename
    # File::Copy
    # Sys::Hostname
    # Data::Dumper
    		perl \
    	&& rm -rf /var/lib/apt/lists/*
    
    RUN set -ex; \
    # gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
    	key='A4A9406876FCBD3C456770C88C718D3B5072E1F5'; \
    	export GNUPGHOME="$(mktemp -d)"; \
    	gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
    	gpg --batch --export "$key" > /etc/apt/trusted.gpg.d/mysql.gpg; \
    	gpgconf --kill all; \
    	rm -rf "$GNUPGHOME"; \
    	apt-key list > /dev/null
    
    ENV MYSQL_MAJOR 8.0
    ENV MYSQL_VERSION 8.0.17-1debian9
    
    RUN echo "deb http://repo.mysql.com/apt/debian/ stretch mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list
    
    # the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
    # also, we set debconf keys to make APT a little quieter
    RUN { \
    		echo mysql-community-server mysql-community-server/data-dir select ''; \
    		echo mysql-community-server mysql-community-server/root-pass password ''; \
    		echo mysql-community-server mysql-community-server/re-root-pass password ''; \
    		echo mysql-community-server mysql-community-server/remove-test-db select false; \
    	} | debconf-set-selections \
    	&& apt-get update && apt-get install -y mysql-community-client="${MYSQL_VERSION}" mysql-community-server-core="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* \
    	&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \
    	&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
    # ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime
    	&& chmod 777 /var/run/mysqld
    
    VOLUME /var/lib/mysql
    # Config files
    COPY config/ /etc/mysql/
    COPY docker-entrypoint.sh /usr/local/bin/
    RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
    ENTRYPOINT ["docker-entrypoint.sh"]
    
    EXPOSE 3306 33060
    CMD ["mysqld"]

    위 도커파일은 내가 생성한게아니라 단순히 구글링하여 찾은 mysql 용 도커 파일이다. 솔직히 몇개빼고는 딱히 확인 안하고 그대로 이미지를 빌드하여 컨테이너를 생성한다. 

     나중에 추가로 기록을 하겠지만 docker-compose 를 쓰면 더욱 편하겠지만, docker-compose 를 쓰더라도 dockerfile 을 같이 혼용하는 경우도 있어서 앞으로도 계속 dockerfile 은 잊지 말고 잘 기억하도록 해야 할거 같다. 

     

     간단한 도커파일도 남겨 놓으려 한다. 최근에 zulu JDK 를 사용하면서 자바설정하는게 귀찮은 경우가 많았다. 별것도 아닌데 참 막상 하려면 왜이리 귀찮은지... 

    FROM ubuntu:18.04
      
    #
    # UTF-8 by default
    #
    RUN apt-get -qq update && \
        apt-get -qqy install gnupg2 locales && \
        locale-gen en_US.UTF-8 && \
        rm -rf /var/lib/apt/lists/*
    
    ENV LANG en_US.UTF-8
    ENV LANGUAGE en_US:en
    ENV LC_ALL en_US.UTF-8
    
    #
    # Pull Zulu OpenJDK binaries from official repository:
    #
    RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 && \
        echo "deb http://repos.azulsystems.com/ubuntu stable main" >> /etc/apt/sources.list.d/zulu.list && \
        apt-get -qq update && \
        apt-get -qqy install zulu-8=8.40.0.25 && \
        rm -rf /var/lib/apt/lists/*

    단순하다 OS 를 설정하고 apt-get 을 이용하고 ... 인코딩이라던거 그런거 맞춰주고 azulsystem 의 키정도를 설정해준뒤 간단하게 zulu jdk 1.8 을 설정하는 게 다이다. 심지어 이 내용은 내가 만든게 아니라 azul 에서 dockerhub 에 이미 올려둔 도커파일이다. 도커파일이 뭔지 어떻게 구성하는지 보려면 이런 단순 샘플로 공부해보는것도 좋은거 같다. 

    반응형

    'Devops > Docker' 카테고리의 다른 글

    Docker-compose 사용법 - 기초  (0) 2019.11.01
    Docker 명령어  (0) 2019.11.01
Designed by Tistory.