mirror of
				https://github.com/ohwgiles/laminar.git
				synced 2025-06-13 12:54:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			54 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash -eu
 | 
						|
 | 
						|
# Any failing command in a pipe will cause an error, instead
 | 
						|
# of just an error in the last command in the pipe
 | 
						|
set -o pipefail
 | 
						|
 | 
						|
# Log commands executed
 | 
						|
set -x
 | 
						|
 | 
						|
# Simple way of getting the docker build tag:
 | 
						|
tag=$(docker build -q - <<\EOF
 | 
						|
	FROM debian:bullseye
 | 
						|
	RUN apt-get update && apt-get install -y build-essential
 | 
						|
EOF
 | 
						|
)
 | 
						|
 | 
						|
# But -q suppresses the log output. If you want to keep it,
 | 
						|
# you could use the following fancier way:
 | 
						|
 | 
						|
exec {pfd}<><(:) # get a new pipe
 | 
						|
docker build - <<\EOF |
 | 
						|
	FROM debian:bullseye
 | 
						|
	RUN apt-get update && apt-get install -y build-essential
 | 
						|
EOF
 | 
						|
tee >(awk '/Successfully built/{print $3}' >&$pfd) # parse output to pipe
 | 
						|
read tag <&$pfd # read tag back from pipe
 | 
						|
exec {pfd}<&- # close pipe
 | 
						|
 | 
						|
# Alternatively, you can use the -t option to docker build
 | 
						|
# to give the built image a name to refer to later. But then
 | 
						|
# you need to ensure that it does not conflict with any other
 | 
						|
# images, and handle cases where multiple instances of the
 | 
						|
# job attempt to update the tagged image.
 | 
						|
 | 
						|
# If you want the image to be cleaned up on exit:
 | 
						|
trap "docker rmi $tag" EXIT
 | 
						|
 | 
						|
# Now use the image to build something:
 | 
						|
docker run -i --rm \
 | 
						|
	-v "$PWD:$PWD" \
 | 
						|
	-w "$PWD" \
 | 
						|
	-u $(id -u):$(id -g) \
 | 
						|
	$tag /bin/bash -eux \
 | 
						|
<<EOF
 | 
						|
	# The passed options mean we keep our current working
 | 
						|
	# directory and user, so no permission problems on the
 | 
						|
	# artifacts produced within the container.
 | 
						|
	echo 'main(){puts("hello world");}' | gcc -x c -static -o hello -
 | 
						|
EOF
 | 
						|
 | 
						|
# Test the result
 | 
						|
./hello
 | 
						|
 |