Как правильно писать Dockerfile, чтобы другим не приходилось собирать образы локально, а можно было просто посмотреть на файл сборки в репозитории образов и убедиться, что в нем нет потенциального вредоносного кода?
Инструкция
Заходим в репозиторий проекта, образ которого мы хотим собрать. Здесь, как пример, будет использован репозиторий: GitHub - pufferffish/wireproxy: Wireguard client that exposes itself as a socks5 proxy. Который используется для настройки wireguard как прокси-сервер.
Смотрим есть ли готовые релизы в виде архивов?
Если да, то мы можем создать Dockerfile не требующий доверия.
Также нужно разобраться для каких архитектур есть собранные решения? В случае данного репозитория у нас есть сборки для:
- 386
- arm
- arm64
- amd64
- mips
- mipsle
Теперь мы можем составить команду для загрузки архива:
FROM alpine:latest
RUN apk add --no-cache curl \
&& ARCH=$(uname -m) \
&& if [ "${ARCH}" = "i386" ]; then ARCH="386"; fi \
&& if [ "${ARCH}" = "i686" ]; then ARCH="386"; fi \
&& if [ "${ARCH}" = "x86_64" ]; then ARCH="amd64"; fi \
&& if [ "${ARCH}" = "aarch64" ]; then ARCH="arm64"; fi \
&& WIREPROXY_URL=$(curl -fsSL https://api.github.com/repos/pufferffish/wireproxy/releases/latest | grep 'browser_download_url' | cut -d'"' -f4 | grep "wireproxy_linux_${ARCH}.tar.gz") \
&& curl -fsSL "${WIREPROXY_URL}" -o ./wireproxy.tar.gz \
&& tar -xzf wireproxy.tar.gz \
&& rm wireproxy.tar.gz \
&& chmod +x ./wireproxy \
&& mv ./wireproxy /usr/bin
VOLUME [ "/etc/wireproxy"]
ENTRYPOINT [ "/usr/bin/wireproxy" ]
CMD [ "--config", "/etc/wireproxy/config" ]
LABEL org.opencontainers.image.title="wireproxy"
LABEL org.opencontainers.image.description="Wireguard client that exposes itself as a socks5 proxy"
LABEL org.opencontainers.image.licenses="ISC"где:
-
| grep 'browser_download_url'- Эта часть фильтрует выходные данные curl, оставляя только строки, содержащие ‘browser_download_url’.
-
| cut -d'"' -f4- Вырезает четвертое поле из каждой строки, используя двойную кавычку как разделитель. (в данном случае отбрасывает ключ “browser_download_url” и оставляет Value коим является URL)
- Это извлекает фактический URL загрузки.
-
| grep "wireproxy_linux_${ARCH}.tar.gz"- Финальный grep фильтрует результаты, оставляя только строку, содержащую URL архива с правильным названием файла для конкретной архитектуры.
Далее разархивируем архив, удаляем его, делаем исполняемым и переносим в папку, где он по стандарту хранится. После копируем стандартные строки запуска из Dockerfile хранящемся в репозитории.