Skip to content

Missed TMPDIR variable in the build container #97

@sergeyklay

Description

@sergeyklay

After I carefully examined this code, I noticed that it leads to an error:

packpack/pack/deb.mk

Lines 125 to 128 in 30ff7b5

cd $(BUILDDIR)/$(PRODUCT)-$(VERSION) && \
sudo mk-build-deps -i --tool "apt-get --no-install-recommends -y" && \
sudo rm -f *build-deps_*.deb \
@echo

Let me show how I detected this:

diff --git a/pack/deb.mk b/pack/deb.mk
index de4a0b7..29a77c9 100644
--- a/pack/deb.mk
+++ b/pack/deb.mk
@@ -37,6 +37,23 @@ PREBUILD_OS_DIST := prebuild-$(OS)-$(DIST).sh
 # gh-7: Ubuntu/Debian should export DEBIAN_FRONTEND=noninteractive
 export DEBIAN_FRONTEND=noninteractive
 
+define install_deps
+	sudo rm -rf /var/lib/apt/lists/
+	sudo apt-get update > /dev/null
+	cd $(1)
+	sudo mk-build-deps --install --tool "apt-get --no-install-recommends -yq"
+	$(eval DEPS_FILE := $(shell find . -maxdepth 1 -type f -regex ".*-build-deps.*\.deb"))
+	if [ -f "$(DEPS_FILE)" ]; then \
+		dpkg --info $(DEPS_FILE); \
+	fi
+	sudo rm -f *build-deps_*.deb;
+endef
+
 #
 # Run prebuild scripts
 #
@@ -120,11 +137,7 @@ $(BUILDDIR)/$(DPKG_CHANGES): $(BUILDDIR)/$(PRODUCT)-$(VERSION)/debian \
 	if [ -n "$(PACKAGECLOUD_USER)" ] && [ -n "$(PACKAGECLOUD_REPO)" ]; then \
 		curl -s https://packagecloud.io/install/repositories/$(PACKAGECLOUD_USER)/$(PACKAGECLOUD_REPO)/script.deb.sh | sudo bash; \
 	fi
-	sudo rm -rf /var/lib/apt/lists/
-	sudo apt-get update > /dev/null
-	cd $(BUILDDIR)/$(PRODUCT)-$(VERSION) && \
-		sudo mk-build-deps -i --tool "apt-get --no-install-recommends -y" && \
-		sudo rm -f *build-deps_*.deb \
+	$(call install_deps,$(BUILDDIR)/$(PRODUCT)-$(VERSION))
 	@echo
 	@echo "-------------------------------------------------------------------"
 	@echo "Building Debian packages"

After these changes I saw the following output:

sudo mk-build-deps --install --tool "apt-get --no-install-recommends -yq"
Error in tempdir() using /source/equivs.XXXXXX: Could not create directory /source/equivs.GUTb7J: Read-only file system at /usr/bin/equivs-build line 19.

This is obvious, because the source volume is mounted in read-only mode:

packpack/packpack

Lines 148 to 151 in 30ff7b5

docker run \
--volume "${PACKDIR}:/pack:ro" \
--volume "${SOURCEDIR}:/source:ro" \
--volume "${BUILDDIR}:/build" \

Lets take a look at /usr/bin/equivs-build:

$ cat /usr/bin/equivs-build | grep "equivs\." -A 1
my $builddir = tempdir('equivs.XXXXXX', DIR => ($ENV{TMPDIR} || cwd), CLEANUP => 1) or
  die "Cannot create temporary build dir: $!\n";

Thus we should add a TMPDIR environment variable pointing to writable directory as follows:

diff --git a/packpack b/packpack
index 6f4c80f..1659773 100755
--- a/packpack
+++ b/packpack
@@ -155,6 +155,7 @@ docker run \
         --entrypoint=/build/userwrapper.sh \
         -e XDG_CACHE_HOME=/cache \
         -e CCACHE_DIR=/cache/ccache \
+        -e TMPDIR=/tmp \
         --volume "${CACHE_DIR}:/cache" \
         ${DOCKER_REPO}:${DOCKER_IMAGE} \
         make -f /pack/Makefile -C /source BUILDDIR=/build -j "$@"

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions