Skip to content

Dockerfiles: reuse build arguments #257

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 127 additions & 51 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,17 +1,70 @@
# syntax=docker/dockerfile:1

FROM alpine:3.20 AS rootfs-stage
## Build arguments provided via cli arguments
ARG VERSION
ARG BUILD_DATE

## Runtime stage defaults
# Labels
ARG RUNTIME_LABEL_BUILD_VERSION="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}"
ARG RUNTIME_LABEL_MAINTAINER="TheLamer"
# User: root
ARG RUNTIME_ROOT_HOME="/root"
ARG RUNTIME_ROOT_TERM="xterm"
# User: abc
ARG RUNTIME_ABC_HOME=/config
ARG RUNTIME_ABC_SHELL=/bin/false
ARG RUNTIME_ABC_GROUP=users
ARG RUNTIME_ABC_GID=1000
ARG RUNTIME_ABC_UID=911
# Shell prompt
ARG RUNTIME_PS1="$(whoami)@$(hostname):$(pwd)\\$ "
# s6 overlay
ARG RUNTIME_S6_CMD_WAIT_FOR_SERVICES_MAXTIME="0"
ARG RUNTIME_S6_VERBOSITY=1
ARG RUNTIME_S6_STAGE2_HOOK=/docker-mods
# Virtual environment location of lsiopy
ARG RUNTIME_VIRTUAL_ENV=/lsiopy
# mod-scripts URL
ARG RUNTIME_MOD_SCRIPTS_URL_PREFIX=https://raw.githubusercontent.com/linuxserver/docker-mods/refs/heads/mod-scripts

# environment
ENV ROOTFS=/root-out
ENV REL=v3.21
ENV ARCH=x86_64
ENV MIRROR=http://dl-cdn.alpinelinux.org/alpine
ENV PACKAGES=alpine-baselayout,\
## Build argument defaults
# Globals
ARG ROOTFS=/root-out
ARG REL=v3.21
ARG ARCH=x86_64
ARG MIRROR=http://dl-cdn.alpinelinux.org/alpine
ARG PACKAGES=alpine-baselayout,\
alpine-keys,\
apk-tools,\
busybox,\
libc-utils
# s6 overlay
ARG S6_OVERLAY_RELEASES_URL_PREFIX=https://github.com/just-containers/s6-overlay/releases/download
ARG S6_OVERLAY_VERSION="3.2.0.2"
ARG S6_OVERLAY_ARCH=${ARCH}
# Package versions
ARG MODS_VERSION="v3"
ARG PKG_INST_VERSION="v1"
ARG LSIOWN_VERSION="v1"
ARG WITHCONTENV_VERSION="v1"


# RootFS stage
FROM alpine:3.20 AS rootfs-stage

# import global arguments
ARG ROOTFS
ARG REL
ARG ARCH
ARG MIRROR
ARG PACKAGES

# import s6 overlay arguments
ARG S6_OVERLAY_RELEASES_URL_PREFIX
ARG S6_OVERLAY_VERSION
ARG S6_OVERLAY_ARCH


# install packages
RUN \
Expand All @@ -21,56 +74,79 @@ RUN \

# build rootfs
RUN \
mkdir -p "$ROOTFS/etc/apk" && \
mkdir -p "${ROOTFS}/etc/apk" && \
{ \
echo "$MIRROR/$REL/main"; \
echo "$MIRROR/$REL/community"; \
} > "$ROOTFS/etc/apk/repositories" && \
apk --root "$ROOTFS" --no-cache --keys-dir /etc/apk/keys add --arch $ARCH --initdb ${PACKAGES//,/ } && \
sed -i -e 's/^root::/root:!:/' /root-out/etc/shadow

# set version for s6 overlay
ARG S6_OVERLAY_VERSION="3.2.0.2"
ARG S6_OVERLAY_ARCH="x86_64"
echo "${MIRROR}/${REL}/main"; \
echo "${MIRROR}/${REL}/community"; \
} > "${ROOTFS}/etc/apk/repositories" && \
apk --root "${ROOTFS}" --no-cache --keys-dir /etc/apk/keys add --arch $ARCH --initdb ${PACKAGES//,/ } && \
sed -i -e 's/^root::/root:!:/' ${ROOTFS}/etc/shadow

# add s6 overlay
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
RUN tar -C /root-out -Jxpf /tmp/s6-overlay-noarch.tar.xz
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_OVERLAY_ARCH}.tar.xz /tmp
RUN tar -C /root-out -Jxpf /tmp/s6-overlay-${S6_OVERLAY_ARCH}.tar.xz
ADD ${S6_OVERLAY_RELEASES_URL_PREFIX}/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
RUN tar -C ${ROOTFS} -Jxpf /tmp/s6-overlay-noarch.tar.xz

ADD ${S6_OVERLAY_RELEASES_URL_PREFIX}/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_OVERLAY_ARCH}.tar.xz /tmp
RUN tar -C ${ROOTFS} -Jxpf /tmp/s6-overlay-${S6_OVERLAY_ARCH}.tar.xz

# add s6 optional symlinks
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-noarch.tar.xz /tmp
RUN tar -C /root-out -Jxpf /tmp/s6-overlay-symlinks-noarch.tar.xz && unlink /root-out/usr/bin/with-contenv
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-arch.tar.xz /tmp
RUN tar -C /root-out -Jxpf /tmp/s6-overlay-symlinks-arch.tar.xz
ADD ${S6_OVERLAY_RELEASES_URL_PREFIX}/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-noarch.tar.xz /tmp
RUN tar -C ${ROOTFS} -Jxpf /tmp/s6-overlay-symlinks-noarch.tar.xz && unlink ${ROOTFS}/usr/bin/with-contenv

