#docker #date #dockerfile #alpine
Вопрос:
Поэтому я пытаюсь создать контейнер Alpine, включая приложение, которое требуется bash
и curl
для установки.
Проблема в том, что Alpine, похоже, считает, что сейчас 2037 год (возможно, из-за отсутствия у хост-Пи блокировки), игнорируя правильное время ОС/системы хоста (поддерживается в актуальном состоянии NTP), поэтому вызов apk завершается неудачно:
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/armv7/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/armv7/APKINDEX.tar.gz
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.14/main: temporary error (try again later)
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.14/community: temporary error (try again later)
ERROR: unable to select packages:
bash (no such package):
required by: world[bash]
curl (no such package):
required by: world[curl]
Можно использовать docker run -it --privileged ...
для запуска контейнера в интерактивном режиме, и время будет установлено правильно, поэтому установка пройдет без сучка и задоринки.
Ссылка, которую я нашел, предполагает, что privileged
сборки невозможны (ссылка?).
Я пробовал много способов скоротать время в контейнере во время сборки, но все безуспешно:
# syntax=docker/dockerfile:1
FROM alpine:3.14
# Pass build-time using `--build-arg time=$(date %s)` (w/ default value)
ARG time=1632511895
#RUN ["/bin/date", "-s", "@$time"] # `invalid date @$time`
#RUN ["/bin/date", "-s", "@"$time] # `/bin/date/` not found
#RUN echo $(date) # no output
#RUN date -s @$time # `date: can't set date: Operation not permitted`
#RUN sudo date -s @$time # /bin/sh: sudo: not found
# cannot build with `--privileged` so clock will be in 2037 and apk will fail
RUN apk add --no-cache curl bash
WORKDIR /tmp
Как я могу установить curl
и bash
во время сборки??
Попытки
- Попытался установить часовой пояс, как указано здесь: никакого эффекта
- Попытался заставить apk использовать HTTP
RUN sed -i 's/https/http/g' /etc/apk/repositories
передapk
командой (TY @jan-garaj): я получил только новую/дополнительную ошибку:The command '/bin/sh -c apk add --no-cache curl bash' returned a non-zero code: 2
Подробная информация
# date
Sat Oct 23 13:17:47 EDT 2021
# docker info
Client:
Debug Mode: false
Server:
Containers: 4
Running: 0
Paused: 0
Stopped: 4
Images: 19
Server Version: 19.03.15
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 269548fa27e0089a8b8278fc4fc781d7f65a939b
runc version: ff819c7e9184c13b7c2607fe6c30ae19403a7aff
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 4.19.66-v7
Operating System: Raspbian GNU/Linux 9 (stretch)
OSType: linux
Architecture: armv7l
CPUs: 4
Total Memory: 858.7MiB
Name: rpi0.crcondo
ID: WW63:IXLY:OBPE:AX4O:45H7:OAUH:CELE:ALDG:ZHC3:RTQW:I32M:GSDL
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support
Комментарии:
1. Этот пост относится к настройке часового пояса — я отключен не по часам, а по годам. Кроме того, я использую Alpine, а не Ubuntu. Это действительно было связано здесь , но это также было специфично для часовых поясов. (Я все равно попробовал: никакого эффекта)
2. У Alpine есть некоторые странности с тем, как он наследует время от хост-системы. В прошлом я обходил эту проблему, устанавливая возможность SYS_TIME при запуске контейнера. Хотя эта возможность должна потребоваться только для установки времени хоста из контейнера docker, похоже, что она обеспечивает синхронизацию часов с контейнером. По общему признанию, я не могу воспроизвести вашу проблему, поэтому я не уверен, что это решит вашу проблему, но это простое решение для тестирования.
3. Я нашел ссылку на использование
--cap-add
сdocker run
; за исключением того, что это проблемы со сборкой, и я не могу найти никаких документов, в которых указано, как использовать--cap-add
docker build
.4. Конечно же. Я откопал старый rasp pi и переформатировал, и теперь я могу воспроизвести вашу проблему, так что, по крайней мере, это не что-то странное в вашей среде. Я не смог найти решение, хотя, независимо от того, использую ли сборку vanilla docker или kaniko (которая создает контейнер внутри контейнера, позволяющий использовать или-привилегированный для установки времени), я получаю проблему в обоих случаях.
5. Конечно, он установлен в Pi (в противном случае HTTPS и множество других сбоев); проблема в том, что сборка docker не передает правильное время в образ сборки
Ответ №1:
Я бы ответил «Как я могу установить curl и bash во время сборки», а не «Как установить время в контейнере Docker во время сборки».:
Я предполагаю, что apk не работает, потому что сертификат TLS репо dl-cdn.alpinelinux.org
недействителен после 2037 года = может быть создано действительное соединение TLS. Вам нужно только установить пакет, поэтому в этом случае вы можете пожертвовать безопасностью TLS, и в качестве обходного пути можно использовать простое HTTP-соединение с репозиторием. Например.
RUN
sed -i 's/https/http/g' /etc/apk/repositories amp;amp;
apk add --no-cache curl bash
К сожалению, в apk нет флага для игнорирования проверки TLS, поэтому на данный момент можно использовать только этот обходной путь.
Кстати: Я бы попробовал использовать старый добрый NTP на хосте Pi. Контейнеры используют время хоста, поэтому правильная настройка времени (через синхронизацию NTP) на уровне хоста также должна решить проблему на уровне контейнера (а затем также проблему с проверкой сертификата TLS).
Обновить:
Видишь https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.14.0:
Поэтому вам нужно обновить версию Docker ( 20.10.0
), у вас есть только 19.03.15
.
Комментарии:
1. Спасибо, что попробовали это сделать! К сожалению, та же самая ошибка, что и выше, сохраняется; единственное отличие-новая ошибка:
The command '/bin/sh -c sed -i 's/https/http/g' /etc/apk/repositories amp;amp; apk add --no-cache curl bash' returned a non-zero code: 2
2. @AdamSmooch это был только пример, потому что у меня нет вашей настройки. Похоже, у вас очень странная настройка докера. Пожалуйста, предоставьте
docker info
выходные данные. Запускайте команды вручную в контейнере, а не в сборке — неясно, какая команда не выполняется.3. Ошибка возникает из команды apk (следующей за
sed
):The command '/bin/sh -c apk add --no-cache curl bash' returned a non-zero code: 2
. Как уже упоминалось — запуск команд apk в контейнере (с —привилегированным) работает нормально, так как время установлено правильно.docker info
добавлено к вопросу.4. @AdamSmooch см. Примечания к обновлению и выпуску Alpine
5. Пробовал
alpine:3.13
, так как для этого требуется докер 19.03.09 , но та же ошибка… В следующий раз я попробую обновить докер…
Ответ №2:
Итак, ответ @JanGaraj дал мне важную подсказку: в примечаниях к выпуску Alpine 3.14 упоминается, что для этого требуется Docker >=20.10.0
(в настоящее время я работаю 19.03.15
).
Возвращаясь к примечаниям к выпуску Alpine 3.13:
- Требование к версии докера
19.03.9
[которое у меня есть] - вместе с
libseccomp 2.4.2
Простое использование FROM alpine:3.13
все еще не работало.
Проверяя второе требование, у меня была предыдущая версия libseccomp[2]
, и поиск в Интернете привел меня к этому сообщению: https://blog.samcater.com/fix-workaround-rpi4-docker-libseccomp2-docker-20/
Использование описанных в нем шагов для обновления libseccomp[2]
помогло обоим alpine:3.13
и alpine:3.14
!!
Шаги по исправлению (из поста)
Шаги для libseccomp2 хорошо документированы, так как это было проблемой на нескольких платформах (не только RPI4). Вы можете выполнить установку «oneshot» более новой версии, которую можно найти здесь https://github.com/itzg/docker-minecraft-server/issues/755#issuecomment-781615497
Лично я считаю, что лучший способ-это установить его из репозитория Buster Backports, который очень безопасно добавить. Это также означает, что любые будущие обновления libseccomp будут применены к Pi.
# Get signing keys to verify the new packages, otherwise they will not install
rpi ~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC 648ACFD622F3D138
# Add the Buster backport repository to apt sources.list
rpi ~$ echo 'deb http://httpredir.debian.org/debian buster-backports main contrib non-free' | sudo tee -a /etc/apt/sources.list.d/debian-backports.list
rpi ~$ sudo apt update
rpi ~$ sudo apt install libseccomp2 -t buster-backports
Теперь перейдем к следующему сообщению об ошибке во время сборки 😅