mysql
FROM debian:stretch-slim# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get addedRUN groupadd -r mysql && useradd -r -g mysql mysqlRUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/*# add gosu for easy step-down from rootENV GOSU_VERSION 1.7RUN set -x \&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && 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 --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \&& gpgconf --kill all \&& 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 wgetRUN mkdir /docker-entrypoint-initdb.dRUN apt-get update && apt-get install -y --no-install-recommends \# for MYSQL_RANDOM_ROOT_PASSWORDpwgen \# for mysql_ssl_rsa_setupopenssl \# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:# File::Basename# File::Copy# Sys::Hostname# Data::Dumperperl \&& rm -rf /var/lib/apt/lists/*RUN set -ex; \# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" importedkey='A4A9406876FCBD3C456770C88C718D3B5072E1F5'; \export GNUPGHOME="$(mktemp -d)"; \gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \gpg --batch --export "$key" > /etc/apt/trusted.gpg.d/mysql.gpg; \gpgconf --kill all; \rm -rf "$GNUPGHOME"; \apt-key list > /dev/nullENV MYSQL_MAJOR 5.7ENV MYSQL_VERSION 5.7.25-1debian9RUN echo "deb http://repo.mysql.com/apt/debian/ stretch mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)# also, we set debconf keys to make APT a little quieterRUN { \echo mysql-community-server mysql-community-server/data-dir select ''; \echo mysql-community-server mysql-community-server/root-pass password ''; \echo mysql-community-server mysql-community-server/re-root-pass password ''; \echo mysql-community-server mysql-community-server/remove-test-db select false; \} | debconf-set-selections \&& apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* \&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \# ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime&& chmod 777 /var/run/mysqld \# comment out a few problematic configuration values&& find /etc/mysql/ -name '*.cnf' -print0 \| xargs -0 grep -lZE '^(bind-address|log)' \| xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/' \# don't reverse lookup hostnames, they are usually another container&& echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnfVOLUME /var/lib/mysqlCOPY docker-entrypoint.sh /usr/local/bin/RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compatENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 3306 33060CMD ["mysqld"]
capsule image runc mysql "/usr/local/bin/docker-entrypoint.sh mysqld --user=root" -id=mysql -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -p 3306:3306 -dcapsule exec mysql bash> show databases;> create database demo;> use mysql;> update user set host='%' where user='root';> flush privileges;> exit
error: exec: “/usr/local/bin/docker-entrypoint.sh”: stat /usr/local/bin/docker-entrypoint.sh: permission denied
这里要把—user这种选项的处理逻辑删掉, 因为目前不支持chown。
#!/bin/bashset -eo pipefailshopt -s nullglob# if command starts with an option, prepend mysqldif [ "${1:0:1}" = '-' ]; thenset -- mysqld "$@"fi# skip setup if they want an option that stops mysqldwantHelp=for arg; docase "$arg" in-'?'|--help|--print-defaults|-V|--version)wantHelp=1break;;esacdone# usage: file_env VAR [DEFAULT]# ie: file_env 'XYZ_DB_PASSWORD' 'example'# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)file_env() {local var="$1"local fileVar="${var}_FILE"local def="${2:-}"if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; thenecho >&2 "error: both $var and $fileVar are set (but are exclusive)"exit 1filocal val="$def"if [ "${!var:-}" ]; thenval="${!var}"elif [ "${!fileVar:-}" ]; thenval="$(< "${!fileVar}")"fiexport "$var"="$val"unset "$fileVar"}# usage: process_init_file FILENAME MYSQLCOMMAND...# ie: process_init_file foo.sh mysql -uroot# (process a single initializer file, based on its extension. we define this# function here, so that initializer scripts (*.sh) can use the same logic,# potentially recursively, or override the logic used in subsequent calls)process_init_file() {local f="$1"; shiftlocal mysql=( "$@" )case "$f" in*.sh) echo "$0: running $f"; . "$f" ;;*.sql) echo "$0: running $f"; "${mysql[@]}" < "$f"; echo ;;*.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;;*) echo "$0: ignoring $f" ;;esacecho}_check_config() {toRun=( "$@" --verbose --help )if ! errors="$("${toRun[@]}" 2>&1 >/dev/null)"; thencat >&2 <<-EOMERROR: mysqld failed while attempting to check configcommand was: "${toRun[*]}"$errorsEOMexit 1fi}# Fetch value from server config# We use mysqld --verbose --help instead of my_print_defaults because the# latter only show values present in config files, and not server defaults_get_config() {local conf="$1"; shift"$@" --verbose --help --log-bin-index="$(mktemp -u)" 2>/dev/null \| awk '$1 == "'"$conf"'" && /^[^ \t]/ { sub(/^[^ \t]+[ \t]+/, ""); print; exit }'# match "datadir /some/path with/spaces in/it here" but not "--xyz=abc\n datadir (xyz)"}if [ "$1" = 'mysqld' -a -z "$wantHelp" ]; then# still need to check config, container may have started with --user_check_config "$@"# Get configDATADIR="$(_get_config 'datadir' "$@")"if [ ! -d "$DATADIR/mysql" ]; thenfile_env 'MYSQL_ROOT_PASSWORD'if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; thenecho >&2 'error: database is uninitialized and password option is not specified 'echo >&2 ' You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD'exit 1fimkdir -p "$DATADIR"echo 'Initializing database'"$@" --initialize-insecureecho 'Database initialized'if command -v mysql_ssl_rsa_setup > /dev/null && [ ! -e "$DATADIR/server-key.pem" ]; then# https://github.com/mysql/mysql-server/blob/23032807537d8dd8ee4ec1c4d40f0633cd4e12f9/packaging/deb-in/extra/mysql-systemd-start#L81-L84echo 'Initializing certificates'mysql_ssl_rsa_setup --datadir="$DATADIR"echo 'Certificates initialized'fiSOCKET="$(_get_config 'socket' "$@")""$@" --skip-networking --socket="${SOCKET}" &pid="$!"mysql=( mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" )for i in {30..0}; doif echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; thenbreakfiecho 'MySQL init process in progress...'sleep 1doneif [ "$i" = 0 ]; thenecho >&2 'MySQL init process failed.'exit 1fiif [ -z "$MYSQL_INITDB_SKIP_TZINFO" ]; then# sed is for https://bugs.mysql.com/bug.php?id=20545mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/FCTY/' | "${mysql[@]}" mysqlfiif [ ! -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; thenexport MYSQL_ROOT_PASSWORD="$(pwgen -1 32)"echo "GENERATED ROOT PASSWORD: $MYSQL_ROOT_PASSWORD"firootCreate=# default root to listen for connections from anywherefile_env 'MYSQL_ROOT_HOST' '%'if [ ! -z "$MYSQL_ROOT_HOST" -a "$MYSQL_ROOT_HOST" != 'localhost' ]; then# no, we don't care if read finds a terminating character in this heredoc# https://unix.stackexchange.com/questions/265149/why-is-set-o-errexit-breaking-this-read-heredoc-expression/265151#265151read -r -d '' rootCreate <<-EOSQL || trueCREATE USER 'root'@'${MYSQL_ROOT_HOST}' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;GRANT ALL ON *.* TO 'root'@'${MYSQL_ROOT_HOST}' WITH GRANT OPTION ;EOSQLfi"${mysql[@]}" <<-EOSQL-- What's done in this file shouldn't be replicated-- or products like mysql-fabric won't workSET @@SESSION.SQL_LOG_BIN=0;ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;GRANT ALL ON *.* TO 'root'@'localhost' WITH GRANT OPTION ;${rootCreate}DROP DATABASE IF EXISTS test ;FLUSH PRIVILEGES ;EOSQLif [ ! -z "$MYSQL_ROOT_PASSWORD" ]; thenmysql+=( -p"${MYSQL_ROOT_PASSWORD}" )fifile_env 'MYSQL_DATABASE'if [ "$MYSQL_DATABASE" ]; thenecho "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"mysql+=( "$MYSQL_DATABASE" )fifile_env 'MYSQL_USER'file_env 'MYSQL_PASSWORD'if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; thenecho "CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD' ;" | "${mysql[@]}"if [ "$MYSQL_DATABASE" ]; thenecho "GRANT ALL ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_USER'@'%' ;" | "${mysql[@]}"fiecho 'FLUSH PRIVILEGES ;' | "${mysql[@]}"fiechols /docker-entrypoint-initdb.d/ > /dev/nullfor f in /docker-entrypoint-initdb.d/*; doprocess_init_file "$f" "${mysql[@]}"doneif [ ! -z "$MYSQL_ONETIME_PASSWORD" ]; then"${mysql[@]}" <<-EOSQLALTER USER 'root'@'%' PASSWORD EXPIRE;EOSQLfiif ! kill -s TERM "$pid" || ! wait "$pid"; thenecho >&2 'MySQL init process failed.'exit 1fiechoecho 'MySQL init process done. Ready for start up.'echofifiexec "$@"
redis
FROM debian:stretch-slim# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get addedRUN groupadd -r redis && useradd -r -g redis redis# grab gosu for easy step-down from root# https://github.com/tianon/gosu/releasesENV GOSU_VERSION 1.10RUN set -ex; \\fetchDeps=" \ca-certificates \dirmngr \gnupg \wget \"; \apt-get update; \apt-get install -y --no-install-recommends $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 ha.pool.sks-keyservers.net --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 $fetchDepsENV REDIS_VERSION 5.0.4ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-5.0.4.tar.gzENV REDIS_DOWNLOAD_SHA 3ce9ceff5a23f60913e1573f6dfcd4aa53b42d4a2789e28fa53ec2bd28c987dd# for redis-sentinel see: http://redis.io/topics/sentinelRUN set -ex; \\buildDeps=' \ca-certificates \wget \\gcc \libc6-dev \make \'; \apt-get update; \apt-get install -y $buildDeps --no-install-recommends; \rm -rf /var/lib/apt/lists/*; \\wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL"; \echo "$REDIS_DOWNLOAD_SHA *redis.tar.gz" | sha256sum -c -; \mkdir -p /usr/src/redis; \tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1; \rm redis.tar.gz; \\# disable Redis protected mode [1] as it is unnecessary in context of Docker# (ports are not automatically exposed when running inside Docker, but rather explicitly by specifying -p / -P)# [1]: https://github.com/antirez/redis/commit/edd4d555df57dc84265fdfb4ef59a4678832f6dagrep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 1$' /usr/src/redis/src/server.h; \sed -ri 's!^(#define CONFIG_DEFAULT_PROTECTED_MODE) 1$!\1 0!' /usr/src/redis/src/server.h; \grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 0$' /usr/src/redis/src/server.h; \# for future reference, we modify this directly in the source instead of just supplying a default configuration flag because apparently "if you specify any argument to redis-server, [it assumes] you are going to specify everything"# see also https://github.com/docker-library/redis/issues/4#issuecomment-50780840# (more exactly, this makes sure the default behavior of "save on SIGTERM" stays functional by default)\make -C /usr/src/redis -j "$(nproc)"; \make -C /usr/src/redis install; \\rm -r /usr/src/redis; \\apt-get purge -y --auto-remove $buildDepsRUN mkdir /data && chown redis:redis /dataVOLUME /dataWORKDIR /dataCOPY docker-entrypoint.sh /usr/local/bin/ENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 6379CMD ["redis-server"]
capsule image runc redis /usr/local/bin/docker-entrypoint.sh redis-server --id=redis -p 6379:6379 -d
将/usr/local/bin/docker-entrypoint.sh中chown的部分删掉,因为capsule不支持多用户,目前只能用root。
修改后的是这样的:
#!/bin/shset -e# first arg is `-f` or `--some-option`# or first arg is `something.conf`if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; thenset -- redis-server "$@"fiexec "$@"
capsule-demo-app
FROM java:8VOLUME /tmpADD capsule-demo-app.jar app.jarENTRYPOINT [ "sh", "-c", "java -jar /app.jar"]
capsule image runc capsule-demo-app "java -jar /app.jar" -id capsule-demo-container -e "SPRING_PROFILES_ACTIVE=prod" -p 8080:8080 -d -link mysql:mysql-container -link redis:redis-container
