跳转到主要内容

KeyDB 官方 Dockerfile

本页包含用于生成我们镜像的不同镜像和标签的 Dockerfile。我们在此列出它们是为了保持透明度,以便您能看到您所获取的内容。这也允许您自定义一个可能更符合您需求的自定义镜像。

如果您发现任何您认为有益的重大改进,我们乐于接受反馈。

所有镜像都是从官方发布分支构建的。标签末尾会带有版本号,例如 v5.0.3。当您启动服务器时,也会看到版本号。

对于那些喜欢跟进项目开发的用户,我们每天东部时间凌晨4点会为不稳定(unstable)分支生成一个镜像。

请注意,此镜像中包含了 KeyDB 社区版和 KeyDB 专业版的二进制文件。

清单(Manifest)#

主 Docker 镜像 "latest",在拉取 eqalpha/keydb 时是一个清单文件。这意味着它关联了3个镜像:x86_64_vxxx、arm_vxxx、arm64_vxxx。根据您的系统,清单文件将拉取相应的镜像。这个主拉取基于 GitHub 上的最新官方发布分支。

构建镜像#

您会从 Dockerfile 中注意到,您的 Dockerfile 所在位置应该有一个 "app" 目录。Dockerfile 应命名为 "Dockerfile"。在 "app" 文件夹中,您应该放置想要复制的二进制文件(至少需要 keydb-server)。keydb.conf 文件也应位于此处。您可以根据自己的喜好进行自定义,这会很有用。我们的 Dockerfile 是在 Dockerfile 内部修改我们的基础配置文件,而不是使用一个自定义的 Dockerfile。因此,您可能会考虑删除脚本中修改配置文件的部分。

请参阅下方我们生成的5个主要镜像/标签的 Dockerfile,以及构建器的 Dockerfile。

标准构建#

