Download pdf - Dockerfile과 Bash

Transcript
Page 1: Dockerfile과 Bash

이재홍

Dockerfile과 Bash

Docker Seoul Meetup #2 / September 27, 2014

http://pyrasis.com

Page 2: Dockerfile과 Bash

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

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

Page 3: Dockerfile과 Bash

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

올바른 사용 방법

Page 4: Dockerfile과 Bash

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와 리다이렉션 파이프, 기타 방법을 사용하여 자동화

Page 5: Dockerfile과 Bash

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

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

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

Page 6: Dockerfile과 Bash

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

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

$ echo "cat" < ./hello.txt

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

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

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

2>2>>

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

Page 7: Dockerfile과 Bash

&>

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

1>&2

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

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

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

$ ls -al | grep .txt

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

Page 8: Dockerfile과 Bash

$ export HELLO=world

환경 변수 설정

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

$ HELLO=world

변수 설정

스크립트 내에서만 유효

Page 9: Dockerfile과 Bash

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

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

$ echo '$USER'$USER

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

$ echo "$USER"pyrasis

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

Page 10: Dockerfile과 Bash

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

문자열 안에서 변수처리

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

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

Page 11: Dockerfile과 Bash

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

한 줄을 여러 줄로 표현

Page 12: Dockerfile과 Bash

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

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

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

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

Page 13: Dockerfile과 Bash

$ 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 리비전 구하기. 실행 결과를 변수화

Page 14: Dockerfile과 Bash

Dockerfile 예제

Page 15: Dockerfile과 Bash

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

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

Page 16: Dockerfile과 Bash

#!/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

Page 17: Dockerfile과 Bash

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

Page 18: Dockerfile과 Bash

#!/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를 활용하여 자동으로 설정 값 적용파이프 활용변수 처리

Page 19: Dockerfile과 Bash

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로 설정 파일 수정

Page 20: Dockerfile과 Bash

[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

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

Page 22: Dockerfile과 Bash

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

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


Recommended