1
0
mirror of https://github.com/phusion/baseimage-docker.git synced 2026-03-26 12:29:07 +00:00

Compare commits

..

7 Commits

Author SHA1 Message Date
Hongli Lai (Phusion)
4ee9947467 Correctly mount passenger-docker in Vagrantfile 2014-01-31 16:04:00 +01:00
Hongli Lai (Phusion)
abf75875a9 Do not save SSH host key in baseimage-docker. Instead, generate it automatically during boot. 2014-01-31 16:02:01 +01:00
Hongli Lai (Phusion)
d2b28d25a6 Bump version to 0.9.3 2014-01-31 15:46:59 +01:00
Hongli Lai (Phusion)
62859010cb Allow running scripts during startup. 2014-01-31 15:44:50 +01:00
Hongli Lai (Phusion)
2ac41ee8ab Fix compatibility with latest Ubuntu 12.04 base image. 2014-01-31 15:08:27 +01:00
Hongli Lai (Phusion)
4a3569a9cb Add license 2014-01-14 20:29:45 +01:00
Hongli Lai (Phusion)
8222745ad8 Fix typo in README 2014-01-09 23:21:40 +01:00
9 changed files with 115 additions and 11 deletions

View File

@@ -1,3 +1,8 @@
## 0.9.3 (release date: pending)
* It looks like Docker changed their Ubuntu 12.04 base image, thereby breaking our Dockerfile. This has been fixed.
* The init system (`/sbin/my_init`) now supports running scripts during startup. You can put startup scripts `/etc/my_init.d`. `/etc/rc.local` is also run during startup.
## 0.9.2 (release date: 2013-12-11) ## 0.9.2 (release date: 2013-12-11)
* Fixed SFTP support. Thanks Joris van de Donk! * Fixed SFTP support. Thanks Joris van de Donk!

19
LICENSE.txt Normal file
View File

@@ -0,0 +1,19 @@
Copyright (c) 2013-2014 Phusion
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -1,5 +1,5 @@
NAME = phusion/baseimage NAME = phusion/baseimage
VERSION = 0.9.2 VERSION = 0.9.3
.PHONY: all build tag_latest release .PHONY: all build tag_latest release

View File

@@ -73,10 +73,15 @@ By default, it allows SSH access for the key in `image/insecure_key`. This makes
# Remove authentication rights for insecure_key. # Remove authentication rights for insecure_key.
RUN rm -f /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys RUN rm -f /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys
# Use baseimage-docker's init process. # Regenerate SSH host keys. baseimage-docker does not contain any, so you
# have to do that yourself. You may also comment out this instruction; the
# init system will auto-generate one during boot.
RUN /etc/my_init.d/00_regen_ssh_host_keys.sh
# Use baseimage-docker's init system.
CMD ["/sbin/my_init"] CMD ["/sbin/my_init"]
# ...put other build instructions here... # ...put your own build instructions here...
# Clean up APT when done. # Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
@@ -101,7 +106,26 @@ Here's an example showing you how to a memached server runit entry can be made.
Note that the shell script must run the daemon **without letting it daemonize/fork it**. Usually, daemons provide a command line flag or a config file option for that. Note that the shell script must run the daemon **without letting it daemonize/fork it**. Usually, daemons provide a command line flag or a config file option for that.
### Login in to the container ### Running scripts during container startup
The baseimage-docker init system, `/sbin/my_init`, runs the following scripts during startup, in the following order:
* All executable scripts in `/etc/my_init.d`, if this directory exists. The scripts are run during in lexicographic order.
* The script `/etc/rc.local`, if this file exists.
All scripts must exit correctly, e.g. with exit code 0. If any script exits with a non-zero exit code, the booting will fail.
The following example shows how you can add a startup script. This script simply logs the time of boot to the file /tmp/boottime.txt.
### In logtime.sh (make sure this file is chmod +x):
#!/bin/sh
date > /tmp/boottime.txt
### In Dockerfile:
RUN mkdir -p /etc/my_init.d
ADD logtime.sh /etc/my_init.d/logtime.sh
### Login to the container
You can use SSH to login to any container that is based on baseimage-docker. You can use SSH to login to any container that is based on baseimage-docker.

2
Vagrantfile vendored
View File

@@ -9,7 +9,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "phusion-open-ubuntu-12.04-amd64" config.vm.box = "phusion-open-ubuntu-12.04-amd64"
config.vm.box_url = "https://oss-binaries.phusionpassenger.com/vagrant/boxes/ubuntu-12.04.3-amd64-vbox.box" config.vm.box_url = "https://oss-binaries.phusionpassenger.com/vagrant/boxes/ubuntu-12.04.3-amd64-vbox.box"
config.ssh.forward_agent = true config.ssh.forward_agent = true
if File.directory?("#{ROOT}/passenger-docker") if File.directory?("#{ROOT}/../passenger-docker")
config.vm.synced_folder File.expand_path("#{ROOT}/../passenger-docker"), config.vm.synced_folder File.expand_path("#{ROOT}/../passenger-docker"),
"/vagrant/passenger-docker" "/vagrant/passenger-docker"
end end

