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

Compare commits

...

21 Commits

Author SHA1 Message Date
Hongli Lai (Phusion)
b56693beb3 Fix syslog-ng.
The system() source in the default syslog-ng config file does
not work in Docker because it tries to access /proc/kmsg,
which is not allowed due to Docker's privileges. We replace
it by a source that only reads from /dev/log.
2014-05-12 17:29:45 +02:00
Hongli Lai (Phusion)
612b1504af The syslog-ng script should restore /dev/xconsole permissions because that's what the official init script does 2014-05-12 16:43:55 +02:00
Hongli Lai (Phusion)
7bde5d9993 Document release date of 0.9.10 2014-05-12 16:15:59 +02:00
Hongli Lai (Phusion)
af11b5e7b4 Early in the my_init initialization process, do not overwrite already-defined environment variables by the ones in /etc/container_environment.
Closes GH-52.
2014-05-12 16:14:47 +02:00
Hongli Lai (Phusion)
29d315891f Use Ubuntu 14.04 as Vagrant box 2014-05-12 16:14:44 +02:00
Hongli Lai (Phusion)
5e0b1b6267 Update URLs to Vagrant boxes 2014-05-12 13:56:40 +02:00
Hongli Lai (Phusion)
e0d3f5d1a4 Bump version to 0.9.10 2014-05-12 10:32:34 +02:00
Hongli Lai (Phusion)
03adf9b696 Document the new environment variable newline handling in my_init 2014-05-12 10:32:18 +02:00
Hongli Lai (Phusion)
51748c3b1d Update the README to say that we're on Ubuntu 14.04 now. 2014-05-12 10:24:52 +02:00
Hongli Lai (Phusion)
895b145207 Update Changelog 2014-05-12 10:24:02 +02:00
mpeterson
d3d4b6124a modified setuser to use Python3 (default on 14.04) 2014-05-12 10:21:54 +02:00
mpeterson
5cfdd42d4b Modify defaults for syslog_ng to function properly
On 14.04 (trusty) there is nos no need to list all the modules since that was fixed.
No only that, listing them causes an error and it doesn't start.
2014-05-12 10:21:54 +02:00
Kingdon Barrett
6acfd8794d Remove /dev/log if it's a file a file.
Fixes https://github.com/phusion/baseimage-docker/pull/25
2014-05-12 10:21:36 +02:00
Santiago M. Mola
90ff4682df Migrate to Python 3
Ubuntu Trusty ships Python 3 by default, but not Python 2. Older versions already ship Python 3, so this change should be safe.
2014-05-10 12:28:23 +00:00
Paul Jimenez
17f000b744 Upgrade from Precise to Trusty
Conflicts:
	image/sources.list
2014-05-10 12:26:34 +00:00
mpeterson
90262a0460 Better way to enable universe and multiverse
Instead of copying over a hardcoded file we just uncomment the correct lines via two simple sed commands.

Conflicts:
	image/sources.list
2014-05-10 12:24:41 +00:00
Hongli Lai
9f369b5ed7 Merge pull request #51 from nanobeep/patch-1
Use '--rm' instead of '-rm', which was deprecated in Docker 0.9
2014-04-21 16:43:35 +02:00
Matt Jaynes
2ba32b6172 Use '--rm' instead of '-rm', which was deprecated in Docker 0.9 2014-04-08 15:36:36 -06:00
Hongli Lai
c740ff2f4d Merge pull request #49 from harto/trim-env-newlines
Trim trailing newlines from file-based envs
2014-04-02 16:47:09 +02:00
Stuart Campbell
5e2ee3838d Trim trailing newlines from file-based envs
Many editors add a trailing newline to files. This can result in
slightly unexpected values for environment variables read from
/etc/container_environment.
2014-04-03 00:13:09 +11:00
Hongli Lai (Phusion)
8f9eefa1f6 Correctly pass child process' exit status to sys.exit(). Closes GH-45 2014-03-28 10:23:25 +01:00
12 changed files with 65 additions and 53 deletions

View File

