-
Notifications
You must be signed in to change notification settings - Fork 0
/
Dockerfile.slim
126 lines (89 loc) · 2.76 KB
/
Dockerfile.slim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
##
## Base
##
FROM ruby:3.0.0-slim as base
# labels from https://github.com/opencontainers/image-spec/blob/master/annotations.md
LABEL org.opencontainers.image.authors=conradwt@gmail.com
LABEL org.opencontainers.image.created=$CREATED_DATE
LABEL org.opencontainers.image.revision=$SOURCE_COMMIT
LABEL org.opencontainers.image.title="Zero To GraphQL Using Rails"
LABEL org.opencontainers.image.url=https://hub.docker.com/u/conradwt/zero-rails
LABEL org.opencontainers.image.source=https://github.com/conradwt/zero-to-graphql-using-rails
LABEL org.opencontainers.image.licenses=MIT
LABEL com.conradtaylor.ruby_version=$RUBY_VERSION
# set this with shell variables at build-time.
# If they aren't set, then not-set will be default.
ARG CREATED_DATE=not-set
ARG SOURCE_COMMIT=not-set
# environment variables
ENV APP_PATH /app
ENV BUNDLE_VERSION 2.2.3
ENV BUNDLE_PATH /usr/local/bundle/gems
ENV TMP_PATH /tmp/
ENV RAILS_LOG_TO_STDOUT true
ENV RAILS_PORT 3000
# create application user.
RUN groupadd --gid 1000 darnoc \
&& useradd --uid 1000 --gid darnoc --shell /bin/bash --create-home darnoc
# install build and runtime dependencies
RUN apt-get update -qq -y && \
apt-get install -qq --no-install-recommends -y \
build-essential=12.6 \
bzip2=1.0.6-9.2~deb10u1 \
ca-certificates=20200601~deb10u2 \
curl=7.64.0-4+deb10u1 \
libfontconfig1=2.13.1-2 \
libpq-dev=11.10-0+deb10u1 && \
rm -rf /var/lib/apt/lists/*
ENV RAILS_ENV=production
EXPOSE ${RAILS_PORT}
ENV PORT ${RAILS_PORT}
WORKDIR ${APP_PATH}
COPY Gemfile* ./
# RUN bundle config list
RUN gem install bundler --version "${BUNDLE_VERSION}" && \
rm -rf ${GEM_HOME}/cache/*
RUN bundle config set without 'development test'
RUN bundle check || bundle install --jobs 20 --retry 5
ENV PATH ./bin:$PATH
ENV TINI_VERSION v0.18.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
# Why should this go into `base` instead of `prod` stage?
# CMD ["rails", "server", "-b", "0.0.0.0", "-e", "production"]
##
## Development
##
FROM base as dev
ENV RAILS_ENV=development
# RUN bundle config list
RUN bundle config --delete without
RUN bundle config --delete with
RUN bundle check || bundle install --jobs 20 --retry 5
# Add a script to be executed every time the container starts.
# COPY entrypoint.sh /usr/bin/
# RUN chmod +x /usr/bin/entrypoint.sh
# ENTRYPOINT ["entrypoint.sh"]
USER darnoc
CMD ["rails", "server", "-b", "0.0.0.0"]
##
## Test
##
FROM dev as test
COPY . .
RUN bundle exec rspec
##
## Pre-Production
##
FROM test as pre-prod
USER root
RUN rm -rf ./spec
##
## Production
##
FROM base as prod
COPY --from=pre-prod /app /app
HEALTHCHECK CMD curl http://127.0.0.1/ || exit 1
USER darnoc
CMD ["rails", "server", "-b", "0.0.0.0", "-e", "production"]