Содержание
Минималистичный образ 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
Появилась ошибка:
* 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']