forked from forem/forem
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement docker-run.sh script + docker container build (forem#1844) …
…[ci skip]
- Loading branch information
1 parent
18d061a
commit 3104c48
Showing
6 changed files
with
924 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,65 @@ | ||
.dockerignore | ||
.git | ||
logs/ | ||
tmp/ | ||
node_modules/ | ||
.git | ||
.gitignore | ||
logs/ | ||
tmp/ | ||
node_modules/ | ||
|
||
################################## | ||
# | ||
# rest is COPIED from .gitignore | ||
# | ||
################################## | ||
|
||
# Ignore bundler config. | ||
/.bundle | ||
vendor/bundle | ||
|
||
# Ignore all logfiles and tempfiles. | ||
/log/* | ||
!/log/.keep | ||
/tmp | ||
.DS_Store | ||
.swp | ||
.approvals | ||
.torus.json | ||
coverage | ||
/tags | ||
|
||
# Ignore public uploads | ||
/public/uploads/* | ||
/public/c/* | ||
/public/i/* | ||
/public/assets/* | ||
|
||
# Ignore node_modules | ||
node_modules/ | ||
|
||
# Generated js bundles | ||
/app/assets/javascripts/generated/* | ||
latest.dump | ||
.byebug_history | ||
.gitdocs_build/ | ||
|
||
# Ignore application configuration | ||
/config/application.yml | ||
/public/packs | ||
/public/packs-test | ||
/node_modules | ||
config/database.yml | ||
|
||
# Ignore storybook static site generation | ||
storybook-static/ | ||
yarn-error.log | ||
|
||
# Ignore package-lock.json because we use yarn | ||
package-lock.json | ||
|
||
#Jetbrains Tools | ||
.idea/ | ||
|
||
#sitemap | ||
/public/sitemap.xml.gz | ||
|
||
# Development Docker storage location | ||
_docker-storage/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,31 +1,240 @@ | ||
FROM ruby:2.6.1 | ||
##################################################### | ||
# | ||
# Alpine container with | ||
# (this is used in DEV mode) | ||
# | ||
# + ruby:2.6.1 | ||
# + node:8.15.0 | ||
# + yarn:1.12.3 | ||
# | ||
##################################################### | ||
FROM node:8.15.1-alpine AS alpine-ruby-node | ||
|
||
# Make nodejs and yarn as dependencies | ||
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - | ||
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash | ||
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list | ||
#------------------------------------------------------------------------------------------ | ||
# | ||
# Ruby installation, taken from the official ruby alpine dockerfile | ||
# see : https://github.com/docker-library/ruby/blob/96fc06fb331a20ba823ecc11563a99d1eb94203f/2.6/alpine3.9/Dockerfile | ||
# | ||
#------------------------------------------------------------------------------------------ | ||
|
||
# Install dependencies and perform clean-up | ||
RUN apt-get update -qq && apt-get install -y \ | ||
build-essential \ | ||
nodejs \ | ||
yarn \ | ||
&& apt-get -q clean \ | ||
&& rm -rf /var/lib/apt/lists | ||
RUN apk add --no-cache \ | ||
gmp-dev | ||
|
||
# skip installing gem documentation | ||
RUN mkdir -p /usr/local/etc \ | ||
&& { \ | ||
echo 'install: --no-document'; \ | ||
echo 'update: --no-document'; \ | ||
} >> /usr/local/etc/gemrc | ||
|
||
ENV RUBY_MAJOR 2.6 | ||
ENV RUBY_VERSION 2.6.1 | ||
ENV RUBY_DOWNLOAD_SHA256 47b629808e9fd44ce1f760cdf3ed14875fc9b19d4f334e82e2cf25cb2898f2f2 | ||
ENV RUBYGEMS_VERSION 3.0.3 | ||
|
||
# some of ruby's build scripts are written in ruby | ||
# we purge system ruby later to make sure our final image uses what we just built | ||
# readline-dev vs libedit-dev: https://bugs.ruby-lang.org/issues/11869 and https://github.com/docker-library/ruby/issues/75 | ||
RUN set -ex \ | ||
\ | ||
&& apk add --no-cache --virtual .ruby-builddeps \ | ||
autoconf \ | ||
bison \ | ||
bzip2 \ | ||
bzip2-dev \ | ||
ca-certificates \ | ||
coreutils \ | ||
dpkg-dev dpkg \ | ||
gcc \ | ||
gdbm-dev \ | ||
glib-dev \ | ||
libc-dev \ | ||
libffi-dev \ | ||
libxml2-dev \ | ||
libxslt-dev \ | ||
linux-headers \ | ||
make \ | ||
ncurses-dev \ | ||
openssl \ | ||
openssl-dev \ | ||
procps \ | ||
readline-dev \ | ||
ruby \ | ||
tar \ | ||
xz \ | ||
yaml-dev \ | ||
zlib-dev \ | ||
\ | ||
&& wget -O ruby.tar.xz "https://cache.ruby-lang.org/pub/ruby/${RUBY_MAJOR%-rc}/ruby-$RUBY_VERSION.tar.xz" \ | ||
&& echo "$RUBY_DOWNLOAD_SHA256 *ruby.tar.xz" | sha256sum -c - \ | ||
\ | ||
&& mkdir -p /usr/src/ruby \ | ||
&& tar -xJf ruby.tar.xz -C /usr/src/ruby --strip-components=1 \ | ||
&& rm ruby.tar.xz \ | ||
\ | ||
&& cd /usr/src/ruby \ | ||
\ | ||
# https://github.com/docker-library/ruby/issues/196 | ||
# https://bugs.ruby-lang.org/issues/14387#note-13 (patch source) | ||
# https://bugs.ruby-lang.org/issues/14387#note-16 ("Therefore ncopa's patch looks good for me in general." -- only breaks glibc which doesn't matter here) | ||
&& wget -O 'thread-stack-fix.patch' 'https://bugs.ruby-lang.org/attachments/download/7081/0001-thread_pthread.c-make-get_main_stack-portable-on-lin.patch' \ | ||
&& echo '3ab628a51d92fdf0d2b5835e93564857aea73e0c1de00313864a94a6255cb645 *thread-stack-fix.patch' | sha256sum -c - \ | ||
&& patch -p1 -i thread-stack-fix.patch \ | ||
&& rm thread-stack-fix.patch \ | ||
\ | ||
# hack in "ENABLE_PATH_CHECK" disabling to suppress: | ||
# warning: Insecure world writable dir | ||
&& { \ | ||
echo '#define ENABLE_PATH_CHECK 0'; \ | ||
echo; \ | ||
cat file.c; \ | ||
} > file.c.new \ | ||
&& mv file.c.new file.c \ | ||
\ | ||
&& autoconf \ | ||
&& gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" \ | ||
# the configure script does not detect isnan/isinf as macros | ||
&& export ac_cv_func_isnan=yes ac_cv_func_isinf=yes \ | ||
&& ./configure \ | ||
--build="$gnuArch" \ | ||
--disable-install-doc \ | ||
--enable-shared \ | ||
&& make -j "$(nproc)" \ | ||
&& make install \ | ||
\ | ||
&& runDeps="$( \ | ||
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \ | ||
| tr ',' '\n' \ | ||
| sort -u \ | ||
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ | ||
)" \ | ||
&& apk add --no-network --virtual .ruby-rundeps $runDeps \ | ||
bzip2 \ | ||
ca-certificates \ | ||
libffi-dev \ | ||
procps \ | ||
yaml-dev \ | ||
zlib-dev \ | ||
&& apk del --no-network .ruby-builddeps \ | ||
&& cd / \ | ||
&& rm -r /usr/src/ruby \ | ||
# make sure bundled "rubygems" is older than RUBYGEMS_VERSION (https://github.com/docker-library/ruby/issues/246) | ||
&& ruby -e 'exit(Gem::Version.create(ENV["RUBYGEMS_VERSION"]) > Gem::Version.create(Gem::VERSION))' \ | ||
&& gem update --system "$RUBYGEMS_VERSION" && rm -r /root/.gem/ \ | ||
# rough smoke test | ||
&& ruby --version && gem --version && bundle --version | ||
|
||
# install things globally, for great justice | ||
# and don't create ".bundle" in all our apps | ||
ENV GEM_HOME /usr/local/bundle | ||
ENV BUNDLE_PATH="$GEM_HOME" \ | ||
BUNDLE_SILENCE_ROOT_WARNING=1 \ | ||
BUNDLE_APP_CONFIG="$GEM_HOME" | ||
# path recommendation: https://github.com/bundler/bundler/pull/6469#issuecomment-383235438 | ||
ENV PATH $GEM_HOME/bin:$BUNDLE_PATH/gems/bin:$PATH | ||
# adjust permissions of a few directories for running "gem install" as an arbitrary user | ||
RUN mkdir -p "$GEM_HOME" && chmod 777 "$GEM_HOME" | ||
# (BUNDLE_PATH = GEM_HOME, no need to mkdir/chown both) | ||
|
||
#------------------------------------------------------------------------------------------ | ||
# | ||
# End of ruby installation | ||
# | ||
#------------------------------------------------------------------------------------------ | ||
|
||
# Install alpine eqivalent for "build-essential" | ||
# | ||
# and other dependencies required by dev.to various | ||
# ruby dependencies (postgresql-dev, tzdata) | ||
RUN apk add --no-cache alpine-sdk postgresql-dev tzdata | ||
|
||
# Im installing bash, as im a bash addict (not that great with sh) | ||
RUN apk add bash | ||
|
||
# Lets setup the rails directory | ||
# (@TODO - consider a production version?) | ||
WORKDIR /usr/src/app | ||
ENV RAILS_ENV development | ||
|
||
# Installing Ruby dependencies | ||
COPY Gemfile* ./ | ||
##################################################### | ||
# | ||
# Lets prepare the dev.to source code files | ||
# WITHOUT docker related files | ||
# | ||
# This allow us to modify the docker | ||
# entrypoint / run file without recompiling | ||
# the entire application | ||
# (especially when creating this buidl script =| ) | ||
# | ||
# (@TODO - improve and review ignore to blacklist unneded items) | ||
# | ||
##################################################### | ||
|
||
# | ||
# Prepare the source code and remove any uneeded files | ||
# | ||
FROM alpine-ruby-node AS source-code-repo | ||
|
||
# The workdir | ||
WORKDIR /usr/src/app | ||
# Copy source code | ||
COPY ./ /usr/src/app/ | ||
# remove docker related files | ||
RUN rm Dockerfile && rm docker-* | ||
|
||
# | ||
# Does the source code build | ||
# | ||
FROM alpine-ruby-node AS source-code-build | ||
|
||
# Copy over files | ||
COPY --from=source-code-repo /usr/src/app/ /usr/src/app/ | ||
|
||
# Run the various installer | ||
RUN gem install bundler | ||
RUN bundle install --jobs 20 --retry 5 | ||
|
||
# Install JavaScript dependencies | ||
COPY yarn.lock ./ | ||
ENV YARN_INTEGRITY_ENABLED "false" | ||
RUN yarn install && yarn check --integrity | ||
|
||
ENTRYPOINT ["bundle", "exec"] | ||
##################################################### | ||
# | ||
# Lets build the DEMO dev.to image | ||
# | ||
##################################################### | ||
FROM alpine-ruby-node | ||
|
||
# Copy over the application code (without docker related files) | ||
COPY --from=source-code-build /usr/src/app/ /usr/src/app/ | ||
|
||
# Copy over docker related files | ||
COPY Dockerfile [(docker-)]* /usr/src/app/ | ||
|
||
# | ||
# Execution environment variables | ||
# | ||
|
||
# timeout extension requried to ensure | ||
# system work properly on first time load | ||
ENV RACK_TIMEOUT_WAIT_TIMEOUT=10000 \ | ||
RACK_TIMEOUT_SERVICE_TIMEOUT=10000 \ | ||
STATEMENT_TIMEOUT=10000 | ||
|
||
# Run mode configuration between dev / demo | ||
# for entrypoint script behaviour | ||
ENV RUN_MODE="demo" | ||
|
||
# Database URL configuration - with user/pass | ||
ENV DATABASE_URL="postgresql://devto:devto@db:5432/PracticalDeveloper_development" | ||
|
||
# DB setup / migrate script triggers on boot | ||
ENV DB_SETUP="true" \ | ||
DB_MIGRATE="true" | ||
|
||
# | ||
# Lets setup the public uploads folder volume | ||
# | ||
RUN mkdir -p /usr/src/app/public/uploads | ||
VOLUME /usr/src/app/public/uploads | ||
|
||
CMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"] | ||
# Entrypoint and command to start the server | ||
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"] | ||
CMD [] |
Oops, something went wrong.