View
640
Download
3
Category
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
변수 처리한 줄을 여러 줄로 표현
"가장 빨리 만나는 Docker" 출간 및 원고 공개http://www.pyrasis.com/private/2014/11/30/publish-docker-for-the-really-impatient-book
"아마존 웹 서비스를 다루는 기술" 출간 및 원고 공개
http://www.pyrasis.com/private/2014/09/30/publish-the-art-of-amazon-web-services-book
Recommended