Dockerfile과 Bash

Preview:

Citation preview

이재홍

Dockerfile과 Bash

Docker Seoul Meetup #2 / September 27, 2014

http://pyrasis.com

Dockerfile이미지를 생성하기 위한 설정 파일RUN, CMD, ENTRYPOINT에서 Shell로 명령 실행

RUN: 이미지를 생성할 때CMD, ENTRYPOINT: 컨테이너를 시작할 때, 주로 스크립트를 실행

RUN cd /etcRUN echo "127.0.0.1 hello" >> hosts# 동작 안함

RUN은 독립적이다

RUN cd /etc && echo "127.0.0.1 hello" >> hosts

WORKDIR /etcRUN echo "127.0.0.1 hello" >> hosts

올바른 사용 방법

FROM ubuntu:14.04

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get updateRUN echo "mysql-server mysql-server/root_password password" | debconf-set-selectionsRUN echo "mysql-server mysql-server/root_password_again password" | debconf-set-selectionsRUN apt-get install -y mysql-server

RUN에서 사용자 입력 창, 프롬프트가 나오면 안된다

데비안(우분투)에서는 ENV로 환경 변수 설정ENV로 설정한 환경 변수는 다음에 나오는 RUN에 모두 적용됨Bash와 리다이렉션 파이프, 기타 방법을 사용하여 자동화

Bash(Bourne Again Shell)대부분 배포판에서 기본 Shell

CentOS: sh -> bashUbuntu: sh -> dash(Debian Almquist Shell)

각종 유닉스 명령과 조합하여 사용

$ echo "hello" > ./hello.txt$ echo "hello" > /dev/null

표준 출력(stdout) 리다이렉션

$ echo "cat" < ./hello.txt

표준 입력(stdin) 리다이렉션

$ echo "world" >> ./hello.txt

표준 출력 내용을 파일에 추가

2>2>>

표준 에러(stderr)를 파일로 저장, 추가

&>

표준 출력(stdout)과 표준 에러(stderr)를 모두 파일로 저장

1>&2

표준 출력(stdout)을 표준 에러(stderr)로 보냄

2>&1$ cat world.txt > /dev/null 2>&1

표준 에러(stderr)를 표준 출력(stdout)으로 보냄

$ ls -al | grep .txt

표준 출력을 다른 명령의 표준 입력으로 보냄

$ export HELLO=world

환경 변수 설정

현재 로그인한 사용자 계정 내에서 유효

$ HELLO=world

변수 설정

스크립트 내에서만 유효

$ sudo docker rm $(docker ps -aq)$ echo $(date)$ sudo docker rm `docker ps -aq`$ echo `date`

명령 실행 결과(stdout)를 변수화

$ echo '$USER'$USER

변수를 처리하지 않는 문자열

$ echo "$USER"pyrasis

변수를 처리하는 않는 문자열

$ str="World"$ echo "Hello ${str}"Hello World$ echo "Hello $str"Hello World

문자열 안에서 변수처리

$ WORLD=$ WORLD=${WORLD:-"abcd"}$ echo $WORLDabcd

값이 있으면 그대로 사용, NULL이면 기본값 사용

$ sudo docker run -d --name hello busybox:latest$ sudo docker run \ -d \ --name hello \ busybox:latest

한 줄을 여러 줄로 표현

$ cat <<< "User name is $USER"User name is pyrasis

문자열을 명령의 표준 입력으로 보냄

$ cat > ./hello.txt <<EOFHello WorldHost name is $(hostname)User name is $(USER)EOF

여러 줄의 문자열을 명령의 표준 입력으로 보냄

$ printf 80\\nexampleuser\\ny | example-configPort: 80User: exampleuserSave Configuration (y/n): y

지정한 형식대로 출력. 파이프와 연동하여 명령에 입력하는 효과

$ sed -i "s/hello/world/g" hello.txt

텍스트 파일에서 문자열 변경

#!/bin/bash

REVISION=$(expr substr $(git rev-parse --verify HEAD) 1 7)

Git 리비전 구하기. 실행 결과를 변수화

Dockerfile 예제