@@ -1,3 +1,17 @@
## 0.9.10 (release date: 2014-05-12)
* Upgraded to Ubuntu 14.04 (Trusty). We will no longer release images based on 12.04.
Thanks to contributions by mpeterson, Paul Jimenez, Santiago M. Mola and Kingdon Barrett.
* Fixed a problem with my_init not correctly passing child processes' exit status. Fixes GH-45.
* When reading environment variables from /etc/container_environment, the trailing newline (if any) is ignored. This makes commands like this work, without unintentially adding a newline to the environment variable value:
echo my_value > /etc/container_environment/FOO
If you intended on adding a newline to the value, ensure you have *two* trailing newlines:
echo -e "my_value\n" > /etc/container_environment/FOO
* It was not possible to use `docker run -e` to override environment variables defined in /etc/container_environment. This has been fixed (GH-52). Thanks to Stuart Campbell for reporting this bug.
## 0.9.9 (release date: 2014-03-25) ## 0.9.9 (release date: 2014-03-25)
* Fixed a problem with rssh. (Slawomir Chodnicki) * Fixed a problem with rssh. (Slawomir Chodnicki)

View File

@@ -1,5 +1,5 @@
NAME = phusion/baseimage NAME = phusion/baseimage
VERSION = 0.9.9 VERSION = 0.9.10
.PHONY: all build test tag_latest release ssh .PHONY: all build test tag_latest release ssh

View File

