Container Local Apt Repository Kurulumu-NFS share-Inotifywait Ubuntu 16.04

Betül Aslan
4 min readMay 18, 2021

Projelerimizde veya operasyonel işlemlerimizde hazır apt repository’leri haricinde, kendi paketlerimizi yönetebileceğimiz bir apt repository’sine ihtiyac duyabiliyoruz. Bu neden ile local bir apt repository kurarak bu ihtiyacımızı karşılayabiliriz.

Local apt repository’sini bir sanal veya fiziksel bir makine üzerine kurarak servis vermesini sağlayabiliriz.Buradan nasıl kurulduğuna ulaşabilirsiniz.

https://linuxconfig.org/how-to-create-a-ubuntu-repository-server

Ama container bir local apt repository ile çok daha kolay, hızlı ve esnek bir apt repository kurabiliriz. Bunun için öncelikle dockerfile’ımızı oluşturmalıyız. Dockerfile’da base image olarak apache’nin “httpd” docker image’ını kullanabiliriz.

apt repository’si içerisinde kurulmasını istediğimiz paketleri ekliyoruz. Birde httpd.conf dosyamızda eğer bir değişiklik yaptıysak onuda container içerisinde /usr/local/apache2/ dizini altına kopyalıyoruz. Eğer bir değişiklik yapmadıysanız “copy” işlemine de gerek yok. httpd.conf dosyasında apache’nin default config dosyasıdır.

Sıra geldi image’ı oluşturup container’ı ayaklandırmaya.

$ docker rm -f debianrepo && docker build -t debrepo:1.0 -f Dockerfile.debian . && docker run -dit --restart always --name debianrepo -p 8080:80 --mount ‘type=volume,source=nfsvolumedebrepo,target=/usr/local/apache2/htdocs/repos,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/debrepo,volume-opt=o=addr=192.168.13.47’ debrepo:1.0

Yukarıdaki bu komut dizisi ile bir image yaratıp, container oluşturduk. Aslında bizim bir apt repositorymiz var artık. Container’a volume attach etmek zorunda değilsiniz veya hangi volume type’ını kullanacağınıza kendiniz karar verip, run ederken ekleyebilirsiniz.

Biz containerımıza volume olarak nfs share attach etmeyi tercih ettik. Biraz bu konudan da bahsetmek istiyorum. Bizim projede kendi debian paketlerimizin tutulduğu bir local apt repository’si vardı. Buradaki paketleri yeni oluşturduğum container apt repository’sine de eklemek için bu işlemi yapıyorum. Paket ekleme çıkarma işlemlerine böylece mevcut apt repository’si üzerinden devam edebiliriz.

Sırası ile öncelikle;

1-NFS server olarak çalışan makinede;

$ apt update 
$ sudo apt-get install nfs-kernel-server nfs-common -y

NFS home dizini oluşturulur ve kullanıcı izinleri set edilir.

mkdir /debrepo
chown -R nobody:nogroup /debrepo

NFS client’ların, server’a erişebilmesi için, export dosyasına ekleme yapılır.

nfs client IP ve permission’lar belirtilir.

echo "/debrepo 192.168.13.173(rw,sync,fsid=0,no_root_squash,crossmnt,no_subtree_check,no_acl,insecure)" >> /etc/exportnfs servisi başlatılır.$ sudo systemctl restart nfs-kernel-server
$ sudo systemctl enable nfs-kernel-server
sudo exportfs -ra

2-NFS client makinesinde ise;

$ apt update
$ sudo apt-get install nfs-common -y

/etc/fstab dosyasına ekleme yaptıktan sonra ardından test edelim,

echo "192.168.13.47:/debrepo /mnt/nfserver nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0" >> /etc/fstab$ sudo mount 192.168.13.47:/debrepo /mntdf -hFilesystem      Size  Used Avail Use% Mounted on
udev 7.9G 0 7.9G 0% /dev
tmpfs 1.6G 170M 1.5G 11% /run
/dev/vda1 97G 24G 74G 24% /
tmpfs 7.9G 0 7.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
tmpfs 1.6G 0 1.6G 0% /run/user/1000
:/debrepo 97G 86G 11G 89% /mnt
umount ile mount ettiğimiz nfs server dizinini kaldırmış oluruz.sudo umount /mnt

! Sadece container için nfs sharing yapılacak ise netshare plugin’in kurulması yeterli olacaktır.

$ wget https://github.com/ContainX/docker-volume-netshare/releases/download/v0.36/docker-volume-netshare_0.36_amd64.deb$ dpkg -i docker-volume-netshare_0.36_amd64.deb$ service docker-volume-netshare startplugin çalıştırılır ve systemd'ye eklenir. Arkaplanda sürekli çalışması gereklidir.sudo docker-volume-netshare nfs > /dev/null 2>&1 &docker run -dit --restart always --name debianrepo -p 8080:80 --mount ‘type=volume,source=nfsvolumedebrepo,target=/usr/local/apache2/htdocs/repos,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/debrepo,volume-opt=o=addr=192.168.13.47’ debrepo:1.0

