mirror of https://github.com/ledisdb/ledisdb.git
Add Dockerfile (#327)
This commit is contained in:
parent
81f50c08aa
commit
56900470a8
|
@ -0,0 +1,108 @@
|
||||||
|
# use builder image to compile ledisdb (without GCO)
|
||||||
|
FROM golang:1.9-stretch as builder
|
||||||
|
|
||||||
|
ENV LEDISDB_VERSION v0.6
|
||||||
|
|
||||||
|
ENV LEVELDB_VERSION 47cb9e2a211e1d7157078ba7bab536beb29e56dc
|
||||||
|
ENV ROCKSDB_VERSION 5.8.6
|
||||||
|
ENV GOSU_VERSION 1.10
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR /build
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y \
|
||||||
|
ca-certificates \
|
||||||
|
wget \
|
||||||
|
gcc-6 \
|
||||||
|
g++-6 \
|
||||||
|
build-essential \
|
||||||
|
libsnappy1v5 \
|
||||||
|
libsnappy-dev \
|
||||||
|
libgflags-dev
|
||||||
|
|
||||||
|
# get LedisDB
|
||||||
|
RUN wget -O ledisdb-src.tar.gz "https://github.com/siddontang/ledisdb/archive/$LEDISDB_VERSION.tar.gz" && \
|
||||||
|
tar -zxf ledisdb-src.tar.gz && \
|
||||||
|
mkdir -p /go/src/github.com/siddontang/ && \
|
||||||
|
mv ledisdb-$LEDISDB_VERSION /go/src/github.com/siddontang/ledisdb
|
||||||
|
|
||||||
|
# build LevelDB
|
||||||
|
RUN wget -O leveldb-src.tar.gz "https://github.com/google/leveldb/archive/$LEVELDB_VERSION.tar.gz" && \
|
||||||
|
tar -zxf leveldb-src.tar.gz && \
|
||||||
|
cd leveldb-$LEVELDB_VERSION && \
|
||||||
|
patch -p0 < /go/src/github.com/siddontang/ledisdb/tools/leveldb.patch && \
|
||||||
|
make -j "$(nproc)" && \
|
||||||
|
mkdir /build/lib && \
|
||||||
|
mkdir -p /build/include/leveldb && \
|
||||||
|
cp out-static/lib* /build/lib/ && \
|
||||||
|
install include/leveldb/*.h /build/include/leveldb
|
||||||
|
|
||||||
|
|
||||||
|
# build RocksDB
|
||||||
|
RUN wget -O rocksdb-src.tar.gz "https://github.com/facebook/rocksdb/archive/v$ROCKSDB_VERSION.tar.gz" && \
|
||||||
|
tar -zxf rocksdb-src.tar.gz && \
|
||||||
|
cd rocksdb-$ROCKSDB_VERSION && \
|
||||||
|
make static_lib -j "$(nproc)" && \
|
||||||
|
mkdir -p /build/include/rocksdb && \
|
||||||
|
cp librocksdb.a /build/lib/ && \
|
||||||
|
install include/rocksdb/*.h /build/include/rocksdb
|
||||||
|
|
||||||
|
ENV CGO_CFLAGS "-I/build/include"
|
||||||
|
ENV CGO_CXXFLAGS "-I/build/include"
|
||||||
|
ENV CGO_LDFLAGS "-L/build/lib -lsnappy"
|
||||||
|
|
||||||
|
#build LedisDB
|
||||||
|
RUN export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/build/lib:/usr/lib && \
|
||||||
|
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/build/lib:/usr/lib && \
|
||||||
|
mkdir -p /build/bin && \
|
||||||
|
rm -rf /build/bin/* && \
|
||||||
|
cd /go/src/github.com/siddontang/ledisdb && \
|
||||||
|
GOGC=off go build -i -o /build/bin/ledis-server -tags "snappy leveldb rocksdb" cmd/ledis-server/* && \
|
||||||
|
GOGC=off go build -i -o /build/bin/ledis-cli -tags "snappy leveldb rocksdb" cmd/ledis-cli/* && \
|
||||||
|
GOGC=off go build -i -o /build/bin/ledis-benchmark -tags "snappy leveldb rocksdb" cmd/ledis-benchmark/* && \
|
||||||
|
GOGC=off go build -i -o /build/bin/ledis-dump -tags "snappy leveldb rocksdb" cmd/ledis-dump/* && \
|
||||||
|
GOGC=off go build -i -o /build/bin/ledis-load -tags "snappy leveldb rocksdb" cmd/ledis-load/* && \
|
||||||
|
GOGC=off go build -i -o /build/bin/ledis-repair -tags "snappy leveldb rocksdb" cmd/ledis-repair/*
|
||||||
|
|
||||||
|
# grab gosu for easy step-down from root
|
||||||
|
# https://github.com/tianon/gosu/releases
|
||||||
|
RUN set -ex; \
|
||||||
|
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 --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
|
||||||
|
gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
|
||||||
|
chmod +x /usr/local/bin/gosu
|
||||||
|
|
||||||
|
|
||||||
|
# done building - now create a tiny image with a statically linked Ledis
|
||||||
|
FROM debian:stretch-slim
|
||||||
|
|
||||||
|
COPY --from=builder /build/lib/* /usr/lib/
|
||||||
|
COPY --from=builder /build/bin/ledis-* /bin/
|
||||||
|
COPY --from=builder /go/src/github.com/siddontang/ledisdb/config/config-docker.toml /config.toml
|
||||||
|
COPY --from=builder /usr/local/bin/gosu /bin/
|
||||||
|
|
||||||
|
RUN groupadd -r ledis && \
|
||||||
|
useradd -r -g ledis ledis && \
|
||||||
|
mkdir /datastore && \
|
||||||
|
chown ledis:ledis /datastore && \
|
||||||
|
chmod 444 /config.toml && \
|
||||||
|
gosu nobody true
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends libsnappy1v5 && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
VOLUME /datastore
|
||||||
|
|
||||||
|
ADD entrypoint.sh /bin/entrypoint.sh
|
||||||
|
|
||||||
|
ENTRYPOINT ["entrypoint.sh"]
|
||||||
|
|
||||||
|
EXPOSE 6380 11181
|
||||||
|
|
||||||
|
CMD ["ledis-server", "--config=/config.toml"]
|
|
@ -0,0 +1,170 @@
|
||||||
|
# LedisDB configuration
|
||||||
|
|
||||||
|
# Server listen address
|
||||||
|
addr = "0.0.0.0:6380"
|
||||||
|
|
||||||
|
# Unix socket permissions, 755 by default.
|
||||||
|
# Ignored for tcp socket.
|
||||||
|
addr_unixsocketperm = "0770"
|
||||||
|
|
||||||
|
# Server http listen address, set empty to disable
|
||||||
|
http_addr = "0.0.0.0:11181"
|
||||||
|
|
||||||
|
# Data store path, all ledisdb's data will be saved here
|
||||||
|
data_dir = "/datastore"
|
||||||
|
|
||||||
|
# Set the number of databases. You can use `select dbindex` to choose a db.
|
||||||
|
# dbindex must be in [0, databases - 1].
|
||||||
|
# Default databases is 16, maximum is 10240 now.
|
||||||
|
databases = 16
|
||||||
|
|
||||||
|
# Log server command, set empty to disable
|
||||||
|
access_log = ""
|
||||||
|
|
||||||
|
# Set slaveof to enable replication from master, empty, no replication
|
||||||
|
# Any write operations except flushall and replication will be disabled in slave mode.
|
||||||
|
slaveof = ""
|
||||||
|
|
||||||
|
# Readonly mode, slave server is always readonly even readonly = false
|
||||||
|
# for readonly mode, only replication and flushall can write
|
||||||
|
readonly = false
|
||||||
|
|
||||||
|
# Choose which backend storage to use, now support:
|
||||||
|
#
|
||||||
|
# leveldb
|
||||||
|
# rocksdb
|
||||||
|
# goleveldb
|
||||||
|
# memory
|
||||||
|
#
|
||||||
|
db_name = "leveldb"
|
||||||
|
|
||||||
|
# If not set, use data_dir/"db_name"_data
|
||||||
|
db_path = ""
|
||||||
|
|
||||||
|
# Sync commit to disk if possible
|
||||||
|
# 0: no sync
|
||||||
|
# 1: sync every second
|
||||||
|
# 2: sync every commit
|
||||||
|
db_sync_commit = 0
|
||||||
|
|
||||||
|
# enable replication or not
|
||||||
|
use_replication = false
|
||||||
|
|
||||||
|
# set connection buffer, you can increase them appropriately
|
||||||
|
# more size, more memory used
|
||||||
|
conn_read_buffer_size = 10240
|
||||||
|
conn_write_buffer_size = 10240
|
||||||
|
|
||||||
|
# if connection receives no data after n seconds, it may be dead, close
|
||||||
|
# 0 to disable and not check
|
||||||
|
conn_keepalive_interval = 0
|
||||||
|
|
||||||
|
# checking TTL (time to live) data every n seconds
|
||||||
|
# if you set big, the expired data may not be deleted immediately
|
||||||
|
ttl_check_interval = 1
|
||||||
|
|
||||||
|
[leveldb]
|
||||||
|
# for leveldb and goleveldb
|
||||||
|
compression = false
|
||||||
|
block_size = 32768
|
||||||
|
write_buffer_size = 67108864
|
||||||
|
cache_size = 524288000
|
||||||
|
max_open_files = 1024
|
||||||
|
max_file_size = 33554432
|
||||||
|
|
||||||
|
[rocksdb]
|
||||||
|
# rocksdb has many many configurations,
|
||||||
|
# we only list little now, but may add more later.
|
||||||
|
# good luck!
|
||||||
|
|
||||||
|
# 0:no, 1:snappy, 2:zlib, 3:bz2, 4:lz4, 5:lz4hc
|
||||||
|
compression = 0
|
||||||
|
block_size = 65536
|
||||||
|
write_buffer_size = 134217728
|
||||||
|
cache_size = 1073741824
|
||||||
|
max_open_files = 1024
|
||||||
|
max_write_buffer_num = 6
|
||||||
|
min_write_buffer_number_to_merge = 2
|
||||||
|
num_levels = 7
|
||||||
|
level0_file_num_compaction_trigger = 8
|
||||||
|
level0_slowdown_writes_trigger = 16
|
||||||
|
level0_stop_writes_trigger = 64
|
||||||
|
target_file_size_base = 67108864
|
||||||
|
target_file_size_multiplier = 1
|
||||||
|
max_bytes_for_level_base = 536870912
|
||||||
|
max_bytes_for_level_multiplier = 8
|
||||||
|
disable_auto_compactions = false
|
||||||
|
disable_data_sync = false
|
||||||
|
use_fsync = false
|
||||||
|
background_theads = 16
|
||||||
|
high_priority_background_threads = 1
|
||||||
|
max_background_compactions = 15
|
||||||
|
max_background_flushes = 1
|
||||||
|
allow_os_buffer = true
|
||||||
|
enable_statistics = false
|
||||||
|
stats_dump_period_sec = 3600
|
||||||
|
# dangerous to set true, write may got lost after a crash
|
||||||
|
# you can set true if replication opened, we may recover from replication log,
|
||||||
|
# but it is still not a easy work.
|
||||||
|
disable_wal = false
|
||||||
|
max_manifest_file_size = 20971520
|
||||||
|
|
||||||
|
[lmdb]
|
||||||
|
map_size = 524288000
|
||||||
|
nosync = true
|
||||||
|
|
||||||
|
[replication]
|
||||||
|
# Path to store replication information(write ahead log, commit log, etc.)
|
||||||
|
# if not set, use data_dir/rpl
|
||||||
|
path = ""
|
||||||
|
|
||||||
|
# If sync is true, the new log must be sent to some slaves, and then commit.
|
||||||
|
# It will reduce performance but have better high availability.
|
||||||
|
sync = false
|
||||||
|
|
||||||
|
# If sync is true, wait at last wait_sync_time milliseconds for slave syncing this log
|
||||||
|
wait_sync_time = 500
|
||||||
|
|
||||||
|
# If sync is true, wait at most min(wait_max_slave_acks, (n + 1) / 2) to promise syncing ok.
|
||||||
|
# n is slave number
|
||||||
|
# If 0, wait (n + 1) / 2 acks.
|
||||||
|
wait_max_slave_acks = 2
|
||||||
|
|
||||||
|
# store name: file, goleveldb
|
||||||
|
# change in runtime is very dangerous
|
||||||
|
store_name = "file"
|
||||||
|
|
||||||
|
# Expire write ahead logs after the given days
|
||||||
|
expired_log_days = 7
|
||||||
|
|
||||||
|
# for file store, if 0, use default 256MB, max is 1G
|
||||||
|
max_log_file_size = 0
|
||||||
|
|
||||||
|
# for file store, if 0, use default 50
|
||||||
|
max_log_file_num = 0
|
||||||
|
|
||||||
|
# for file store, use mmap for file read and write
|
||||||
|
use_mmap = true
|
||||||
|
|
||||||
|
# Sync log to disk if possible
|
||||||
|
# 0: no sync
|
||||||
|
# 1: sync every second
|
||||||
|
# 2: sync every commit
|
||||||
|
sync_log = 0
|
||||||
|
|
||||||
|
# Compress the log or not
|
||||||
|
compression = false
|
||||||
|
|
||||||
|
[snapshot]
|
||||||
|
# Path to store snapshot dump file
|
||||||
|
# if not set, use data_dir/snapshot
|
||||||
|
# snapshot file name format is dmp-2006-01-02T15:04:05.999999999
|
||||||
|
path = ""
|
||||||
|
|
||||||
|
# Reserve newest max_num snapshot dump files
|
||||||
|
max_num = 1
|
||||||
|
|
||||||
|
[tls]
|
||||||
|
enabled = false
|
||||||
|
certificate = "test.crt"
|
||||||
|
key = "test.key"
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# first arg is `-f` or `--some-option`
|
||||||
|
# or first arg is `something.toml`
|
||||||
|
if [ "${1#-}" != "$1" ] || [ "${1%.toml}" != "$1" ]; then
|
||||||
|
set -- /bin/ledis-server "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# allow the container to be started with `--user`
|
||||||
|
if [ "$1" = 'ledis-server' -a "$(id -u)" = '0' ]; then
|
||||||
|
chown -R ledis /datastore
|
||||||
|
chown ledis:ledis /bin/ledis-*
|
||||||
|
exec gosu ledis "$0" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec "$@"
|
Loading…
Reference in New Issue