Skip to content

Commit bd9a4ca

Browse files
DEV: partially bake in env
It may be useful for launcher2 build to bake in some env, allowing for default env to run from a built image. Introduce defaultBakeEnv as a list of env to bake into images. This allows for folks pulling images to not need to mark every env variable, allowing for some convenience in starting images.
1 parent 9835070 commit bd9a4ca

File tree

2 files changed

+113
-4
lines changed

2 files changed

+113
-4
lines changed

launcher_go/v2/config/config.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ import (
1616

1717
const defaultBootCommand = "/sbin/boot"
1818

19+
var defaultBakeEnv = []string{
20+
"RAILS_ENV",
21+
"UNICORN_WORKERS",
22+
"UNICORN_SIDEKIQS",
23+
"RUBY_GC_HEAP_GROWTH_MAX_SLOTS",
24+
"RUBY_GC_HEAP_INIT_SLOTS",
25+
"RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR",
26+
"CREATE_DB_ON_BOOT",
27+
"MIGRATE_ON_BOOT",
28+
"PRECOMPILE_ON_BOOT",
29+
}
30+
1931
type Config struct {
2032
Name string `yaml:-`
2133
rawYaml []string
@@ -137,6 +149,8 @@ func (config *Config) Dockerfile(pupsArgs string, bakeEnv bool) string {
137149
builder.WriteString(config.dockerfileArgs() + "\n")
138150
if bakeEnv {
139151
builder.WriteString(config.dockerfileEnvs() + "\n")
152+
} else {
153+
builder.WriteString(config.dockerfileDefaultEnvs() + "\n")
140154
}
141155
builder.WriteString(config.dockerfileExpose() + "\n")
142156
builder.WriteString("COPY config.yaml /temp-config.yaml\n")
@@ -190,6 +204,17 @@ func (config *Config) dockerfileEnvs() string {
190204
return strings.Join(builder, "\n")
191205
}
192206

207+
func (config *Config) dockerfileDefaultEnvs() string {
208+
builder := []string{}
209+
for k, _ := range config.Env {
210+
if(slices.Contains(defaultBakeEnv, k)) {
211+
builder = append(builder, "ENV "+k+"=${"+k+"}")
212+
}
213+
}
214+
slices.Sort(builder)
215+
return strings.Join(builder, "\n")
216+
}
217+
193218
func (config *Config) dockerfileArgs() string {
194219
builder := []string{}
195220
for k, _ := range config.Env {

launcher_go/v2/config/config_test.go

Lines changed: 88 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,95 @@ var _ = Describe("Config", func() {
3737
Expect(string(out[:])).To(ContainSubstring("DISCOURSE_DEVELOPER_EMAILS: '[email protected],[email protected]'"))
3838
})
3939

40-
It("can convert pups config to dockerfile format", func() {
40+
It("can convert pups config to dockerfile format and bake in default env", func() {
4141
dockerfile := conf.Dockerfile("", false)
42-
Expect(dockerfile).To(ContainSubstring("ARG DISCOURSE_DEVELOPER_EMAILS"))
43-
Expect(dockerfile).To(ContainSubstring("RUN cat /temp-config.yaml"))
44-
Expect(dockerfile).To(ContainSubstring("EXPOSE 80"))
42+
Expect(dockerfile).To(ContainSubstring(`FROM ${dockerfile_from_image}
43+
ARG DISCOURSE_DB_HOST
44+
ARG DISCOURSE_DB_PASSWORD
45+
ARG DISCOURSE_DB_PORT
46+
ARG DISCOURSE_DB_SOCKET
47+
ARG DISCOURSE_DEVELOPER_EMAILS
48+
ARG DISCOURSE_HOSTNAME
49+
ARG DISCOURSE_REDIS_HOST
50+
ARG DISCOURSE_SMTP_ADDRESS
51+
ARG DISCOURSE_SMTP_PASSWORD
52+
ARG DISCOURSE_SMTP_USER_NAME
53+
ARG LANG
54+
ARG LANGUAGE
55+
ARG LC_ALL
56+
ARG MULTI
57+
ARG RAILS_ENV
58+
ARG REPLACED
59+
ARG RUBY_GC_HEAP_GROWTH_MAX_SLOTS
60+
ARG RUBY_GC_HEAP_INIT_SLOTS
61+
ARG RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR
62+
ARG UNICORN_SIDEKIQS
63+
ARG UNICORN_WORKERS
64+
ENV RAILS_ENV=${RAILS_ENV}
65+
ENV RUBY_GC_HEAP_GROWTH_MAX_SLOTS=${RUBY_GC_HEAP_GROWTH_MAX_SLOTS}
66+
ENV RUBY_GC_HEAP_INIT_SLOTS=${RUBY_GC_HEAP_INIT_SLOTS}
67+
ENV RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=${RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR}
68+
ENV UNICORN_SIDEKIQS=${UNICORN_SIDEKIQS}
69+
ENV UNICORN_WORKERS=${UNICORN_WORKERS}
70+
EXPOSE 443
71+
EXPOSE 80
72+
EXPOSE 90
73+
COPY config.yaml /temp-config.yaml
74+
RUN cat /temp-config.yaml | /usr/local/bin/pups --stdin && rm /temp-config.yaml
75+
CMD ["/sbin/boot"]`))
76+
})
77+
78+
It("can generate a dockerfile with all env baked into the image", func() {
79+
dockerfile := conf.Dockerfile("", true)
80+
Expect(dockerfile).To(ContainSubstring(`FROM ${dockerfile_from_image}
81+
ARG DISCOURSE_DB_HOST
82+
ARG DISCOURSE_DB_PASSWORD
83+
ARG DISCOURSE_DB_PORT
84+
ARG DISCOURSE_DB_SOCKET
85+
ARG DISCOURSE_DEVELOPER_EMAILS
86+
ARG DISCOURSE_HOSTNAME
87+
ARG DISCOURSE_REDIS_HOST
88+
ARG DISCOURSE_SMTP_ADDRESS
89+
ARG DISCOURSE_SMTP_PASSWORD
90+
ARG DISCOURSE_SMTP_USER_NAME
91+
ARG LANG
92+
ARG LANGUAGE
93+
ARG LC_ALL
94+
ARG MULTI
95+
ARG RAILS_ENV
96+
ARG REPLACED
97+
ARG RUBY_GC_HEAP_GROWTH_MAX_SLOTS
98+
ARG RUBY_GC_HEAP_INIT_SLOTS
99+
ARG RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR
100+
ARG UNICORN_SIDEKIQS
101+
ARG UNICORN_WORKERS
102+
ENV DISCOURSE_DB_HOST=${DISCOURSE_DB_HOST}
103+
ENV DISCOURSE_DB_PASSWORD=${DISCOURSE_DB_PASSWORD}
104+
ENV DISCOURSE_DB_PORT=${DISCOURSE_DB_PORT}
105+
ENV DISCOURSE_DB_SOCKET=${DISCOURSE_DB_SOCKET}
106+
ENV DISCOURSE_DEVELOPER_EMAILS=${DISCOURSE_DEVELOPER_EMAILS}
107+
ENV DISCOURSE_HOSTNAME=${DISCOURSE_HOSTNAME}
108+
ENV DISCOURSE_REDIS_HOST=${DISCOURSE_REDIS_HOST}
109+
ENV DISCOURSE_SMTP_ADDRESS=${DISCOURSE_SMTP_ADDRESS}
110+
ENV DISCOURSE_SMTP_PASSWORD=${DISCOURSE_SMTP_PASSWORD}
111+
ENV DISCOURSE_SMTP_USER_NAME=${DISCOURSE_SMTP_USER_NAME}
112+
ENV LANG=${LANG}
113+
ENV LANGUAGE=${LANGUAGE}
114+
ENV LC_ALL=${LC_ALL}
115+
ENV MULTI=${MULTI}
116+
ENV RAILS_ENV=${RAILS_ENV}
117+
ENV REPLACED=${REPLACED}
118+
ENV RUBY_GC_HEAP_GROWTH_MAX_SLOTS=${RUBY_GC_HEAP_GROWTH_MAX_SLOTS}
119+
ENV RUBY_GC_HEAP_INIT_SLOTS=${RUBY_GC_HEAP_INIT_SLOTS}
120+
ENV RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=${RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR}
121+
ENV UNICORN_SIDEKIQS=${UNICORN_SIDEKIQS}
122+
ENV UNICORN_WORKERS=${UNICORN_WORKERS}
123+
EXPOSE 443
124+
EXPOSE 80
125+
EXPOSE 90
126+
COPY config.yaml /temp-config.yaml
127+
RUN cat /temp-config.yaml | /usr/local/bin/pups --stdin && rm /temp-config.yaml
128+
CMD ["/sbin/boot"]`))
45129
})
46130

47131
Context("hostname tests", func() {

0 commit comments

Comments
 (0)