mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-01 02:57:59 +00:00
Add docker dev build targets (#9426)
* Add docker dev build target * Update scripts/docker/Dockerfile Co-authored-by: Jim Kalafut <jkalafut@hashicorp.com> * Add multi-stage build * Add comment about multi-stage * Add docker-dev-ui Co-authored-by: Jim Kalafut <jkalafut@hashicorp.com>
This commit is contained in:
8
Makefile
8
Makefile
@@ -52,6 +52,14 @@ dev-ui-mem: assetcheck dev-ui
|
|||||||
dev-dynamic-mem: BUILD_TAGS+=memprofiler
|
dev-dynamic-mem: BUILD_TAGS+=memprofiler
|
||||||
dev-dynamic-mem: dev-dynamic
|
dev-dynamic-mem: dev-dynamic
|
||||||
|
|
||||||
|
# Creates a Docker image by adding the compiled linux/amd64 binary found in ./bin.
|
||||||
|
# The resulting image is tagged "vault:dev".
|
||||||
|
docker-dev: prep
|
||||||
|
docker build -f scripts/docker/Dockerfile -t vault:dev .
|
||||||
|
|
||||||
|
docker-dev-ui: prep
|
||||||
|
docker build -f scripts/docker/Dockerfile.ui -t vault:dev-ui .
|
||||||
|
|
||||||
# test runs the unit tests and vets the code
|
# test runs the unit tests and vets the code
|
||||||
test: prep
|
test: prep
|
||||||
@CGO_ENABLED=$(CGO_ENABLED) \
|
@CGO_ENABLED=$(CGO_ENABLED) \
|
||||||
|
|||||||
64
scripts/docker/Dockerfile
Normal file
64
scripts/docker/Dockerfile
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# Multi-stage builder to avoid polluting users environment with wrong
|
||||||
|
# architecture binaries. Since this binary is used in an alpine container,
|
||||||
|
# we're explicitly compiling for 'linux/amd64'
|
||||||
|
ARG VERSION=1.13.10
|
||||||
|
|
||||||
|
FROM golang:${VERSION} AS builder
|
||||||
|
|
||||||
|
ARG CGO_ENABLED=0
|
||||||
|
ARG BUILD_TAGS
|
||||||
|
|
||||||
|
WORKDIR /go/src/github.com/hashicorp/vault
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN make bootstrap \
|
||||||
|
&& CGO_ENABLED=$CGO_ENABLED BUILD_TAGS='$BUILD_TAGS' VAULT_DEV_BUILD=1 XC_OSARCH='linux/amd64' sh -c "'./scripts/build.sh'"
|
||||||
|
|
||||||
|
# Docker Image
|
||||||
|
|
||||||
|
FROM alpine:3.10
|
||||||
|
|
||||||
|
# Create a vault user and group first so the IDs get set the same way,
|
||||||
|
# even as the rest of this may change over time.
|
||||||
|
RUN addgroup vault && \
|
||||||
|
adduser -S -G vault vault
|
||||||
|
|
||||||
|
# Set up certificates, our base tools, and Vault.
|
||||||
|
RUN set -eux; \
|
||||||
|
apk add --no-cache ca-certificates libcap su-exec dumb-init tzdata
|
||||||
|
|
||||||
|
COPY --from=builder /go/bin/vault /bin/vault
|
||||||
|
|
||||||
|
# /vault/logs is made available to use as a location to store audit logs, if
|
||||||
|
# desired; /vault/file is made available to use as a location with the file
|
||||||
|
# storage backend, if desired; the server will be started with /vault/config as
|
||||||
|
# the configuration directory so you can add additional config files in that
|
||||||
|
# location.
|
||||||
|
RUN mkdir -p /vault/logs && \
|
||||||
|
mkdir -p /vault/file && \
|
||||||
|
mkdir -p /vault/config && \
|
||||||
|
chown -R vault:vault /vault
|
||||||
|
|
||||||
|
# Expose the logs directory as a volume since there's potentially long-running
|
||||||
|
# state in there
|
||||||
|
VOLUME /vault/logs
|
||||||
|
|
||||||
|
# Expose the file directory as a volume since there's potentially long-running
|
||||||
|
# state in there
|
||||||
|
VOLUME /vault/file
|
||||||
|
|
||||||
|
# 8200/tcp is the primary interface that applications use to interact with
|
||||||
|
# Vault.
|
||||||
|
EXPOSE 8200
|
||||||
|
|
||||||
|
# The entry point script uses dumb-init as the top-level process to reap any
|
||||||
|
# zombie processes created by Vault sub-processes.
|
||||||
|
#
|
||||||
|
# For production derivatives of this container, you should add the IPC_LOCK
|
||||||
|
# capability so that Vault can mlock memory.
|
||||||
|
COPY ./scripts/docker/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
||||||
|
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||||
|
|
||||||
|
# By default you'll get a single-node development server that stores everything
|
||||||
|
# in RAM and bootstraps itself. Don't use this configuration for production.
|
||||||
|
CMD ["server", "-dev"]
|
||||||
90
scripts/docker/Dockerfile.ui
Normal file
90
scripts/docker/Dockerfile.ui
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# Multi-stage builder to avoid polluting users environment with wrong
|
||||||
|
# architecture binaries. Since this binary is used in an alpine container,
|
||||||
|
# we're explicitly compiling for 'linux/amd64'
|
||||||
|
FROM debian:buster AS builder
|
||||||
|
|
||||||
|
ARG VERSION=1.13.10
|
||||||
|
ARG CGO_ENABLED=0
|
||||||
|
ARG BUILD_TAGS
|
||||||
|
ENV JOBS=2
|
||||||
|
|
||||||
|
RUN apt-get update -y && apt-get install --no-install-recommends -y -q \
|
||||||
|
curl \
|
||||||
|
zip \
|
||||||
|
build-essential \
|
||||||
|
gcc-multilib \
|
||||||
|
g++-multilib \
|
||||||
|
ca-certificates \
|
||||||
|
git mercurial bzr \
|
||||||
|
gnupg \
|
||||||
|
libltdl-dev \
|
||||||
|
libltdl7
|
||||||
|
|
||||||
|
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
|
||||||
|
RUN curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
||||||
|
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
|
||||||
|
|
||||||
|
RUN apt-get update -y && apt-get install -y -q nodejs yarn
|
||||||
|
|
||||||
|
RUN rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
RUN mkdir /goroot && mkdir /go
|
||||||
|
RUN curl https://storage.googleapis.com/golang/go${VERSION}.linux-amd64.tar.gz \
|
||||||
|
| tar xvzf - -C /goroot --strip-components=1
|
||||||
|
ENV GOPATH /go
|
||||||
|
ENV GOROOT /goroot
|
||||||
|
ENV PATH $GOROOT/bin:$GOPATH/bin:$PATH
|
||||||
|
|
||||||
|
WORKDIR /go/src/github.com/hashicorp/vault
|
||||||
|
COPY . .
|
||||||
|
RUN make bootstrap static-dist \
|
||||||
|
&& CGO_ENABLED=$CGO_ENABLED BUILD_TAGS='$BUILD_TAGS ui' VAULT_DEV_BUILD=1 XC_OSARCH='linux/amd64' sh -c "'./scripts/build.sh'"
|
||||||
|
|
||||||
|
# Docker Image
|
||||||
|
|
||||||
|
FROM alpine:3.10
|
||||||
|
|
||||||
|
# Create a vault user and group first so the IDs get set the same way,
|
||||||
|
# even as the rest of this may change over time.
|
||||||
|
RUN addgroup vault && \
|
||||||
|
adduser -S -G vault vault
|
||||||
|
|
||||||
|
# Set up certificates, our base tools, and Vault.
|
||||||
|
RUN set -eux; \
|
||||||
|
apk add --no-cache ca-certificates libcap su-exec dumb-init tzdata
|
||||||
|
|
||||||
|
COPY --from=builder /go/bin/vault /bin/vault
|
||||||
|
|
||||||
|
# /vault/logs is made available to use as a location to store audit logs, if
|
||||||
|
# desired; /vault/file is made available to use as a location with the file
|
||||||
|
# storage backend, if desired; the server will be started with /vault/config as
|
||||||
|
# the configuration directory so you can add additional config files in that
|
||||||
|
# location.
|
||||||
|
RUN mkdir -p /vault/logs && \
|
||||||
|
mkdir -p /vault/file && \
|
||||||
|
mkdir -p /vault/config && \
|
||||||
|
chown -R vault:vault /vault
|
||||||
|
|
||||||
|
# Expose the logs directory as a volume since there's potentially long-running
|
||||||
|
# state in there
|
||||||
|
VOLUME /vault/logs
|
||||||
|
|
||||||
|
# Expose the file directory as a volume since there's potentially long-running
|
||||||
|
# state in there
|
||||||
|
VOLUME /vault/file
|
||||||
|
|
||||||
|
# 8200/tcp is the primary interface that applications use to interact with
|
||||||
|
# Vault.
|
||||||
|
EXPOSE 8200
|
||||||
|
|
||||||
|
# The entry point script uses dumb-init as the top-level process to reap any
|
||||||
|
# zombie processes created by Vault sub-processes.
|
||||||
|
#
|
||||||
|
# For production derivatives of this container, you should add the IPC_LOCK
|
||||||
|
# capability so that Vault can mlock memory.
|
||||||
|
COPY ./scripts/docker/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
||||||
|
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||||
|
|
||||||
|
# By default you'll get a single-node development server that stores everything
|
||||||
|
# in RAM and bootstraps itself. Don't use this configuration for production.
|
||||||
|
CMD ["server", "-dev"]
|
||||||
104
scripts/docker/docker-entrypoint.sh
Executable file
104
scripts/docker/docker-entrypoint.sh
Executable file
@@ -0,0 +1,104 @@
|
|||||||
|
#!/usr/bin/dumb-init /bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Note above that we run dumb-init as PID 1 in order to reap zombie processes
|
||||||
|
# as well as forward signals to all processes in its session. Normally, sh
|
||||||
|
# wouldn't do either of these functions so we'd leak zombies as well as do
|
||||||
|
# unclean termination of all our sub-processes.
|
||||||
|
|
||||||
|
# Prevent core dumps
|
||||||
|
ulimit -c 0
|
||||||
|
|
||||||
|
# Allow setting VAULT_REDIRECT_ADDR and VAULT_CLUSTER_ADDR using an interface
|
||||||
|
# name instead of an IP address. The interface name is specified using
|
||||||
|
# VAULT_REDIRECT_INTERFACE and VAULT_CLUSTER_INTERFACE environment variables. If
|
||||||
|
# VAULT_*_ADDR is also set, the resulting URI will combine the protocol and port
|
||||||
|
# number with the IP of the named interface.
|
||||||
|
get_addr () {
|
||||||
|
local if_name=$1
|
||||||
|
local uri_template=$2
|
||||||
|
ip addr show dev $if_name | awk -v uri=$uri_template '/\s*inet\s/ { \
|
||||||
|
ip=gensub(/(.+)\/.+/, "\\1", "g", $2); \
|
||||||
|
print gensub(/^(.+:\/\/).+(:.+)$/, "\\1" ip "\\2", "g", uri); \
|
||||||
|
exit}'
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -n "$VAULT_REDIRECT_INTERFACE" ]; then
|
||||||
|
export VAULT_REDIRECT_ADDR=$(get_addr $VAULT_REDIRECT_INTERFACE ${VAULT_REDIRECT_ADDR:-"http://0.0.0.0:8200"})
|
||||||
|
echo "Using $VAULT_REDIRECT_INTERFACE for VAULT_REDIRECT_ADDR: $VAULT_REDIRECT_ADDR"
|
||||||
|
fi
|
||||||
|
if [ -n "$VAULT_CLUSTER_INTERFACE" ]; then
|
||||||
|
export VAULT_CLUSTER_ADDR=$(get_addr $VAULT_CLUSTER_INTERFACE ${VAULT_CLUSTER_ADDR:-"https://0.0.0.0:8201"})
|
||||||
|
echo "Using $VAULT_CLUSTER_INTERFACE for VAULT_CLUSTER_ADDR: $VAULT_CLUSTER_ADDR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# VAULT_CONFIG_DIR isn't exposed as a volume but you can compose additional
|
||||||
|
# config files in there if you use this image as a base, or use
|
||||||
|
# VAULT_LOCAL_CONFIG below.
|
||||||
|
VAULT_CONFIG_DIR=/vault/config
|
||||||
|
|
||||||
|
# You can also set the VAULT_LOCAL_CONFIG environment variable to pass some
|
||||||
|
# Vault configuration JSON without having to bind any volumes.
|
||||||
|
if [ -n "$VAULT_LOCAL_CONFIG" ]; then
|
||||||
|
echo "$VAULT_LOCAL_CONFIG" > "$VAULT_CONFIG_DIR/local.json"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If the user is trying to run Vault directly with some arguments, then
|
||||||
|
# pass them to Vault.
|
||||||
|
if [ "${1:0:1}" = '-' ]; then
|
||||||
|
set -- vault "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Look for Vault subcommands.
|
||||||
|
if [ "$1" = 'server' ]; then
|
||||||
|
shift
|
||||||
|
set -- vault server \
|
||||||
|
-config="$VAULT_CONFIG_DIR" \
|
||||||
|
-dev-root-token-id="$VAULT_DEV_ROOT_TOKEN_ID" \
|
||||||
|
-dev-listen-address="${VAULT_DEV_LISTEN_ADDRESS:-"0.0.0.0:8200"}" \
|
||||||
|
"$@"
|
||||||
|
elif [ "$1" = 'version' ]; then
|
||||||
|
# This needs a special case because there's no help output.
|
||||||
|
set -- vault "$@"
|
||||||
|
elif vault --help "$1" 2>&1 | grep -q "vault $1"; then
|
||||||
|
# We can't use the return code to check for the existence of a subcommand, so
|
||||||
|
# we have to use grep to look for a pattern in the help output.
|
||||||
|
set -- vault "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If we are running Vault, make sure it executes as the proper user.
|
||||||
|
if [ "$1" = 'vault' ]; then
|
||||||
|
if [ -z "$SKIP_CHOWN" ]; then
|
||||||
|
# If the config dir is bind mounted then chown it
|
||||||
|
if [ "$(stat -c %u /vault/config)" != "$(id -u vault)" ]; then
|
||||||
|
chown -R vault:vault /vault/config || echo "Could not chown /vault/config (may not have appropriate permissions)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If the logs dir is bind mounted then chown it
|
||||||
|
if [ "$(stat -c %u /vault/logs)" != "$(id -u vault)" ]; then
|
||||||
|
chown -R vault:vault /vault/logs
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If the file dir is bind mounted then chown it
|
||||||
|
if [ "$(stat -c %u /vault/file)" != "$(id -u vault)" ]; then
|
||||||
|
chown -R vault:vault /vault/file
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$SKIP_SETCAP" ]; then
|
||||||
|
# Allow mlock to avoid swapping Vault memory to disk
|
||||||
|
setcap cap_ipc_lock=+ep $(readlink -f $(which vault))
|
||||||
|
|
||||||
|
# In the case vault has been started in a container without IPC_LOCK privileges
|
||||||
|
if ! vault -version 1>/dev/null 2>/dev/null; then
|
||||||
|
>&2 echo "Couldn't start vault with IPC_LOCK. Disabling IPC_LOCK, please use --privileged or --cap-add IPC_LOCK"
|
||||||
|
setcap cap_ipc_lock=-ep $(readlink -f $(which vault))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$(id -u)" = '0' ]; then
|
||||||
|
set -- su-exec vault "$@"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec "$@"
|
||||||
Reference in New Issue
Block a user