mirror of
https://github.com/phusion/baseimage-docker.git
synced 2026-03-26 12:29:07 +00:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ee9947467 | ||
|
|
abf75875a9 | ||
|
|
d2b28d25a6 | ||
|
|
62859010cb | ||
|
|
2ac41ee8ab | ||
|
|
4a3569a9cb | ||
|
|
8222745ad8 |
@@ -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
19
LICENSE.txt
Normal 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.
|
||||||
2
Makefile
2
Makefile
@@ -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
|
||||||
|
|
||||||
|
|||||||
30
README.md
30
README.md
@@ -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
2
Vagrantfile
vendored
@@ -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
|
||||||
|
|||||||
@@ -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_*
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user