@@ -66,7 +66,7 @@ You can configure the stock `ubuntu` image yourself from your Dockerfile, so why
| Component | Why is it included? / Remarks | | Component | Why is it included? / Remarks |
| ---------------- | ------------------- | | ---------------- | ------------------- |
| Ubuntu 12.04 LTS | The base system. | | Ubuntu 14.04 LTS | The base system. |
| A **correct** init process | According to the Unix process model, [the init process](https://en.wikipedia.org/wiki/Init) -- PID 1 -- inherits all [orphaned child processes](https://en.wikipedia.org/wiki/Orphan_process) and must [reap them](https://en.wikipedia.org/wiki/Wait_(system_call)). Most Docker containers do not have an init process that does this correctly, and as a result their containers become filled with [zombie processes](https://en.wikipedia.org/wiki/Zombie_process) over time. <br><br>Furthermore, `docker stop` sends SIGTERM to the init process, which is then supposed to stop all services. Unfortunately most init systems don't do this correctly within Docker since they're built for hardware shutdowns instead. This causes processes to be hard killed with SIGKILL, which doesn't give them a chance to correctly deinitialize things. This can cause file corruption. <br><br>Baseimage-docker comes with an init process `/sbin/my_init` that performs both of these tasks correctly. | | A **correct** init process | According to the Unix process model, [the init process](https://en.wikipedia.org/wiki/Init) -- PID 1 -- inherits all [orphaned child processes](https://en.wikipedia.org/wiki/Orphan_process) and must [reap them](https://en.wikipedia.org/wiki/Wait_(system_call)). Most Docker containers do not have an init process that does this correctly, and as a result their containers become filled with [zombie processes](https://en.wikipedia.org/wiki/Zombie_process) over time. <br><br>Furthermore, `docker stop` sends SIGTERM to the init process, which is then supposed to stop all services. Unfortunately most init systems don't do this correctly within Docker since they're built for hardware shutdowns instead. This causes processes to be hard killed with SIGKILL, which doesn't give them a chance to correctly deinitialize things. This can cause file corruption. <br><br>Baseimage-docker comes with an init process `/sbin/my_init` that performs both of these tasks correctly. |
| Fixes APT incompatibilities with Docker | See https://github.com/dotcloud/docker/issues/1024. | | Fixes APT incompatibilities with Docker | See https://github.com/dotcloud/docker/issues/1024. |
| syslog-ng | A syslog daemon is necessary so that many services - including the kernel itself - can correctly log to /var/log/syslog. If no syslog daemon is running, a lot of important messages are silently swallowed. <br><br>Only listens locally. | | syslog-ng | A syslog daemon is necessary so that many services - including the kernel itself - can correctly log to /var/log/syslog. If no syslog daemon is running, a lot of important messages are silently swallowed. <br><br>Only listens locally. |
@@ -90,7 +90,7 @@ Baseimage-docker *encourages* multiple processes through the use of runit.
To look around in the image, run: To look around in the image, run:
docker run -rm -t -i phusion/baseimage /sbin/my_init -- bash -l docker run --rm -t -i phusion/baseimage /sbin/my_init -- bash -l
You don't have to download anything manually. The above command will automatically pull the baseimage-docker image from the Docker registry. You don't have to download anything manually. The above command will automatically pull the baseimage-docker image from the Docker registry.
@@ -227,7 +227,7 @@ During startup, before running any [startup scripts](#running_startup_scripts),
For example, here's how you can define an environment variable from your Dockerfile: For example, here's how you can define an environment variable from your Dockerfile:
RUN echo -n Apachai Hopachai > /etc/container_environment/MY_NAME RUN echo Apachai Hopachai > /etc/container_environment/MY_NAME
You can verify that it works, as follows: You can verify that it works, as follows:
@@ -237,6 +237,12 @@ You can verify that it works, as follows:
# echo $MY_NAME # echo $MY_NAME
Apachai Hopachai Apachai Hopachai
**Handling newlines**
If you've looked carefully, you'll notice that the 'echo' command actually prints a newline. Why does $MY_NAME not contain a newline then? It's because `my_init` strips the trailing newline, if any. If you intended on the value having a newline, you should add *another* newline, like this:
RUN echo -e "Apachai Hopachai\n" > /etc/container_environment/MY_NAME
<a name="envvar_dumps"></a> <a name="envvar_dumps"></a>
#### Environment variable dumps #### Environment variable dumps

8
Vagrantfile vendored
View File

@@ -9,9 +9,9 @@ VAGRANTFILE_API_VERSION = '2'
# Example overrides: # Example overrides:
# echo "ENV['PASSENGER_DOCKER_PATH'] ||= '../../phusion/passenger-docker' " >> ~/.vagrant.d/Vagrantfile # echo "ENV['PASSENGER_DOCKER_PATH'] ||= '../../phusion/passenger-docker' " >> ~/.vagrant.d/Vagrantfile
# echo "ENV['BASE_BOX_URL'] ||= 'd\:/dev/vm/vagrant/boxes/phusion/'" >> ~/.vagrant.d/Vagrantfile # echo "ENV['BASE_BOX_URL'] ||= 'd\:/dev/vm/vagrant/boxes/phusion/'" >> ~/.vagrant.d/Vagrantfile
BASE_BOX_URL = ENV['BASE_BOX_URL'] || 'https://oss-binaries.phusionpassenger.com/vagrant/boxes/' BASE_BOX_URL = ENV['BASE_BOX_URL'] || 'https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/'
VAGRANT_BOX_URL = ENV['VAGRANT_BOX_URL'] || BASE_BOX_URL + 'ubuntu-12.04.3-amd64-vbox.box' VAGRANT_BOX_URL = ENV['VAGRANT_BOX_URL'] || BASE_BOX_URL + 'ubuntu-14.04-amd64-vbox.box'
VMWARE_BOX_URL = ENV['VMWARE_BOX_URL'] || BASE_BOX_URL + 'ubuntu-12.04.3-amd64-vmwarefusion.box' VMWARE_BOX_URL = ENV['VMWARE_BOX_URL'] || BASE_BOX_URL + 'ubuntu-14.04-amd64-vmwarefusion.box'
BASEIMAGE_PATH = ENV['BASEIMAGE_PATH' ] || '.' BASEIMAGE_PATH = ENV['BASEIMAGE_PATH' ] || '.'
PASSENGER_DOCKER_PATH = ENV['PASSENGER_PATH' ] || '../passenger-docker' PASSENGER_DOCKER_PATH = ENV['PASSENGER_PATH' ] || '../passenger-docker'
DOCKERIZER_PATH = ENV['DOCKERIZER_PATH'] || '../dockerizer' DOCKERIZER_PATH = ENV['DOCKERIZER_PATH'] || '../dockerizer'
@@ -27,7 +27,7 @@ su - vagrant -c 'echo alias d=docker >> ~/.bash_aliases'
SCRIPT SCRIPT
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = 'phusion-open-ubuntu-12.04-amd64' config.vm.box = 'phusion-open-ubuntu-14.04-amd64'
config.vm.box_url = VAGRANT_BOX_URL config.vm.box_url = VAGRANT_BOX_URL
config.ssh.forward_agent = true config.ssh.forward_agent = true
passenger_docker_path = File.absolute_path(PASSENGER_DOCKER_PATH, ROOT) passenger_docker_path = File.absolute_path(PASSENGER_DOCKER_PATH, ROOT)

View File

@@ -1,4 +1,4 @@
FROM ubuntu:12.04 FROM ubuntu:14.04
MAINTAINER Phusion <info@phusion.nl> MAINTAINER Phusion <info@phusion.nl>
ENV HOME /root ENV HOME /root

View File

@@ -9,5 +9,4 @@
#CONSOLE_LOG_LEVEL=1 #CONSOLE_LOG_LEVEL=1
# Command line options to syslog-ng # Command line options to syslog-ng
# We set --default-modules because of https://github.com/phusion/baseimage-docker/pull/7. SYSLOGNG_OPTS="--no-caps"
SYSLOGNG_OPTS="--no-caps --default-modules=affile,afprog,afsocket,afuser,basicfuncs,csvparser,dbparser,syslogformat"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python2 -u #!/usr/bin/python3 -u
import os, os.path, sys, stat, signal, errno, argparse, time, json, re, posixfile import os, os.path, sys, stat, signal, errno, argparse, time, json, re
KILL_PROCESS_TIMEOUT = 5 KILL_PROCESS_TIMEOUT = 5
KILL_ALL_PROCESSES_TIMEOUT = 5 KILL_ALL_PROCESSES_TIMEOUT = 5
@@ -54,17 +54,21 @@ def is_exe(path):
except OSError: except OSError:
return False return False
def import_envvars(clear_existing_environment = True): def import_envvars(clear_existing_environment = True, override_existing_environment = True):
new_env = {} new_env = {}
for envfile in listdir("/etc/container_environment"): for envfile in listdir("/etc/container_environment"):
name = os.path.basename(envfile) name = os.path.basename(envfile)
with open("/etc/container_environment/" + envfile, "r") as f: with open("/etc/container_environment/" + envfile, "r") as f:
value = f.read() # Text files often end with a trailing newline, which we
# don't want to include in the env variable value. See
# https://github.com/phusion/baseimage-docker/pull/49
value = re.sub('\n\Z', '', f.read())
new_env[name] = value new_env[name] = value
if clear_existing_environment: if clear_existing_environment:
os.environ.clear() os.environ.clear()
for name, value in new_env.items(): for name, value in new_env.items():
os.environ[name] = value if override_existing_environment or not name in os.environ:
os.environ[name] = value
def export_envvars(to_dir = True): def export_envvars(to_dir = True):
shell_dump = "" shell_dump = ""
@@ -143,9 +147,9 @@ def run_command_killable(*argv):
raise raise
if status != 0: if status != 0:
if status is None: if status is None:
error("%s exited with unknown exit code\n" % filename) error("%s exited with unknown status\n" % filename)
else: else:
error("%s failed with exit code %d\n" % (filename, status)) error("%s failed with status %d\n" % (filename, os.WEXITSTATUS(status)))
sys.exit(1) sys.exit(1)
def run_command_killable_and_import_envvars(*argv): def run_command_killable_and_import_envvars(*argv):
@@ -224,7 +228,7 @@ def install_insecure_key():
run_command_killable("/usr/sbin/enable_insecure_key") run_command_killable("/usr/sbin/enable_insecure_key")
def main(args): def main(args):
import_envvars(False) import_envvars(False, False)
export_envvars() export_envvars()
if args.enable_insecure_key: if args.enable_insecure_key:
@@ -239,31 +243,34 @@ def main(args):
if not args.skip_runit: if not args.skip_runit:
runit_pid = start_runit() runit_pid = start_runit()
try: try:
exit_status = None
if len(args.main_command) == 0: if len(args.main_command) == 0:
runit_exited, exit_code = wait_for_runit_or_interrupt(runit_pid) runit_exited, exit_code = wait_for_runit_or_interrupt(runit_pid)
if runit_exited: if runit_exited:
if exit_code is None: if exit_code is None:
info("Runit exited with unknown exit code") info("Runit exited with unknown status")
exit_code = 1 exit_status = 1
else: else:
info("Runit exited with code %d" % exit_code) exit_status = os.WEXITSTATUS(exit_code)
info("Runit exited with status %d" % exit_status)
else: else:
info("Running %s..." % " ".join(args.main_command)) info("Running %s..." % " ".join(args.main_command))
pid = os.spawnvp(os.P_NOWAIT, args.main_command[0], args.main_command) pid = os.spawnvp(os.P_NOWAIT, args.main_command[0], args.main_command)
try: try:
exit_code = waitpid_reap_other_children(pid) exit_code = waitpid_reap_other_children(pid)
if exit_code is None: if exit_code is None:
info("%s exited with unknown exit code." % args.main_command[0]) info("%s exited with unknown status." % args.main_command[0])
exit_code = 1 exit_status = 1
else: else:
info("%s exited with exit code %d." % (args.main_command[0], exit_code)) exit_status = os.WEXITSTATUS(exit_code)
info("%s exited with status %d." % (args.main_command[0], exit_status))
except KeyboardInterrupt: except KeyboardInterrupt:
stop_child_process(args.main_command[0], pid) stop_child_process(args.main_command[0], pid)
except BaseException as s: except BaseException as s:
warn("An error occurred. Aborting.") warn("An error occurred. Aborting.")
stop_child_process(args.main_command[0], pid) stop_child_process(args.main_command[0], pid)
raise raise
sys.exit(exit_code) sys.exit(exit_status)
finally: finally:
if not args.skip_runit: if not args.skip_runit:
shutdown_runit_services() shutdown_runit_services()

View File

@@ -14,7 +14,8 @@ mkdir -p /etc/container_environment
echo -n no > /etc/container_environment/INITRD echo -n no > /etc/container_environment/INITRD
## Enable Ubuntu Universe and Multiverse. ## Enable Ubuntu Universe and Multiverse.
cp /build/sources.list /etc/apt/sources.list sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
sed -i 's/^#\s*\(deb.*multiverse\)$/\1/g' /etc/apt/sources.list
apt-get update apt-get update
## Fix some issues with APT packages. ## Fix some issues with APT packages.

View File

@@ -1,6 +1,11 @@
#!/bin/sh #!/bin/sh
set -e set -e
# If /dev/log is either a named pipe or it was placed there accidentally,
# e.g. because of the issue documented at https://github.com/phusion/baseimage-docker/pull/25,
# then we remove it.
if [ ! -S /dev/log ]; then rm -f /dev/log; fi
SYSLOGNG_OPTS="" SYSLOGNG_OPTS=""
[ -r /etc/default/syslog-ng ] && . /etc/default/syslog-ng [ -r /etc/default/syslog-ng ] && . /etc/default/syslog-ng
@@ -19,6 +24,8 @@ esac
if [ ! -e /dev/xconsole ] if [ ! -e /dev/xconsole ]
then then
mknod -m 640 /dev/xconsole p mknod -m 640 /dev/xconsole p
chown root:adm
[ -x /sbin/restorecon ] && /sbin/restorecon $XCONSOLE
fi fi
exec syslog-ng -F -p /var/run/syslog-ng.pid $SYSLOGNG_OPTS exec syslog-ng -F -p /var/run/syslog-ng.pid $SYSLOGNG_OPTS

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python2 #!/usr/bin/python3
import sys, os, pwd import sys, os, pwd
if len(sys.argv) < 3: if len(sys.argv) < 3:

View File

@@ -1,25 +0,0 @@
deb http://archive.ubuntu.com/ubuntu precise main restricted
deb-src http://archive.ubuntu.com/ubuntu precise main restricted
deb http://archive.ubuntu.com/ubuntu precise-updates main restricted
deb-src http://archive.ubuntu.com/ubuntu precise-updates main restricted
deb http://archive.ubuntu.com/ubuntu precise universe
deb-src http://archive.ubuntu.com/ubuntu precise universe
deb http://archive.ubuntu.com/ubuntu precise-updates universe
deb-src http://archive.ubuntu.com/ubuntu precise-updates universe
deb http://archive.ubuntu.com/ubuntu precise multiverse
deb-src http://archive.ubuntu.com/ubuntu precise multiverse
deb http://archive.ubuntu.com/ubuntu precise-updates multiverse
deb-src http://archive.ubuntu.com/ubuntu precise-updates multiverse
deb http://archive.ubuntu.com/ubuntu precise-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu precise-backports main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu precise-security main restricted
deb-src http://archive.ubuntu.com/ubuntu precise-security main restricted
deb http://archive.ubuntu.com/ubuntu precise-security universe
deb-src http://archive.ubuntu.com/ubuntu precise-security universe
deb http://archive.ubuntu.com/ubuntu precise-security multiverse
deb-src http://archive.ubuntu.com/ubuntu precise-security multiverse

View File

@@ -21,6 +21,9 @@ mkdir /etc/service/syslog-ng
cp /build/runit/syslog-ng /etc/service/syslog-ng/run cp /build/runit/syslog-ng /etc/service/syslog-ng/run
mkdir -p /var/lib/syslog-ng mkdir -p /var/lib/syslog-ng
cp /build/config/syslog_ng_default /etc/default/syslog-ng cp /build/config/syslog_ng_default /etc/default/syslog-ng
# Replace the system() source because inside Docker we
# can't access /proc/kmsg.
sed -i -E 's/^(\s*)system\(\);/\1unix-stream("\/dev\/log");/' /etc/syslog-ng/syslog-ng.conf
## Install logrotate. ## Install logrotate.
$minimal_apt_get_install logrotate $minimal_apt_get_install logrotate