2

I'm trying to collect apk packages to local repo to install them later. But apk update says that this repo directory does not exists (what is not true). It does not depend on actual location and is very strange

Run alpine:

docker run -it --rm alpine:latest sh

Create repo inside and try to use it:

/ # mkdir /repo
/ # apk fetch --recursive -o /repo screen
WARNING: opening from cache https://dl-cdn.alpinelinux.org/alpine/v3.21/main: No such file or directory
WARNING: opening from cache https://dl-cdn.alpinelinux.org/alpine/v3.21/community: No such file or directory
screen: unable to select package (or its dependencies)
/ # apk update
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
v3.21.3-357-g39d49089a10 [https://dl-cdn.alpinelinux.org/alpine/v3.21/main]
v3.21.3-358-g5686bc96b73 [https://dl-cdn.alpinelinux.org/alpine/v3.21/community]
OK: 25396 distinct packages available
/ # apk fetch --recursive -o /repo screen
Downloading libncursesw-6.5_p20241006-r3
Downloading linux-pam-1.6.1-r1
Downloading musl-1.2.5-r9
Downloading ncurses-terminfo-base-6.5_p20241006-r3
Downloading screen-5.0.0-r0
Downloading skalibs-libs-2.14.3.0-r0
Downloading utmps-libs-0.1.2.3-r2
/ # cd repo
/repo # ls -lah
total 1M     
drwxr-xr-x    2 root     root        4.0K Apr 21 17:54 .
drwxr-xr-x    1 root     root          63 Apr 21 17:53 ..
-rw-r--r--    1 root     root      154.9K Nov 11 17:11 libncursesw-6.5_p20241006-r3.apk
-rw-r--r--    1 root     root      191.0K Oct 30 12:34 linux-pam-1.6.1-r1.apk
-rw-r--r--    1 root     root      401.7K Feb 13 17:58 musl-1.2.5-r9.apk
-rw-r--r--    1 root     root       20.8K Nov 11 17:11 ncurses-terminfo-base-6.5_p20241006-r3.apk
-rw-r--r--    1 root     root      431.5K Oct 30 12:35 screen-5.0.0-r0.apk
-rw-r--r--    1 root     root       76.2K Oct 30 12:35 skalibs-libs-2.14.3.0-r0.apk
-rw-r--r--    1 root     root        4.9K Oct 30 12:35 utmps-libs-0.1.2.3-r2.apk
/repo # apk index -vU -o APKINDEX.tar.gz *.apk
Index has 0 packages (of which 7 are new)
/repo # apk update
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
v3.21.3-357-g39d49089a10 [https://dl-cdn.alpinelinux.org/alpine/v3.21/main]
v3.21.3-358-g5686bc96b73 [https://dl-cdn.alpinelinux.org/alpine/v3.21/community]
OK: 25396 distinct packages available
/repo # echo "/repo" >> /etc/apk/repositories
/repo # apk update
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
WARNING: opening /repo: No such file or directory
v3.21.3-357-g39d49089a10 [https://dl-cdn.alpinelinux.org/alpine/v3.21/main]
v3.21.3-358-g5686bc96b73 [https://dl-cdn.alpinelinux.org/alpine/v3.21/community]
OK: 25396 distinct packages available

1 Answer 1

3

The packages and the index of an apk repository must be stored beneath an architecture-specific subdirectory. From apk-repositories(5):

Each repository must store an index at $repository/$arch/APKINDEX.tar.gz. See apk-index(8) for information about generating this file. The packages themselves are stored at $repository/$arch/$pkgname-$pkgver-r$pkgrel.apk.

Following on after your commands in the question:

/repo # cd /repo/
/repo # arch
x86_64
/repo # mkdir "$(arch)"
/repo # mv * "$(arch)"/
mv: can't rename 'x86_64': Invalid argument
/repo # apk update
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
WARNING: opening /repo: UNTRUSTED signature
v3.21.3-357-g39d49089a10 [https://dl-cdn.alpinelinux.org/alpine/v3.21/main]
v3.21.3-358-g5686bc96b73 [https://dl-cdn.alpinelinux.org/alpine/v3.21/community]
OK: 25396 distinct packages available

Note that for the repository to be usable, its index also needs to be signed. From the apk-index(8) manual:

Generally, the resulting index must be cryptographically signed before apk will accept it. See abuild-sign(1) for details.


Instead of creating a local repository, it may be easier to use an apk cache (depending on what it is you want to achieve, you could let /var/cache be a Docker volume):

$ docker run -it --rm alpine:latest sh
/ # mkdir -p /var/cache/apk
/ # ln -s /var/cache/apk /etc/apk/cache
/ # apk update
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
v3.21.3-357-g39d49089a10 [https://dl-cdn.alpinelinux.org/alpine/v3.21/main]
v3.21.3-358-g5686bc96b73 [https://dl-cdn.alpinelinux.org/alpine/v3.21/community]
OK: 25396 distinct packages available
/ # apk cache download screen
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/musl-1.2.5-r9.apk
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/ncurses-terminfo-base-6.5_p20241006-r3.apk
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/libncursesw-6.5_p20241006-r3.apk
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/skalibs-libs-2.14.3.0-r0.apk
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/utmps-libs-0.1.2.3-r2.apk
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/linux-pam-1.6.1-r1.apk
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/screen-5.0.0-r0.apk
/ # apk --no-network add tmux
ERROR: unable to select packages:
  libevent-2.1.12-r7:
    masked in: --no-network
    satisfies: tmux-3.5a-r0[so:libevent_core-2.1.so.7]
  tmux-3.5a-r0:
    masked in: --no-network
    satisfies: world[tmux]
/ # apk --no-network add screen
(1/6) Installing ncurses-terminfo-base (6.5_p20241006-r3)
(2/6) Installing libncursesw (6.5_p20241006-r3)
(3/6) Installing skalibs-libs (2.14.3.0-r0)
(4/6) Installing utmps-libs (0.1.2.3-r2)
(5/6) Installing linux-pam (1.6.1-r1)
(6/6) Installing screen (5.0.0-r0)
Executing busybox-1.37.0-r12.trigger
OK: 9 MiB in 21 packages

See also the apk-cache(5) and apk-cache(8) manuals.

1
  • Thank u! yes, all files must be under $(arch), repo path is without arch Commented Apr 22 at 7:41

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.