mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	New approach to Gogs Docker Container
- VOLUME for ‘/data’ - Usage of S6 as PID 1 Process - Usage of ‘socat’ so linked container (like databases) are binded to localhost - OpenSSH, Socat Link and Gogs are supervised using S6 - Size of container reduced to ~75Mo
This commit is contained in:
		@@ -1,7 +1,7 @@
 | 
				
			|||||||
.git/*
 | 
					.git
 | 
				
			||||||
conf/*
 | 
					conf
 | 
				
			||||||
packager/*
 | 
					packager
 | 
				
			||||||
scripts/*
 | 
					scripts
 | 
				
			||||||
*.yml
 | 
					*.yml
 | 
				
			||||||
*.md
 | 
					*.md
 | 
				
			||||||
.bra.toml
 | 
					.bra.toml
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										63
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								Dockerfile
									
									
									
									
									
								
							@@ -1,54 +1,31 @@
 | 
				
			|||||||
FROM google/debian:wheezy
 | 
					FROM alpine:3.2
 | 
				
			||||||
MAINTAINER u@gogs.io
 | 
					MAINTAINER roemer.jp@gmail.com
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN echo "deb http://ftp.debian.org/debian/ wheezy-backports main" >> /etc/apt/sources.list && \
 | 
					# Install system utils & Gogs runtime dependencies
 | 
				
			||||||
	apt-get update -qqy && \
 | 
					ADD https://github.com/tianon/gosu/releases/download/1.5/gosu-amd64 /usr/sbin/gosu
 | 
				
			||||||
	apt-get install --no-install-recommends -qqy \
 | 
					RUN echo "@edge http://dl-4.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories \
 | 
				
			||||||
	curl build-essential ca-certificates git \ 
 | 
					 && echo "@community http://dl-4.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories \
 | 
				
			||||||
	openssh-server libpam-dev && \
 | 
					 && apk -U --no-progress upgrade \
 | 
				
			||||||
	apt-get autoclean && \
 | 
					 && apk -U --no-progress add ca-certificates git linux-pam s6@edge curl openssh socat \
 | 
				
			||||||
    apt-get autoremove && \
 | 
					 && chmod +x /usr/sbin/gosu
 | 
				
			||||||
    rm -rf /var/lib/apt/lists/*
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENV GOROOT /goroot
 | 
					# Configure SSH
 | 
				
			||||||
ENV GOPATH /gopath
 | 
					COPY docker/sshd_config /etc/ssh/sshd_config
 | 
				
			||||||
ENV PATH $PATH:$GOROOT/bin:$GOPATH/bin
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY . /gopath/src/github.com/gogits/gogs/
 | 
					# Configure Go and build Gogs
 | 
				
			||||||
WORKDIR /gopath/src/github.com/gogits/gogs/
 | 
					ENV GOPATH /tmp/go
 | 
				
			||||||
 | 
					ENV PATH $PATH:$GOPATH/bin
 | 
				
			||||||
# Build binary and clean up useless files
 | 
					 | 
				
			||||||
RUN mkdir /goroot && \
 | 
					 | 
				
			||||||
	curl https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz | tar xzf - -C /goroot --strip-components=1 && \
 | 
					 | 
				
			||||||
	go get -v -tags "sqlite redis memcache cert pam" && \
 | 
					 | 
				
			||||||
	go build -tags "sqlite redis memcache cert pam" && \
 | 
					 | 
				
			||||||
	mkdir /app/ && \
 | 
					 | 
				
			||||||
	mv /gopath/src/github.com/gogits/gogs/ /app/gogs/ && \
 | 
					 | 
				
			||||||
	rm -r $GOROOT $GOPATH
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					COPY . /app/gogs/
 | 
				
			||||||
WORKDIR /app/gogs/
 | 
					WORKDIR /app/gogs/
 | 
				
			||||||
 | 
					RUN ./docker/build.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN useradd --shell /bin/bash --system --comment gogits git
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# SSH login fix, otherwise user is kicked off after login
 | 
					 | 
				
			||||||
RUN mkdir /var/run/sshd && \
 | 
					 | 
				
			||||||
	sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd && \
 | 
					 | 
				
			||||||
	sed 's@UsePrivilegeSeparation yes@UsePrivilegeSeparation no@' -i /etc/ssh/sshd_config && \
 | 
					 | 
				
			||||||
	echo "export VISIBLE=now" >> /etc/profile && \
 | 
					 | 
				
			||||||
	echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Setup server keys on startup
 | 
					 | 
				
			||||||
RUN sed 's@^HostKey@\#HostKey@' -i /etc/ssh/sshd_config && \
 | 
					 | 
				
			||||||
	echo "HostKey /data/ssh/ssh_host_key" >> /etc/ssh/sshd_config && \
 | 
					 | 
				
			||||||
	echo "HostKey /data/ssh/ssh_host_rsa_key" >> /etc/ssh/sshd_config && \
 | 
					 | 
				
			||||||
	echo "HostKey /data/ssh/ssh_host_dsa_key" >> /etc/ssh/sshd_config && \
 | 
					 | 
				
			||||||
	echo "HostKey /data/ssh/ssh_host_ecdsa_key" >> /etc/ssh/sshd_config && \
 | 
					 | 
				
			||||||
	echo "HostKey /data/ssh/ssh_host_ed25519_key" >> /etc/ssh/sshd_config
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Prepare data
 | 
					 | 
				
			||||||
ENV GOGS_CUSTOM /data/gogs
 | 
					ENV GOGS_CUSTOM /data/gogs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create git user for Gogs
 | 
				
			||||||
 | 
					RUN adduser -D -g 'Gogs Git User' git -h /data/git/ -s /bin/sh && passwd -u git
 | 
				
			||||||
RUN echo "export GOGS_CUSTOM=/data/gogs" >> /etc/profile
 | 
					RUN echo "export GOGS_CUSTOM=/data/gogs" >> /etc/profile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VOLUME ["/data"]
 | 
				
			||||||
EXPOSE 22 3000
 | 
					EXPOSE 22 3000
 | 
				
			||||||
ENTRYPOINT []
 | 
					 | 
				
			||||||
CMD ["./docker/start.sh"]
 | 
					CMD ["./docker/start.sh"]
 | 
				
			||||||
							
								
								
									
										17
									
								
								docker/build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										17
									
								
								docker/build.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Install build deps
 | 
				
			||||||
 | 
					apk -U --no-progress add linux-pam-dev go@community gcc musl-dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Init go environment to build Gogs
 | 
				
			||||||
 | 
					mkdir -p ${GOPATH}/src/github.com/gogits/
 | 
				
			||||||
 | 
					ln -s /app/gogs/ ${GOPATH}/src/github.com/gogits/gogs
 | 
				
			||||||
 | 
					cd ${GOPATH}/src/github.com/gogits/gogs
 | 
				
			||||||
 | 
					go get -v -tags "sqlite redis memcache cert pam"
 | 
				
			||||||
 | 
					go build -tags "sqlite redis memcache cert pam"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Cleanup GOPATH
 | 
				
			||||||
 | 
					rm -r $GOPATH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Remove build deps
 | 
				
			||||||
 | 
					apk --no-progress del linux-pam-dev go gcc musl-dev
 | 
				
			||||||
							
								
								
									
										2
									
								
								docker/s6/.s6-svscan/finish
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								docker/s6/.s6-svscan/finish
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					exec /bin/true
 | 
				
			||||||
							
								
								
									
										28
									
								
								docker/s6/gogs/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										28
									
								
								docker/s6/gogs/run
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					USER=git
 | 
				
			||||||
 | 
					USERNAME=$USER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ! test -d /data/gogs; then
 | 
				
			||||||
 | 
						mkdir -p /data/gogs/data /data/gogs/conf /data/gogs/log /data/git
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ! test -d ~git/.ssh; then
 | 
				
			||||||
 | 
					    mkdir ~git/.ssh
 | 
				
			||||||
 | 
					    chmod 700 ~git/.ssh
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ! test -f ~git/.ssh/environment; then
 | 
				
			||||||
 | 
					    echo "GOGS_CUSTOM=/data/gogs" > ~git/.ssh/environment
 | 
				
			||||||
 | 
					    chown git:git ~git/.ssh/environment
 | 
				
			||||||
 | 
					    chown 600 ~git/.ssh/environment
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ln -sf /data/gogs/log  /app/gogs/log
 | 
				
			||||||
 | 
					ln -sf /data/gogs/data /app/gogs/data
 | 
				
			||||||
 | 
					ln -sf /data/gogs/conf /app/gogs/conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					chown -R git:git /data /app/gogs ~git/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export USER
 | 
				
			||||||
 | 
					export USERNAME
 | 
				
			||||||
 | 
					exec gosu $USER /app/gogs/gogs web
 | 
				
			||||||
							
								
								
									
										15
									
								
								docker/s6/openssh/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										15
									
								
								docker/s6/openssh/run
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ! test -d /data/ssh
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
						mkdir -p /data/ssh
 | 
				
			||||||
 | 
						ssh-keygen -q -f /data/ssh/ssh_host_key -N '' -t rsa1
 | 
				
			||||||
 | 
						ssh-keygen -q -f /data/ssh/ssh_host_rsa_key -N '' -t rsa
 | 
				
			||||||
 | 
						ssh-keygen -q -f /data/ssh/ssh_host_dsa_key -N '' -t dsa
 | 
				
			||||||
 | 
						ssh-keygen -q -f /data/ssh/ssh_host_ecdsa_key -N '' -t ecdsa
 | 
				
			||||||
 | 
						ssh-keygen -q -f /data/ssh/ssh_host_ed25519_key -N '' -t ed25519
 | 
				
			||||||
 | 
						chown -R root:root /data/ssh/*
 | 
				
			||||||
 | 
						chmod 600 /data/ssh/*
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exec gosu root /usr/sbin/sshd -D -f /etc/ssh/sshd_config
 | 
				
			||||||
							
								
								
									
										17
									
								
								docker/sshd_config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								docker/sshd_config
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					Port 22
 | 
				
			||||||
 | 
					AddressFamily any
 | 
				
			||||||
 | 
					ListenAddress 0.0.0.0
 | 
				
			||||||
 | 
					ListenAddress ::
 | 
				
			||||||
 | 
					Protocol 2
 | 
				
			||||||
 | 
					LogLevel INFO
 | 
				
			||||||
 | 
					HostKey /data/ssh/ssh_host_key
 | 
				
			||||||
 | 
					HostKey /data/ssh/ssh_host_rsa_key
 | 
				
			||||||
 | 
					HostKey /data/ssh/ssh_host_dsa_key
 | 
				
			||||||
 | 
					HostKey /data/ssh/ssh_host_ecdsa_key
 | 
				
			||||||
 | 
					HostKey /data/ssh/ssh_host_ed25519_key
 | 
				
			||||||
 | 
					PermitRootLogin no
 | 
				
			||||||
 | 
					AuthorizedKeysFile	.ssh/authorized_keys
 | 
				
			||||||
 | 
					PasswordAuthentication no
 | 
				
			||||||
 | 
					UsePrivilegeSeparation no
 | 
				
			||||||
 | 
					PermitUserEnvironment yes
 | 
				
			||||||
 | 
					AllowUsers git
 | 
				
			||||||
@@ -1,43 +1,12 @@
 | 
				
			|||||||
#!/bin/bash -
 | 
					#!/bin/sh
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ! test -d /data/gogs
 | 
					# Bind linked docker container to localhost socket using socat
 | 
				
			||||||
then
 | 
					env | sed -En 's|(.*)_PORT_([0-9]*)_TCP=tcp://(.*):(.*)|\1_\2 socat -ls TCP4-LISTEN:\2,fork,reuseaddr TCP4:\3:\4|p' | \
 | 
				
			||||||
	mkdir -p /var/run/sshd
 | 
					while read NAME CMD; do
 | 
				
			||||||
	mkdir -p /data/gogs/data /data/gogs/conf /data/gogs/log /data/git
 | 
					    mkdir -p /app/gogs/docker/s6/$NAME
 | 
				
			||||||
fi
 | 
					    echo -e "#!/bin/sh\nexec $CMD" > /app/gogs/docker/s6/$NAME/run
 | 
				
			||||||
 | 
					    chmod +x /app/gogs/docker/s6/$NAME/run
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ! test -d /data/ssh
 | 
					# Exec S6 as process manager for gogs and dropbear ssh
 | 
				
			||||||
then
 | 
					exec /usr/bin/s6-svscan /app/gogs/docker/s6/
 | 
				
			||||||
	mkdir /data/ssh
 | 
					 | 
				
			||||||
	ssh-keygen -q -f /data/ssh/ssh_host_key -N '' -t rsa1
 | 
					 | 
				
			||||||
	ssh-keygen -q -f /data/ssh/ssh_host_rsa_key -N '' -t rsa
 | 
					 | 
				
			||||||
	ssh-keygen -q -f /data/ssh/ssh_host_dsa_key -N '' -t dsa
 | 
					 | 
				
			||||||
	ssh-keygen -q -f /data/ssh/ssh_host_ecdsa_key -N '' -t ecdsa
 | 
					 | 
				
			||||||
	ssh-keygen -q -f /data/ssh/ssh_host_ed25519_key -N '' -t ed25519
 | 
					 | 
				
			||||||
	chown -R root:root /data/ssh/*
 | 
					 | 
				
			||||||
	chmod 600 /data/ssh/*
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
service ssh start
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ln -sf /data/gogs/log ./log
 | 
					 | 
				
			||||||
ln -sf /data/gogs/data ./data
 | 
					 | 
				
			||||||
ln -sf /data/git /home/git
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if ! test -d ~git/.ssh
 | 
					 | 
				
			||||||
then
 | 
					 | 
				
			||||||
  mkdir ~git/.ssh
 | 
					 | 
				
			||||||
  chmod 700 ~git/.ssh
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if ! test -f ~git/.ssh/environment
 | 
					 | 
				
			||||||
then
 | 
					 | 
				
			||||||
  echo "GOGS_CUSTOM=/data/gogs" > ~git/.ssh/environment
 | 
					 | 
				
			||||||
  chown git:git ~git/.ssh/environment
 | 
					 | 
				
			||||||
  chown 600 ~git/.ssh/environment
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chown -R git:git /data .
 | 
					 | 
				
			||||||
exec su git -c "./gogs web"
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user