@@ -41,15 +41,15 @@ RUN chmod 0555 /bin/tini
4141<% } else { %>
4242
4343# Install required packages to extract the Elasticsearch distribution
44- <% if (docker_base == ' default' || docker_base == ' cloud ' ) { %>
44+ <% if (docker_base == ' default') { %>
4545RUN <%= retry.loop(package_manager, "${package_manager} update && DEBIAN_FRONTEND=noninteractive ${package_manager} install -y curl ") %>
46- <% } else if (docker_base == "wolfi") { %>
46+ <% } else if (docker_base == "wolfi" || docker_base == "fips" ) { %>
4747RUN <%= retry.loop(package_manager, "export DEBIAN_FRONTEND=noninteractive && ${package_manager} update && ${package_manager} update && ${package_manager} add --no-cache curl") %>
4848<% } else { %>
4949RUN <%= retry.loop(package_manager, "${package_manager} install -y findutils tar gzip") %>
5050<% } %>
5151
52- <% if (docker_base != ' wolfi') { %>
52+ <% if (docker_base != ' wolfi' && docker_base != ' fips ' ) { %>
5353 # `tini` is a tiny but valid init for containers. This is used to cleanly
5454 # control how ES and any child processes are shut down.
5555 # For wolfi we pick it from the blessed wolfi package registry.
@@ -117,25 +117,46 @@ RUN sed -i -e 's/ES_DISTRIBUTION_TYPE=tar/ES_DISTRIBUTION_TYPE=docker/' bin/elas
117117 chmod 0775 bin config config/jvm.options.d data logs plugins && \\
118118 find config -type f -exec chmod 0664 {} +
119119
120- <% if (docker_base == "cloud" ) { %>
121- COPY filebeat-${version}.tar.gz metricbeat-${version}.tar.gz /tmp/
122- RUN set -eux ; \\
123- for beat in filebeat metricbeat ; do \\
124- if [ ! -s /tmp/\$ beat-${version}.tar.gz ]; then \\
125- echo "/tmp/\$ beat-${version}.tar.gz is empty - cannot uncompress" 2>&1 ; \\
126- exit 1 ; \\
127- fi ; \\
128- if ! tar tf /tmp/\$ beat-${version}.tar.gz >/dev/null; then \\
129- echo "/tmp/\$ beat-${version}.tar.gz is corrupt - cannot uncompress" 2>&1 ; \\
130- exit 1 ; \\
131- fi ; \\
132- mkdir -p /opt/\$ beat ; \\
133- tar xf /tmp/\$ beat-${version}.tar.gz -C /opt/\$ beat --strip-components=1 ; \\
134- done
135-
136- # Add plugins infrastructure
137- RUN mkdir -p /opt/plugins/archive
138- RUN chmod -R 0555 /opt/plugins
120+ <% if (docker_base == "fips" ) { %>
121+ # Add plugins infrastructure
122+ RUN mkdir -p /opt/plugins/archive
123+ RUN chmod -R 0555 /opt/plugins
124+
125+ RUN mkdir -p /fips/libs
126+ COPY fips/libs/*.jar /fips/libs/
127+
128+ COPY filebeat-${version}.tar.gz metricbeat-${version}.tar.gz /tmp/
129+ RUN set -eux ; \\
130+ for beat in filebeat metricbeat ; do \\
131+ if [ ! -s /tmp/\$ beat-${version}.tar.gz ]; then \\
132+ echo "/tmp/\$ beat-${version}.tar.gz is empty - cannot uncompress" 2>&1 ; \\
133+ exit 1 ; \\
134+ fi ; \\
135+ if ! tar tf /tmp/\$ beat-${version}.tar.gz >/dev/null; then \\
136+ echo "/tmp/\$ beat-${version}.tar.gz is corrupt - cannot uncompress" 2>&1 ; \\
137+ exit 1 ; \\
138+ fi ; \\
139+ mkdir -p /opt/\$ beat ; \\
140+ tar xf /tmp/\$ beat-${version}.tar.gz -C /opt/\$ beat --strip-components=1 ; \\
141+ done
142+
143+ COPY plugins/*.zip /opt/plugins/archive/
144+
145+ RUN chown 1000:1000 /opt/plugins/archive/*
146+ RUN chmod 0444 /opt/plugins/archive/*
147+
148+ COPY fips/resources/fips_java.security /usr/share/elasticsearch/config/fips_java.security
149+ COPY fips/resources/fips_java.policy /usr/share/elasticsearch/config/fips_java.policy
150+
151+ WORKDIR /usr/share/elasticsearch/config
152+
153+ # # Add fips specific JVM options
154+ RUN cat <<EOF > /usr/share/elasticsearch/config/jvm.options.d/fips.options
155+ -Djavax.net.ssl.keyStoreType=BCFKS
156+ -Dorg.bouncycastle.fips.approved_only=true
157+ -Djava.security.properties=config/fips_java.security
158+ -Djava.security.policy=config/fips_java.policy
159+ EOF
139160<% } %>
140161
141162# ###############################################################################
@@ -157,7 +178,7 @@ RUN ${package_manager} update --setopt=tsflags=nodocs -y && \\
157178 nc shadow-utils zip findutils unzip procps-ng && \\
158179 ${package_manager} clean all
159180
160- <% } else if (docker_base == "wolfi") { %>
181+ <% } else if (docker_base == "wolfi" || docker_base == "fips" ) { %>
161182RUN <%= retry.loop(package_manager,
162183 "export DEBIAN_FRONTEND=noninteractive && \n " +
163184 " ${package_manager} update && \n " +
@@ -201,28 +222,24 @@ RUN <%= retry.loop(
201222<% } %>
202223
203224
204- <% if (docker_base == "default" || docker_base == "cloud" ) { %>
225+ <% if (docker_base == "default") { %>
205226RUN groupadd -g 1000 elasticsearch && \\
206227 adduser --uid 1000 --gid 1000 --home /usr/share/elasticsearch elasticsearch && \\
207228 adduser elasticsearch root && \\
208229 chown -R 0:0 /usr/share/elasticsearch
209- <% } else if (docker_base == "wolfi") { %>
230+ <% } else if (docker_base == "wolfi" || docker_base == "fips" ) { %>
210231RUN groupadd -g 1000 elasticsearch && \
211232 adduser -G elasticsearch -u 1000 elasticsearch -D --home /usr/share/elasticsearch elasticsearch && \
212233 adduser elasticsearch root && \
213234 chown -R 0:0 /usr/share/elasticsearch
214- <% } else { %>
215- RUN groupadd -g 1000 elasticsearch && \\
216- adduser -u 1000 -g 1000 -G 0 -d /usr/share/elasticsearch elasticsearch && \\
217- chown -R 0:0 /usr/share/elasticsearch
218235<% } %>
219236
220237ENV ELASTIC_CONTAINER true
221238
222239WORKDIR /usr/share/elasticsearch
223240
224241COPY --from=builder --chown=0:0 /usr/share/elasticsearch /usr/share/elasticsearch
225- <% if (docker_base != "wolfi") { %>
242+ <% if (docker_base != "wolfi" && docker_base != "fips" ) { %>
226243COPY --from=builder --chown=0:0 /bin/tini /bin/tini
227244<% } %>
228245
@@ -251,12 +268,12 @@ RUN chmod g=u /etc/passwd && \\
251268 chmod 0775 /usr/share/elasticsearch && \\
252269 chown elasticsearch bin config config/jvm.options.d data logs plugins
253270
254- <% if (docker_base == 'default' || docker_base == 'cloud' ) { %>
271+ <% if (docker_base == 'default' ) { %>
255272# Update "cacerts" bundle to use Ubuntu's CA certificates (and make sure it
256273# stays up-to-date with changes to Ubuntu's store)
257274COPY bin/docker-openjdk /etc/ca-certificates/update.d/docker-openjdk
258275RUN /etc/ca-certificates/update.d/docker-openjdk
259- <% } else if (docker_base == 'wolfi' ) { %>
276+ <% } else if (docker_base == 'wolfi' || docker_base == "fips" ) { %>
260277RUN ln -sf /etc/ssl/certs/java/cacerts /usr/share/elasticsearch/jdk/lib/security/cacerts
261278<% } else { %>
262279RUN ln -sf /etc/pki/ca-trust/extracted/java/cacerts /usr/share/elasticsearch/jdk/lib/security/cacerts
@@ -303,14 +320,7 @@ RUN mkdir /licenses && cp LICENSE.txt /licenses/LICENSE
303320COPY LICENSE /licenses/LICENSE.addendum
304321<% } %>
305322
306- <% if (docker_base == "cloud" ) { %>
307- ENTRYPOINT ["/bin/tini" , "--" ]
308- CMD ["/app/elasticsearch.sh" ]
309- # Generate a stub command that will be overwritten at runtime
310- RUN mkdir /app && \\
311- echo -e '#!/bin/bash\\ nexec /usr/local/bin/docker-entrypoint.sh eswrapper' > /app/elasticsearch.sh && \\
312- chmod 0555 /app/elasticsearch.sh
313- <% } else if (docker_base == "wolfi" ) { %>
323+ <% if (docker_base == "wolfi" || docker_base == "fips" ) { %>
314324# Our actual entrypoint is `tini`, a minimal but functional init program. It
315325# calls the entrypoint we provide, while correctly forwarding signals.
316326ENTRYPOINT ["/sbin/tini" , "--" , "/usr/local/bin/docker-entrypoint.sh" ]
@@ -330,6 +340,12 @@ USER 1000:0
330340HEALTHCHECK --interval=10s --timeout=5s --start-period=1m --retries=5 CMD curl -I -f --max-time 5 http://localhost:9200 || exit 1
331341<% } %>
332342
343+ <% if (docker_base == 'fips' ) { %>
344+ COPY --from=builder --chown=0:0 /opt /opt
345+ ENV ES_PLUGIN_ARCHIVE_DIR /opt/plugins/archive
346+ WORKDIR /usr/share/elasticsearch
347+ COPY --from=builder --chown=0:0 /fips/libs/*.jar /usr/share/elasticsearch/lib/
348+ <% } %>
333349# ###############################################################################
334350# End of multi-stage Dockerfile
335351# ###############################################################################
0 commit comments