container içerisinde mount ettiğimiz dizini kontrol ettiğimizde paketlerin geldiklerini görüyoruz.

Sıra geldi bu repository’den paket’leri çekip kurmaya. Herhangi bir ubuntu kurulu makine üzerinden cinar ve latest dizinlerindeki paketlere erişmek istiyoruz. Bu neden ile repository adresini /etc/apt/sources.list dosyasına giriyoruz.

echo “deb [trusted=yes] http://192.168.13.173:8081/repos/cinar/ amd64/” > /etc/apt/sources.listecho “deb [trusted=yes] http://192.168.13.173:8081/repos/latest/ amd64/” >> /etc/apt/sources.listroot@57ec5351a92c:/# apt update
Ign:1 http://192.168.13.173:8081/repos/cinar amd64/ InRelease
Ign:2
http://192.168.13.173:8081/repos/latest amd64/ InRelease
Ign:3
http://192.168.13.173:8081/repos/cinar amd64/ Release
Ign:4
http://192.168.13.173:8081/repos/latest amd64/ Release
Ign:5
http://192.168.13.173:8081/repos/cinar amd64/ Packages.diff/Index
Ign:6
http://192.168.13.173:8081/repos/latest amd64/ Packages.diff/Index
Hit:7
http://192.168.13.173:8081/repos/cinar amd64/ Packages
Hit:8
http://192.168.13.173:8081/repos/latest amd64/ Packages
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
root@57ec5351a92c:/# apt show libcnrcommon
Package: libcnrcommon
Version: 0.9.0.193
Priority: optional
Section: base
Maintainer: XX
Installed-Size: unknown
Depends:
Download-Size: 339 kB
APT-Manual-Installed: yes
APT-Sources:
http://192.168.13.173:8081/repos/cinar amd64/ Packages
Description: Cinar Common Library
root@57ec5351a92c:/# apt-get install -y libcnrcommon
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
libcnrcommon
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 339 kB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1
http://192.168.13.173:8081/repos/cinar amd64/ libcnrcommon 0.9.0.193 [339 kB]
Fetched 339 kB in 0s (3496 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libcnrcommon.
(Reading database ... 5152 files and directories currently installed.)
Preparing to unpack .../libcnrcommon_0.9.0.193_amd64.deb ...
Unpacking libcnrcommon (0.9.0.193) ...
Setting up libcnrcommon (0.9.0.193) ...

Buraya kadar sorunsuz çalıştı. Peki apt repo’ya yeni paketler geldiğinde scan edip, listeye eklenmesi için her defasında manuel olarak scan komutunu mu çalıştıracağız ? Tabi ki hayır. Inotifywait burada ihtiyacımızı görüyor.

Inotifywait ile belirtiğimiz dizinlerdeki guncellemeler otomatik olarak algılanıyor ve ardından yaptırmak istediğimiz işlemi-komutu çalıştırıyor.

Script içerisinde Inotifwait komutunu kullanabilmemiz için inotify-tools paketinin kurulu olması gerekli. Bu paketi en başta hazırladığım dockerfile dosyasına ekledim. Onun haricinde nfs server tarafına da kurulumu yaptım.

#Docker debian repository için 192.168.13.47 makinesindeki /debrepo dizini nfs share olarak kullanılmaktadır.
#Bu script ile NFS server tarafında /debrepo dizini altındaki paket guncellemeleri otomatik olarak algılanıp, scan edilir.

#!/bin/bash
LATEST=/debrepo/latest
CINAR=/debrepo/cinar
INTERWORKING=/debrepo/interworking
thirdparty=/debrepo/thirdparty
Mano=/debrepo/Mano
old=/debrepo/old
old_framework=/debrepo/old_framework
monitor() {
while inotifywait -e attrib,modify,create,delete $1
do
sleep 10
echo “packages updated folder:” $1/
rsync -avz --exclude ‘amd64/’ $1/ $1/amd64/
cd $1/amd64
apt-ftparchive packages . | gzip > Packages.gz
done
}
monitor “$LATEST” &
monitor “$CINAR” &
monitor “$INTERWORKING” &
monitor “$thirdparty” &
monitor “$Mano” &
monitor “$old” &
monitor “$old_framework” &

Yukarıdaki script’i nohup ile arka planda sürekli çalışır durumda çalıştırıyoruz.

nohup bash -c '/debrepo/updaterepo_nfsserver.sh 2>&1 &'

Link’ten inotifwait’in kullanımını inceleyebilirsiniz. https://linux.die.net/man/1/inotifywait

--

--