ADD ${S6_OVERLAY_RELEASES_URL_PREFIX}/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-arch.tar.xz /tmp
RUN tar -C ${ROOTFS} -Jxpf /tmp/s6-overlay-symlinks-arch.tar.xz


# Runtime stage
FROM scratch
COPY --from=rootfs-stage /root-out/ /
ARG BUILD_DATE
ARG VERSION
ARG MODS_VERSION="v3"
ARG PKG_INST_VERSION="v1"
ARG LSIOWN_VERSION="v1"
ARG WITHCONTENV_VERSION="v1"
LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}"
LABEL maintainer="TheLamer"

ADD --chmod=755 "https://raw.githubusercontent.com/linuxserver/docker-mods/mod-scripts/docker-mods.${MODS_VERSION}" "/docker-mods"
ADD --chmod=755 "https://raw.githubusercontent.com/linuxserver/docker-mods/mod-scripts/package-install.${PKG_INST_VERSION}" "/etc/s6-overlay/s6-rc.d/init-mods-package-install/run"
ADD --chmod=755 "https://raw.githubusercontent.com/linuxserver/docker-mods/mod-scripts/lsiown.${LSIOWN_VERSION}" "/usr/bin/lsiown"
ADD --chmod=755 "https://raw.githubusercontent.com/linuxserver/docker-mods/mod-scripts/with-contenv.${WITHCONTENV_VERSION}" "/usr/bin/with-contenv"
# import Runtime stage label arguments
ARG RUNTIME_LABEL_BUILD_VERSION
ARG RUNTIME_LABEL_MAINTAINER

# import global arguments
ARG ROOTFS

# import Package version arguments
ARG MODS_VERSION
ARG PKG_INST_VERSION
ARG LSIOWN_VERSION
ARG WITHCONTENV_VERSION

# import runtime stage arguments
ARG RUNTIME_ROOT_HOME
ARG RUNTIME_ROOT_TERM
ARG RUNTIME_ABC_HOME
ARG RUNTIME_ABC_SHELL
ARG RUNTIME_ABC_GROUP
ARG RUNTIME_ABC_GID
ARG RUNTIME_ABC_UID
ARG RUNTIME_S6_CMD_WAIT_FOR_SERVICES_MAXTIME
ARG RUNTIME_S6_VERBOSITY
ARG RUNTIME_S6_STAGE2_HOOK
ARG RUNTIME_PS1
ARG RUNTIME_VIRTUAL_ENV
ARG RUNTIME_MOD_SCRIPTS_URL_PREFIX

LABEL build_version="${RUNTIME_LABEL_BUILD_VERSION}"
LABEL maintainer="${RUNTIME_LABEL_MAINTAINER}"

COPY --from=rootfs-stage ${ROOTFS} /

ADD --chmod=755 "${RUNTIME_MOD_SCRIPTS_URL_PREFIX}/docker-mods.${MODS_VERSION}" "${RUNTIME_S6_STAGE2_HOOK}"
ADD --chmod=755 "${RUNTIME_MOD_SCRIPTS_URL_PREFIX}/package-install.${PKG_INST_VERSION}" "/etc/s6-overlay/s6-rc.d/init-mods-package-install/run"
ADD --chmod=755 "${RUNTIME_MOD_SCRIPTS_URL_PREFIX}/lsiown.${LSIOWN_VERSION}" "/usr/bin/lsiown"
ADD --chmod=755 "${RUNTIME_MOD_SCRIPTS_URL_PREFIX}/with-contenv.${WITHCONTENV_VERSION}" "/usr/bin/with-contenv"

# environment variables
ENV PS1="$(whoami)@$(hostname):$(pwd)\\$ " \
HOME="/root" \
TERM="xterm" \
S6_CMD_WAIT_FOR_SERVICES_MAXTIME="0" \
S6_VERBOSITY=1 \
S6_STAGE2_HOOK=/docker-mods \
VIRTUAL_ENV=/lsiopy \
PATH="/lsiopy/bin:$PATH"
ENV PS1=${RUNTIME_PS1} \
HOME=${RUNTIME_ROOT_HOME} \
TERM=${RUNTIME_ROOT_TERM} \
S6_CMD_WAIT_FOR_SERVICES_MAXTIME=${RUNTIME_S6_CMD_WAIT_FOR_SERVICES_MAXTIME} \
S6_VERBOSITY=${RUNTIME_S6_VERBOSITY} \
S6_STAGE2_HOOK=${RUNTIME_S6_STAGE2_HOOK} \
VIRTUAL_ENV=${RUNTIME_VIRTUAL_ENV} \
PATH="${RUNTIME_VIRTUAL_ENV}/bin:${PATH}"

RUN \
echo "**** install runtime packages ****" && \
Expand All @@ -88,14 +164,14 @@ RUN \
shadow \
tzdata && \
echo "**** create abc user and make our folders ****" && \
groupmod -g 1000 users && \
useradd -u 911 -U -d /config -s /bin/false abc && \
usermod -G users abc && \
groupmod -g ${RUNTIME_ABC_GID} ${RUNTIME_ABC_GROUP} && \
useradd -u ${RUNTIME_ABC_UID} -U -d ${RUNTIME_ABC_HOME} -s ${RUNTIME_ABC_SHELL} abc && \
usermod -G ${RUNTIME_ABC_GROUP} abc && \
mkdir -p \
/app \
/config \
${RUNTIME_ABC_HOME} \
/defaults \
/lsiopy && \
${RUNTIME_VIRTUAL_ENV} && \
echo "**** cleanup ****" && \
rm -rf \
/tmp/*
Expand Down
Loading