Минималистичный образ Alpine

Поиск пакетов apk

Поиск пакетов он-лайн, либо через apk search ...:

docker run -it --rm alpine
# в контейнере:
apk update
apk search curl

Отдельные пакеты не доступны из «коробки» (файл /etc/apk/repositories), например swaks.

В таком случае нужно явно указать репозиторий:

apk add swaks --update-cache --repository http://nl.alpinelinux.org/alpine/edge/testing

Вот дополнительный список:

@edge http://nl.alpinelinux.org/alpine/edge/main
@edgecommunity http://nl.alpinelinux.org/alpine/edge/community
@testing http://nl.alpinelinux.org/alpine/edge/testing

Добавление корневых сертификатов

apk add --no-cache ca-certificates && update-ca-certificates

dev-окружение

Удобно для отладки в режиме `docker -exec -it контейнер sh`:

# dev section
ENV ENV="/etc/profile"
ADD ./dev.profile.sh /etc/profile.d/dev.profile.sh
RUN apk add --no-cache exim-scripts tree man
# end dev section

В файл dev.profile.sh можно вписать нужные алиасы, например.

Настройка timezone

Пример взят отсюда:

ENV TZ Europe/Moscow
RUN	set -x && \
	apk add --no-cache --virtual .tz alpine-conf tzdata && \ 
	/sbin/setup-timezone -z $TZ && \
	apk del .tz 	

Тут рекомендуют такой способ:

apk add tzdata
cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
echo "Europe/Moscow" >  /etc/timezone
date
apk del tzdata

init-система OpenRC

В качестве init-системы используется OpenRC, которая не входит в базовый образ и ставится отдельно. Мне она потребовалась для запуска sphinxd.

apk add openrc

Основные команды такие:

rc-service <service> <start stop restart>
rc-status

Однако при выполнении

rc-service sphinx start

Появилась ошибка:

* You are attempting to run an openrc service on a
* system which openrc did not boot.
* You may be inside a chroot or you may have used
* another initialization system to boot this system.

Поэтому нужно пропатчить конфигурацию, например так:

Dockerfile
FROM alpine:edge
# use the CDN mirror from gilderlabs since its much faster
RUN mkdir -p /etc/apk && echo "http://alpine.gliderlabs.com/alpine/edge/main" > /etc/apk/repositories &&\
# Install openrc
    apk update && apk add openrc &&\
# Tell openrc its running inside a container, till now that has meant LXC
    sed -i 's/#rc_sys=""/rc_sys="lxc"/g' /etc/rc.conf &&\
# Tell openrc loopback and net are already there, since docker handles the networking
    echo 'rc_provide="loopback net"' >> /etc/rc.conf &&\
# no need for loggers
    sed -i 's/^#\(rc_logger="YES"\)$/\1/' /etc/rc.conf &&\
# can't get ttys unless you run the container in privileged mode
    sed -i '/tty/d' /etc/inittab &&\
# can't set hostname since docker sets it
    sed -i 's/hostname $opts/# hostname $opts/g' /etc/init.d/hostname &&\
# can't mount tmpfs since not privileged
    sed -i 's/mount -t tmpfs/# mount -t tmpfs/g' /lib/rc/sh/init.sh &&\
# can't do cgroups
    sed -i 's/cgroup_add_service /# cgroup_add_service /g' /lib/rc/sh/openrc-run.sh &&\
# clean apk cache
    rm -rf /var/cache/apk/*
CMD ["/sbin/init"]

Решение скопировано отсюда.

Посмотрев исходники /etc/init.d/sphinx я решил запускать Sphinx в баш-скрипте run.sh через вызов /usr/bin/searchd

А поискав, нашел готовый дистрибутив на сайте вендора, причем актуальный: https://sphinxsearch.com/downloads/current/

crontab

Запустить можно так через Dockerfile:

CMD ['crond', '&&', 'sphinx']
Печать/экспорт