View File

@@ -6,3 +6,5 @@ set -x
apt-get clean apt-get clean
rm -rf /build rm -rf /build
rm -rf /tmp/* /var/tmp/* rm -rf /tmp/* /var/tmp/*
rm -f /etc/ssh/ssh_host_*

View File

@@ -1,5 +1,24 @@
#!/usr/bin/python2 #!/usr/bin/python2
import os, sys, signal, errno import os, sys, stat, signal, errno
pid = None
status = None
def listdir(path):
try:
result = os.stat(path)
except OSError:
return []
if stat.S_ISDIR(result.st_mode):
return sorted(os.listdir(path))
else:
return []
def is_exe(path):
try:
return os.path.isfile(path) and os.access(path, os.X_OK)
except OSError:
return False
def reap_child(signum, frame): def reap_child(signum, frame):
global pid, status, waiting_for_runit global pid, status, waiting_for_runit
@@ -10,20 +29,52 @@ def reap_child(signum, frame):
except OSError: except OSError:
pass pass
def stop_runit(signum, frame): def stop_child_process(name):
global pid global pid
print("*** Shutting down runit (PID %d)..." % pid) print("*** Shutting down %s (PID %d)..." % (name, pid))
try: try:
os.kill(pid, signal.SIGHUP) os.kill(pid, signal.SIGHUP)
except OSError: except OSError:
pass pass
def run_command_killable(*argv):
global pid
filename = argv[0]
pid = os.spawnvp(os.P_NOWAIT, filename, argv)
signal.signal(signal.SIGINT, lambda signum, frame: stop_child_process(filename))
signal.signal(signal.SIGTERM, lambda signum, frame: stop_child_process(filename))
try:
this_pid, status = os.waitpid(pid, 0)
except OSError as e:
if e.errno == errno.EINTR:
sys.exit(2)
else:
raise
finally:
signal.signal(signal.SIGINT, signal.SIG_DFL)
signal.signal(signal.SIGTERM, signal.SIG_DFL)
if status != 0:
sys.stderr.write("*** %s failed with exit code %d\n" % (filename, status))
sys.exit(1)
# Run /etc/my_init.d/*
for name in listdir("/etc/my_init.d"):
filename = "/etc/my_init.d/" + name
if is_exe(filename):
print("*** Running %s..." % filename)
run_command_killable(filename)
# Run /etc/rc.local.
if is_exe("/etc/rc.local"):
print("*** Running /etc/rc.local...")
run_command_killable("/etc/rc.local")
# Start runit. # Start runit.
signal.signal(signal.SIGCHLD, reap_child) signal.signal(signal.SIGCHLD, reap_child)
print("*** Booting runit...") print("*** Booting runit...")
pid = os.spawnl(os.P_NOWAIT, "/usr/sbin/runsvdir-start", "/usr/sbin/runsvdir-start") pid = os.spawnl(os.P_NOWAIT, "/usr/sbin/runsvdir-start", "/usr/sbin/runsvdir-start")
print("*** Runit started as PID %d" % pid) print("*** Runit started as PID %d" % pid)
signal.signal(signal.SIGTERM, stop_runit) signal.signal(signal.SIGTERM, lambda signum, frame: stop_child_process("runit"))
# Wait for runit, and while waiting, reap any adopted orphans. # Wait for runit, and while waiting, reap any adopted orphans.
done = False done = False
@@ -62,3 +113,4 @@ while not done:
if not done: if not done:
time.sleep(0.5) time.sleep(0.5)
shutdown() shutdown()

View File

@@ -14,7 +14,7 @@ $minimal_apt_get_install apt-transport-https
## Fix some issues with APT packages. ## Fix some issues with APT packages.
## See https://github.com/dotcloud/docker/issues/1024 ## See https://github.com/dotcloud/docker/issues/1024
dpkg-divert --local --rename --add /sbin/initctl dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl ln -sf /bin/true /sbin/initctl
## Upgrade all packages. ## Upgrade all packages.
echo "initscripts hold" | dpkg --set-selections echo "initscripts hold" | dpkg --set-selections

View File

@@ -5,6 +5,7 @@ set -x
## Install init process. ## Install init process.
cp /build/my_init /sbin/ cp /build/my_init /sbin/
mkdir -p /etc/my_init.d
## Install runit. ## Install runit.
$minimal_apt_get_install runit $minimal_apt_get_install runit
@@ -20,6 +21,7 @@ mkdir /var/run/sshd
mkdir /etc/service/sshd mkdir /etc/service/sshd
cp /build/runit/sshd /etc/service/sshd/run cp /build/runit/sshd /etc/service/sshd/run
cp /build/config/sshd_config /etc/ssh/sshd_config cp /build/config/sshd_config /etc/ssh/sshd_config
cp /build/00_regen_ssh_host_keys.sh /etc/my_init.d/
## Install default SSH key for root and app. ## Install default SSH key for root and app.
mkdir -p /root/.ssh mkdir -p /root/.ssh