Dockerfile для разработки ruby on rails приложений в centos 6
Последний раз делаю:
03.12.2017
Когда создавался dockerfile, у docker была только версия 1.x их продукта. Много чего не работало. Наверняка, за это время много чего поменялось и много чего добавили / исправили. Буду признателен, если кто-то пожелает обновить.
### Dockerfile
FROM centos:centos6
MAINTAINER marley (www.marley.org)
RUN yum -y update; yum clean all
# RUN yum -y install epel-release; yum clean all
ENV DOCKER_ROOT_PASSWORD root
ENV DEVELOPER_USERNAME developer
ENV DEVELOPER_PASSWORD developer
ENV RUBY_VERSION 2.4.2
#ENV RAILS_VERSION 5.1.4
ENV RAILS_VERSION 4.2.10
RUN echo "root:\$DOCKER_ROOT_PASSWORD" | chpasswd
RUN yum install -y sudo which unzip tar bzip2 vim wget nc telnet screen tcpdump traceroute bind-utils lsof curl libcurl-devel openssl-devel git make gcc gcc-c++ kernel-devel && \
yum install -y readline-devel && \
yum install -y sqlite-devel mysql-devel postgresql-devel && \
yum clean all
# ==============================================
RUN echo '############################' >> /etc/sudoers
RUN echo '### ADDITIONAL SUDO USER ###' >> /etc/sudoers
RUN echo \$DEVELOPER_USERNAME 'ALL=(ALL:ALL) ALL' >> /etc/sudoers
RUN echo '############################' >> /etc/sudoers
RUN sed -i.gres "s/Defaults requiretty/#Defaults requiretty/g" /etc/sudoers
# ==============================================
# ====== GIT 2.X =========================
RUN yum install -y git tar gcc && \
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel && \
yum install -y perl-ExtUtils-MakeMaker
RUN mkdir -p /opt/git/2.3.0
WORKDIR /tmp
RUN git clone --depth=1 https://github.com/git/git.git
WORKDIR /tmp/git
RUN make prefix=/opt/git/2.3.0 all
RUN make prefix=/opt/git/2.3.0 install
# RUN yum remove -y git
# =======================================
RUN mkdir /project
RUN useradd $DEVELOPER_USERNAME
RUN echo "$DEVELOPER_USERNAME:\$DEVELOPER_PASSWORD" | chpasswd
RUN chown -R \$DEVELOPER_USERNAME /project/
# =================================================
USER \$DEVELOPER_USERNAME
WORKDIR /home/\$DEVELOPER_USERNAME
ENV HOME /home/\$DEVELOPER_USERNAME
RUN git clone git://github.com/sstephenson/rbenv.git $HOME/.rbenv
RUN git clone git://github.com/sstephenson/ruby-build.git $HOME/.rbenv/plugins/ruby-build
# =======================================
# =========== RUBY ENVIRONMENT ==========
RUN echo '### RUBY ON RAILS ###' >> $HOME/.bash_profile
RUN echo 'umask 011' >> $HOME/.bash_profile
RUN echo '' >> \$HOME/.bash_profile
RUN echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.bash_profile
RUN echo 'export PATH="$HOME/.rbenv/shims:$PATH"' >> $HOME/.bash_profile
RUN echo 'eval "$(rbenv init -)"' >> $HOME/.bash_profile
RUN echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> \$HOME/.bash_profile
RUN echo '### RUBY ON RAILS END ###' >> \$HOME/.bash_profile
# =======================================
ENV PATH $HOME/.rbenv/bin:$PATH
ENV PATH $HOME/.rbenv/shims:$PATH
RUN rbenv install $RUBY_VERSION
RUN rbenv global $RUBY_VERSION
RUN echo "gem: --no-ri --no-rdoc" > \$HOME/.gemrc
RUN gem update --system
RUN gem update
### TEMPORARY SOLUTION
### https://github.com/rubygems/rubygems/issues/2058
RUN rm -rf /home/developer/.rbenv/versions/2.4.2/bin/bundle
### TEMPORARY SOLUTION END
RUN gem install bundler --no-ri --no-rdoc
RUN rbenv rehash
RUN gem install rails -v \$RAILS_VERSION --no-ri --no-rdoc
RUN rbenv rehash
# =======================================
# =========== GIT 2.X ENVIRONMENT ==========
RUN echo '' >> $HOME/.bash_profile
RUN echo '' >> $HOME/.bash_profile
RUN echo '#### GIT ##############################' >> \$HOME/.bash_profile
RUN echo 'export GIT_HOME=/opt/git/2.3.0' >> $HOME/.bash_profile
RUN echo 'export PATH=$PATH:$GIT_HOME/bin' >> $HOME/.bash_profile
RUN echo '#### GIT END ##########################' >> \$HOME/.bash_profile
# =======================================
RUN echo \$DEVELOPER_PASSWORD | sudo -S /usr/bin/yum remove -y git
RUN source ~/.bash_profile
CMD ["/bin/bash"]
Создать image с удалением промежуточных контейнеров в случае успешного билда
$ docker build --rm -t centos6/rais:v01 .
-t - tag (название создаваемого image)
Теперь стало возможным указать название docerfile.
-f myDockerFile
Создать контейнер на базе подготовленного image
$ docker run -i -t -p 80:8080 --name dev -v /project:/project centos6/rais:v01 /bin/bash
В моем случае, я еще добавлю параметров.
$ docker run -i -t -p 80:8080 -p 3000:3000 -p 9000:9000 -p 1337:1337 --name dev -v /mnt/dsk0/project:/project -e SECRET_KEY_BASE=test centos6/rais:v01 /bin/bash
-p порт на хост машине, будет соответствовать порту в контейнере.
-v позволяет смонтировать каталог файловой системы вместе с контейнером docker, чтобы можно было кодить на хост машине а запускать в контейнере.
Можно также открыть:
3306 - для mysql
После подключения к контейнеру, выполнить.
На хостовой машине:
chown -R <username> /project/ && chmod 777 -R /project/
sudo: sorry, you must have a tty to run sudo - ошибка возникает, если вы пытаетесь выполнить команду в скрипте от другого пользователя при помощи sudo. Чтобы исправить, достаточно закомментировать Default requiretty в файле /etc/sudoers.
Для запуска команд под привелигированным пользователем, в файл /etc/sudoers добавляем username ALL=(ALL:ALL) ALL.