FROM ubuntu:14.04

RUN apt-get updateRUN apt-get install -y nginxRUN echo "\ndaemon off;" >> /etc/nginx/nginx.confRUN chown -R www-data:www-data /var/lib/nginx

WORKDIR /etc/nginx

CMD ["nginx"]

EXPOSE 80EXPOSE 443

리다이렉션을 활용하여 파일에 내용 추가

#!/bin/bash

mysql_install_db --user mysql > /dev/null

cat > /tmp/sql <<EOFUSE mysql;FLUSH PRIVILEGES;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;UPDATE user SET password=PASSWORD("$MYSQL_ROOT_PASSWORD") WHERE user='root';EOF

mysqld --bootstrap --verbose=0 < /tmp/sqlrm -rf /tmp/sql

mysqld

리다이렉션 활용여러 줄의 문자열을 파일로 저장변수 처리

ADD entrypoint.sh /entrypoint.shRUN chmod +x /entrypoint.shENTRYPOINT /entrypoint.sh

rbenv로 Ruby 설치FROM ubuntu:14.04

RUN apt-get updateRUN apt-get install -y autoconf bison build-essential libssl-dev \ libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev gitRUN apt-get install -y nginx nodejs curl libpq-dev

RUN git clone https://github.com/sstephenson/rbenv.git /root/.rbenvRUN git clone https://github.com/sstephenson/ruby-build.git /root/.rbenv/plugins/ruby-buildENV PATH /root/.rbenv/bin:/root/.rbenv/shims:$PATH

ENV CONFIGURE_OPTS --disable-install-docRUN rbenv install 2.1.3RUN rbenv global 2.1.3RUN rbenv init -

RUN echo 'gem: --no-rdoc --no-ri' >> /root/.gemrcRUN gem install bundlerRUN rbenv rehash

RUN echo "daemon off;" >> /etc/nginx/nginx.confRUN rm -rf /etc/nginx/sites-enabled/defaultADD exampleapp.conf /etc/nginx/sites-enabled/exampleapp.conf

WORKDIR /tmpADD Gemfile GemfileADD Gemfile.lock Gemfile.lockRUN bundle install

ADD ./ /var/www/exampleappWORKDIR /var/www/exampleappRUN chmod +x entrypoint.sh

EXPOSE 80ENTRYPOINT ./entrypoint.sh

#!/bin/bash

echo "export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe" > /etc/profile.d/oracle.shecho "export ORACLE_SID=XE" >> /etc/profile.d/oracle.shecho "export PATH=$PATH:/u01/app/oracle/product/11.2.0/xe/bin" >> /etc/profile.d/oracle.shsource /etc/profile.d/oracle.sh

printf 8080\\n1521\\n$ORACLE_PASSWORD\\n$ORACLE_PASSWORD\\nn | /etc/init.d/oracle-xe configureecho "root:$ORACLE_PASSWORD" | chpasswd

/usr/sbin/sshd -D

리다이렉션 활용printf를 활용하여 자동으로 설정 값 적용파이프 활용변수 처리

FROM ubuntu:14.04

RUN cd /etc/apt && \ sed -i 's/archive.ubuntu.com/ftp.daum.net/g' sources.list && \ sed -i 's/archive.ubuntu.com/ftp.daum.net/g' sources.list.d/proposed.list

RUN apt-get updateRUN apt-get install -y nginx

sed로 설정 파일 수정

[Unit]Description=Announce WebBindsTo=web.service

[Service]EnvironmentFile=/etc/environmentExecStart=/bin/sh -c \ "while true; \ do \ etcdctl set /services/web/nginx \ '{ \"host\": \"${COREOS_PUBLIC_IPV4}\", \"port\": 80 }' \ --ttl 60; \

sleep 45; \ done"ExecStop=/usr/bin/etcdctl rm /services/web/nginx

[X-Fleet]MachineOf=web.service

변수 처리한 줄을 여러 줄로 표현

"아마존 웹 서비스를 다루는 기술" 출간 및 원고 공개

http://www.pyrasis.com/private/2014/09/30/publish-the-art-of-amazon-web-services-book

Recommended