#
# 用于 x86_64 的 KeyDB Dockerfile
#
#
# 拉取基础镜像。
FROM ubuntu:18.04
# 首先添加我们的用户和组,以确保无论添加什么依赖项,它们的 ID 都能被一致地分配
RUN groupadd -r keydb && useradd -r -g keydb keydb
# 获取 gosu 以便轻松地从 root 降权
# https://github.com/tianon/gosu/releases
ENV GOSU_VERSION 1.10
RUN set -ex; \
\
fetchDeps=" \
ca-certificates \
dirmngr \
gnupg \
wget \
"; \
apt-get update; \
apt-get install -y --no-install-recommends libcurl4-openssl-dev $fetchDeps; \
rm -rf /var/lib/apt/lists/*; \
\
dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
export GNUPGHOME="$(mktemp -d)"; \
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
gpgconf --kill all; \
rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc; \
chmod +x /usr/local/bin/gosu; \
gosu nobody true; \
\
apt-get purge -y --auto-remove $fetchDeps
# 将二进制文件加载到镜像中。比构建方式的体积小得多。
ADD ./app/* /usr/local/bin/
RUN \
cd /usr/local/bin && \
mkdir -p /etc/keydb && \
mv -f *.conf /etc/keydb && \
# 更新配置文件以便在容器中使用
sed -i 's/^\(bind .*\)$/# \1/' /etc/keydb/keydb.conf && \
sed -i 's/^\(daemonize .*\)$/# \1/' /etc/keydb/keydb.conf && \
sed -i 's/^\(dir .*\)$/# \1\ndir \/data/' /etc/keydb/keydb.conf && \
sed -i 's/^\(logfile .*\)$/# \1/' /etc/keydb/keydb.conf && \
sed -i 's/protected-mode yes/protected-mode no/g' /etc/keydb/keydb.conf
# 定义默认命令。
#CMD ["keydb-server", "/etc/keydb/redis.conf"]
RUN \
mkdir /data && chown keydb:keydb /data && \
mkdir /flash && chown keydb:keydb /flash
VOLUME /data
WORKDIR /data
ENV KEYDB_PRO_DIRECTORY=/usr/local/bin/
#COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 6379
CMD ["keydb-server", "/etc/keydb/keydb.conf"]

ARM 构建#

#
# 用于 ARM 的 KeyDB Dockerfile
#
#
FROM jsurf/rpi-raspbian:latest
RUN [ "cross-build-start" ]
# 首先添加我们的用户和组,以确保无论添加什么依赖项,它们的 ID 都能被一致地分配
RUN groupadd -r keydb && useradd -r -g keydb keydb
# 添加 gosu 以便轻松地从 root 降权
ENV GOSU_VERSION 1.10
RUN set -x \
&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget libcurl4-openssl-dev && rm -rf /var/lib/apt/lists/* \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true \
&& apt-get purge -y --auto-remove ca-certificates wget
# 将二进制文件加载到镜像中。比构建方式的体积小得多。
ADD ./app/* /usr/local/bin/
RUN \
cd /usr/local/bin && \
mkdir -p /etc/keydb && \
mv -f *.conf /etc/keydb && \
# 更新配置文件以便在容器中使用
sed -i 's/^\(bind .*\)$/# \1/' /etc/keydb/redis.conf && \
sed -i 's/^\(daemonize .*\)$/# \1/' /etc/keydb/redis.conf && \
sed -i 's/^\(dir .*\)$/# \1\ndir \/data/' /etc/keydb/redis.conf && \
sed -i 's/^\(logfile .*\)$/# \1/' /etc/keydb/redis.conf && \
sed -i 's/protected-mode yes/protected-mode no/g' /etc/keydb/redis.conf
# 定义默认命令。
#CMD ["keydb-server", "/etc/keydb/redis.conf"]
RUN mkdir /data && chown keydb:keydb /data
VOLUME /data
WORKDIR /data
#COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 6379
CMD ["keydb-server", "/etc/keydb/redis.conf"]
RUN [ "cross-build-end" ]

不稳定版构建#

这与标准构建相同,只是二进制文件是从 GitHub 上的不稳定(unstable)分支生成的。

Docker 构建器 - 标准#

# KeyDB 全新构建
#
# 此 Docker 镜像将用于从 GitHub 生成最新的二进制文件
#
# 用法:docker run -it --rm -v /path-to-dump-binaries:/keydb_bin eqalpha/keydb-build-bin
#
# 拉取基础镜像
FROM ubuntu:18.04
# 设置容器并安装构建所需的依赖项
RUN apt-get update -y && \
DEBIAN_FRONTEND=noninteractive apt-get install -qqy \
build-essential apt-utils nasm autotools-dev autoconf libjemalloc-dev tcl tcl-dev uuid-dev git -y && \
apt-get clean && \
mkdir /keydb_bin
# 启动时,我们将构建项目并将二进制文件转储到主机上指定的文件夹中
CMD ["sh","-c", "cd /tmp && git clone https://github.com/JohnSully/KeyDB.git && \
cd KeyDB && \
make && \
cp ./src/keydb-* /keydb_bin"]

Docker 构建器 - 旧版 Flash#

#
# 用于 x86_64 的 KeyDB Dockerfile
#
# 用法:docker run -it --name mykeydb --mount type=bind,target=/tmp/keydbflash,source=/path-to-my-btrfs-volume/ eqalpha/keydb:flash
#
# 拉取基础镜像。
FROM ubuntu:18.04
# 将二进制文件加载到镜像中。比构建方式的体积小得多。
ADD ./app/* /usr/local/bin/
RUN \
apt-get update && \
apt-get install -y libnuma-dev libtool && \
cd /usr/local/bin && \
mkdir -p /etc/keydb && \
mkdir /tmp/keydbflash && \
mv -f *.conf /etc/keydb && \
# 更新配置文件以便在容器中使用
sed -i 's/^\(bind .*\)$/# \1/' /etc/keydb/redis.conf && \
sed -i 's/^\(daemonize .*\)$/# \1/' /etc/keydb/redis.conf && \
sed -i 's/^\(dir .*\)$/# \1\ndir \/data/' /etc/keydb/redis.conf && \
sed -i 's/^\(logfile .*\)$/# \1/' /etc/keydb/redis.conf && \
sed -i 's/protected-mode yes/protected-mode no/g' /etc/keydb/redis.conf && \
sed -i '/scratch-file-path/a \scratch-file-path /tmp/keydbflash' /etc/keydb/redis.conf
# 定义可挂载的目录。
VOLUME ["/data"]
# 定义工作目录。
WORKDIR /data
# 定义默认命令。
CMD ["keydb-server", "/etc/keydb/redis.conf"]
# 暴露端口。
EXPOSE 6379

docker-entrypoint.sh#

#!/bin/sh
set -e
# 第一个参数是 `-f` 或 `--some-option`
# 或者第一个参数是 `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
set -- keydb-server "$@"
fi
# 允许以 `--user` 启动容器
if [ "$1" = 'keydb-server' -a "$(id -u)" = '0' ]; then
find . \! -user keydb -exec chown keydb '{}' +
exec gosu keydb "$0" "$@"
fi
exec "$@"