From 3dfc1865c6497e40949c554e3684442f0d830197 Mon Sep 17 00:00:00 2001 From: Hongli Lai Date: Sun, 2 Feb 2014 02:02:32 -0800 Subject: [PATCH] Create gh-pages branch via GitHub --- images/body-bg.png | Bin 0 -> 8859 bytes images/highlight-bg.jpg | Bin 0 -> 34222 bytes images/hr.png | Bin 0 -> 1037 bytes images/octocat-icon.png | Bin 0 -> 1651 bytes images/tar-gz-icon.png | Bin 0 -> 1671 bytes images/zip-icon.png | Bin 0 -> 1661 bytes index.html | 332 +++++++++++++++++++++++++++++++ javascripts/main.js | 1 + params.json | 1 + stylesheets/print.css | 226 +++++++++++++++++++++ stylesheets/pygment_trac.css | 69 +++++++ stylesheets/stylesheet.css | 371 +++++++++++++++++++++++++++++++++++ 12 files changed, 1000 insertions(+) create mode 100644 images/body-bg.png create mode 100644 images/highlight-bg.jpg create mode 100644 images/hr.png create mode 100644 images/octocat-icon.png create mode 100644 images/tar-gz-icon.png create mode 100644 images/zip-icon.png create mode 100644 index.html create mode 100644 javascripts/main.js create mode 100644 params.json create mode 100644 stylesheets/print.css create mode 100644 stylesheets/pygment_trac.css create mode 100644 stylesheets/stylesheet.css diff --git a/images/body-bg.png b/images/body-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..d0618fe749178e814554f19fd158dea90020252d GIT binary patch literal 8859 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 DGStm7 literal 0 HcmV?d00001 diff --git a/images/hr.png b/images/hr.png new file mode 100644 index 0000000000000000000000000000000000000000..6c723a5602e14caa5c1527f3226d383dc83db6bd GIT binary patch literal 1037 zcmaJ=O=#3W6ppP(DfA#BSfMzksBP)ycawF8u4S8S+eOos-GGZH(`4F>Z89;Lx@kQW zdXeJMs}{wJ7kd-LA_{_7ym;tIym;!NSV8EeAUN6XZauh$A$c>r?|a{Td2fAYYNDt6 zd^f`|J;h1A#4sICXndmU6n#J5Kg-ikFDX<=8PAcL6(T0@;8_HUo;8n3$a0qNZle)~ z>6~`W3aJ=3pp8AwN^-c^3n-dlMn>bnvKJ5mvuNJ+bL`KpcPwz79D7qS1S8N;)ty`k zQF&#`v{x4Ftiz6810yk{1Rf$5h`mKWf^m+m^FkUY$2<$_DP$qX9*L?LGeE;30tzRm zY(W%(s&ZmlQB`pmNP;Nw0$plKOhZM5QU)|0mR1X$Iat!i8@1>z$5sgmAkWuoHLfOe zIGpFjY&M&4NK%Ssq@rb?SaHga`kM?oitNx0h>LxYFj}*CiR4(S^yms+(4zIDhE3Ek zKDGj0o(%|yfaf2!xTvLjML$9n%s9GS}j;!7yPOQB7F++2TBDu7yuEP_K584fa+@981e_uIs?OtVl{m%4Q@jEs6zkOwY@OLYf|Fijp4Jnphp%OCIt`6YCsf^KG$7 z-*^G7tfSDqhn(>cd!X(QblYpmwB>7Ho%UL;w#D*P44-ttUtQ5WqOF#MtsbYF)|4Qh zjz&mlVDsTNN9V^Z>UlH%x?^tlFhbYb?*||IhKCM5Kf8Fk0~~&sex2TTgpC(J4*mO= zclX|($v%4f<@?sbt)0D3^7`}qYTq~YRe7TK%AHKGyE^n#+j#TxU#ywo|pap6}o NpvA(JzBzV#?GKcZMQ8v3 literal 0 HcmV?d00001 diff --git a/images/octocat-icon.png b/images/octocat-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ba137d268da4921d9f4b5905bed9e724c45770 GIT binary patch literal 1651 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 S7rUr~Dg;kgKbLh*2~7YV%7O|2 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..d80d7f2 --- /dev/null +++ b/index.html @@ -0,0 +1,332 @@ + + + + + + + + + + + Baseimage-docker by phusion + + + +
+
+ +
+

Baseimage-docker

+

A minimal Ubuntu base image modified for Docker-friendliness

+
+ +
+ Download .zip + Download .tar.gz + View on GitHub +
+ +
+ +
+

+A minimal Ubuntu base image modified for Docker-friendliness

+ +

Baseimage-docker is a special Docker image that is configured for correct use within Docker containers. It is Ubuntu, plus modifications for Docker-friendliness. You can use it as a base for your own Docker images.

+ +

Baseimage-docker is available for pulling from the Docker registry!

+ +

+What are the problems with the stock Ubuntu base image?

+ +

Ubuntu is not designed to be run inside docker. Its init system, Upstart, assumes that it's running on either real hardware or virtualized hardware, but not inside a Docker container. But inside a container you don't want a full system anyway, you want a minimal system. But configuring that minimal system for use within a container has many strange corner cases that are hard to get right if you are not intimately familiar with the Unix system model. This can cause a lot of strange problems.

+ +

Baseimage-docker gets everything right. The "Contents" section describes all the things that it modifies.

+ +

+ +

+Why use baseimage-docker?

+ +

You can configure the stock ubuntu image yourself from your Dockerfile, so why bother using baseimage-docker?

+ +
    +
  • Configuring the base system for Docker-friendliness is no easy task. As stated before, there are many corner cases. By the time that you've gotten all that right, you've reinvented baseimage-docker. Using baseimage-docker will save you from this effort.
  • +
  • It reduces the time needed to write a correct Dockerfile. You won't have to worry about the base system and can focus on your stack and your app.
  • +
  • It reduces the time needed to run docker build, allowing you to iterate your Dockerfile more quickly.
  • +
  • It reduces download time during redeploys. Docker only needs to download the base image once: during the first deploy. On every subsequent deploys, only the changes you make on top of the base image are downloaded.
  • +

Related resources: + Github | + Docker registry | + Discussion forum | + Twitter | + Blog

+ +

Table of contents

+ +

+ +

+What's inside the image?

+ +

+ +

+Overview

+ +

Looking for a more complete base image, one that is ideal for Ruby, Python, Node.js and Meteor web apps? Take a look at passenger-docker.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComponentWhy is it included? / Remarks
Ubuntu 12.04 LTSThe base system.
A correct init processAccording to the Unix process model, the init process -- PID 1 -- inherits all orphaned child processes 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 over time.

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.

Baseimage-docker comes with an init process /sbin/my_init that performs both of these tasks correctly.
Fixes APT incompatibilities with DockerSee https://github.com/dotcloud/docker/issues/1024.
syslog-ngA 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.

Only listens locally.
ssh serverAllows you to easily login to your container to inspect or administer things.

Password and challenge-response authentication are disabled by default. Only key authentication is allowed.
It allows an predefined key by default to make debugging easy. You should replace this ASAP. See instructions.
cronThe cron daemon must be running for cron jobs to work.
runitReplaces Ubuntu's Upstart. Used for service supervision and management. Much easier to use than SysV init and supports restarting daemons when they crash. Much easier to use and more lightweight than Upstart.
setuserA tool for running a command as another user. Easier to use than su, has a smaller attack vector than sudo, and unlike chpst this tool sets $HOME correctly. Available as /sbin/setuser.

Baseimage-docker is very lightweight: it only consumes 6 MB of memory.

+ +

+ +

+Wait, I thought Docker is about running a single process in a container?

+ +

Absolutely not true. Docker runs fine with multiple processes in a container. In fact, there is no technical reason why you should limit yourself to one process - it only makes things harder for you and breaks all kinds of essential system functionality, e.g. syslog.

+ +

Baseimage-docker encourages multiple processes through the use of runit.

+ +

+ +

+Inspecting baseimage-docker

+ +

To look around in the image, run:

+ +
docker run -rm -t -i phusion/baseimage bash -l
+
+ +

You don't have to download anything manually. The above command will automatically pull the baseimage-docker image from the Docker registry.

+ +

+ +

+Using baseimage-docker as base image

+ +

+ +

+Getting started

+ +

The image is called phusion/baseimage, and is available on the Docker registry.

+ +

By default, it allows SSH access for the key in image/insecure_key. This makes it easy for you to login to the container, but you should replace this key as soon as possible.

+ +
# Use phusion/baseimage as base image. To make your builds reproducible, make
+# sure you lock down to a specific version, not to `latest`!
+# See https://github.com/phusion/baseimage-docker/blob/master/Changelog.md for
+# a list of version numbers.
+FROM phusion/baseimage:<VERSION>
+
+# Set correct environment variables.
+ENV HOME /root
+
+# Remove authentication rights for insecure_key.
+RUN rm -f /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys
+
+# 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"]
+
+# ...put your own build instructions here...
+
+# Clean up APT when done.
+RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+ +

+ +

+Adding additional daemons

+ +

You can add additional daemons to the image by creating runit entries. You only have to write a small shell script which runs your daemon, and runit will keep it up and running for you, restarting it when it crashes, etc.

+ +

The shell script must be called run, must be executable, and is to be placed in the directory /etc/service/<NAME>.

+ +

Here's an example showing you how to a memached server runit entry can be made.

+ +
### In memcached.sh (make sure this file is chmod +x):
+#!/bin/sh
+# `chpst` is part of running. `chpst -u memcache` runs the given command
+# as the user `memcache`. If you omit this, the command will be run as root.
+exec chpst -u memcache /usr/bin/memcached >>/var/log/memcached.log 2>&1
+
+### In Dockerfile:
+RUN mkdir /etc/service/memcached
+ADD memcached.sh /etc/service/memcached/run
+
+ +

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.

+ +

+ +

+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.

+ +

Start a container based on baseimage-docker (or a container based on an image based on baseimage-docker):

+ +
docker run phusion/baseimage
+
+ +

Find out the ID of the container that you just ran:

+ +
docker ps
+
+ +

Once you have the ID, look for its IP address with:

+ +
docker inspect <ID> | grep IPAddress
+
+ +

Now SSH into the container. In this example we're using the default insecure key, but if you're followed the instructions well then you've already replaced that with your own key. You did replace the key, didn't you?

+ +
ssh -i insecure_key root@<IP address>
+
+ +

+ +

+Building the image yourself

+ +

If for whatever reason you want to build the image yourself instead of downloading it from the Docker registry, follow these instructions.

+ +

Clone this repository:

+ +
git clone https://github.com/phusion/baseimage-docker.git
+cd baseimage-docker
+
+ +

Start a virtual machine with Docker in it. You can use the Vagrantfile that we've already provided.

+ +
vagrant up
+vagrant ssh
+cd /vagrant
+
+ +

Build the image:

+ +
make build
+
+ +

If you want to call the resulting image something else, pass the NAME variable, like this:

+ +
make build NAME=joe/baseimage
+
+ +

+ +

+Conclusion

+ +

+ +

Please enjoy baseimage-docker, a product by Phusion. :-)

+
+ + + + +
+
+ + \ No newline at end of file diff --git a/javascripts/main.js b/javascripts/main.js new file mode 100644 index 0000000..d8135d3 --- /dev/null +++ b/javascripts/main.js @@ -0,0 +1 @@ +console.log('This would be the main JS file.'); diff --git a/params.json b/params.json new file mode 100644 index 0000000..16e9ac3 --- /dev/null +++ b/params.json @@ -0,0 +1 @@ +{"name":"Baseimage-docker","tagline":"A minimal Ubuntu base image modified for Docker-friendliness","body":"# A minimal Ubuntu base image modified for Docker-friendliness\r\n\r\nBaseimage-docker is a special [Docker](http://www.docker.io) image that is configured for correct use within Docker containers. It is Ubuntu, plus modifications for Docker-friendliness. You can use it as a base for your own Docker images.\r\n\r\nBaseimage-docker is available for pulling from [the Docker registry](https://index.docker.io/u/phusion/baseimage/)!\r\n\r\n### What are the problems with the stock Ubuntu base image?\r\n\r\nUbuntu is not designed to be run inside docker. Its init system, Upstart, assumes that it's running on either real hardware or virtualized hardware, but not inside a Docker container. But inside a container you don't want a full system anyway, you want a minimal system. But configuring that minimal system for use within a container has many strange corner cases that are hard to get right if you are not intimately familiar with the Unix system model. This can cause a lot of strange problems.\r\n\r\nBaseimage-docker gets everything right. The \"Contents\" section describes all the things that it modifies.\r\n\r\n\r\n### Why use baseimage-docker?\r\n\r\nYou can configure the stock `ubuntu` image yourself from your Dockerfile, so why bother using baseimage-docker?\r\n\r\n * Configuring the base system for Docker-friendliness is no easy task. As stated before, there are many corner cases. By the time that you've gotten all that right, you've reinvented baseimage-docker. Using baseimage-docker will save you from this effort.\r\n * It reduces the time needed to write a correct Dockerfile. You won't have to worry about the base system and can focus on your stack and your app.\r\n * It reduces the time needed to run `docker build`, allowing you to iterate your Dockerfile more quickly.\r\n * It reduces download time during redeploys. Docker only needs to download the base image once: during the first deploy. On every subsequent deploys, only the changes you make on top of the base image are downloaded.\r\n\r\n-----------------------------------------\r\n\r\n**Related resources**:\r\n [Github](https://github.com/phusion/baseimage-docker) |\r\n [Docker registry](https://index.docker.io/u/phusion/baseimage/) |\r\n [Discussion forum](https://groups.google.com/d/forum/passenger-docker) |\r\n [Twitter](https://twitter.com/phusion_nl) |\r\n [Blog](http://blog.phusion.nl/)\r\n\r\n**Table of contents**\r\n\r\n * [What's inside the image?](#whats_inside)\r\n * [Overview](#whats_inside_overview)\r\n * [Wait, I thought Docker is about running a single process in a container?](#docker_single_process)\r\n * [Inspecting baseimage-docker](#inspecting)\r\n * [Using baseimage-docker as base image](#using)\r\n * [Getting started](#getting_started)\r\n * [Adding additional daemons](#adding_additional_daemons)\r\n * [Running scripts during container startup](#running_startup_scripts)\r\n * [Login to the container](#login)\r\n * [Building the image yourself](#building)\r\n * [Conclusion](#conclusion)\r\n\r\n-----------------------------------------\r\n\r\n\r\n## What's inside the image?\r\n\r\n\r\n### Overview\r\n\r\n*Looking for a more complete base image, one that is ideal for Ruby, Python, Node.js and Meteor web apps? Take a look at [passenger-docker](https://github.com/phusion/passenger-docker).*\r\n\r\n| Component | Why is it included? / Remarks |\r\n| ---------------- | ------------------- |\r\n| Ubuntu 12.04 LTS | The base system. |\r\n| 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.

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.

Baseimage-docker comes with an init process `/sbin/my_init` that performs both of these tasks correctly. |\r\n| Fixes APT incompatibilities with Docker | See https://github.com/dotcloud/docker/issues/1024. |\r\n| 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.

Only listens locally. |\r\n| ssh server | Allows you to easily login to your container to inspect or administer things.

Password and challenge-response authentication are disabled by default. Only key authentication is allowed.
It allows an predefined key by default to make debugging easy. You should replace this ASAP. See instructions. |\r\n| cron | The cron daemon must be running for cron jobs to work. |\r\n| [runit](http://smarden.org/runit/) | Replaces Ubuntu's Upstart. Used for service supervision and management. Much easier to use than SysV init and supports restarting daemons when they crash. Much easier to use and more lightweight than Upstart. |\r\n| `setuser` | A tool for running a command as another user. Easier to use than `su`, has a smaller attack vector than `sudo`, and unlike `chpst` this tool sets `$HOME` correctly. Available as `/sbin/setuser`. |\r\n\r\nBaseimage-docker is very lightweight: it only consumes 6 MB of memory.\r\n\r\n\r\n### Wait, I thought Docker is about running a single process in a container?\r\n\r\nAbsolutely not true. Docker runs fine with multiple processes in a container. In fact, there is no technical reason why you should limit yourself to one process - it only makes things harder for you and breaks all kinds of essential system functionality, e.g. syslog.\r\n\r\nBaseimage-docker *encourages* multiple processes through the use of runit.\r\n\r\n\r\n## Inspecting baseimage-docker\r\n\r\nTo look around in the image, run:\r\n\r\n docker run -rm -t -i phusion/baseimage bash -l\r\n\r\nYou don't have to download anything manually. The above command will automatically pull the baseimage-docker image from the Docker registry.\r\n\r\n\r\n## Using baseimage-docker as base image\r\n\r\n\r\n### Getting started\r\n\r\nThe image is called `phusion/baseimage`, and is available on the Docker registry.\r\n\r\nBy default, it allows SSH access for the key in `image/insecure_key`. This makes it easy for you to login to the container, but you should replace this key as soon as possible.\r\n\r\n # Use phusion/baseimage as base image. To make your builds reproducible, make\r\n # sure you lock down to a specific version, not to `latest`!\r\n # See https://github.com/phusion/baseimage-docker/blob/master/Changelog.md for\r\n # a list of version numbers.\r\n FROM phusion/baseimage:\r\n \r\n # Set correct environment variables.\r\n ENV HOME /root\r\n \r\n # Remove authentication rights for insecure_key.\r\n RUN rm -f /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys\r\n \r\n # Regenerate SSH host keys. baseimage-docker does not contain any, so you\r\n # have to do that yourself. You may also comment out this instruction; the\r\n # init system will auto-generate one during boot.\r\n RUN /etc/my_init.d/00_regen_ssh_host_keys.sh\r\n \r\n # Use baseimage-docker's init system.\r\n CMD [\"/sbin/my_init\"]\r\n \r\n # ...put your own build instructions here...\r\n \r\n # Clean up APT when done.\r\n RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*\r\n\r\n\r\n### Adding additional daemons\r\n\r\nYou can add additional daemons to the image by creating runit entries. You only have to write a small shell script which runs your daemon, and runit will keep it up and running for you, restarting it when it crashes, etc.\r\n\r\nThe shell script must be called `run`, must be executable, and is to be placed in the directory `/etc/service/`.\r\n\r\nHere's an example showing you how to a memached server runit entry can be made.\r\n\r\n ### In memcached.sh (make sure this file is chmod +x):\r\n #!/bin/sh\r\n # `chpst` is part of running. `chpst -u memcache` runs the given command\r\n # as the user `memcache`. If you omit this, the command will be run as root.\r\n exec chpst -u memcache /usr/bin/memcached >>/var/log/memcached.log 2>&1\r\n\r\n ### In Dockerfile:\r\n RUN mkdir /etc/service/memcached\r\n ADD memcached.sh /etc/service/memcached/run\r\n\r\nNote 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.\r\n\r\n\r\n### Running scripts during container startup\r\n\r\nThe baseimage-docker init system, `/sbin/my_init`, runs the following scripts during startup, in the following order:\r\n\r\n * All executable scripts in `/etc/my_init.d`, if this directory exists. The scripts are run during in lexicographic order.\r\n * The script `/etc/rc.local`, if this file exists.\r\n\r\nAll scripts must exit correctly, e.g. with exit code 0. If any script exits with a non-zero exit code, the booting will fail.\r\n\r\nThe following example shows how you can add a startup script. This script simply logs the time of boot to the file /tmp/boottime.txt.\r\n\r\n ### In logtime.sh (make sure this file is chmod +x):\r\n #!/bin/sh\r\n date > /tmp/boottime.txt\r\n\r\n ### In Dockerfile:\r\n RUN mkdir -p /etc/my_init.d\r\n ADD logtime.sh /etc/my_init.d/logtime.sh\r\n\r\n\r\n### Login to the container\r\n\r\nYou can use SSH to login to any container that is based on baseimage-docker.\r\n\r\nStart a container based on baseimage-docker (or a container based on an image based on baseimage-docker):\r\n\r\n docker run phusion/baseimage\r\n\r\nFind out the ID of the container that you just ran:\r\n\r\n docker ps\r\n\r\nOnce you have the ID, look for its IP address with:\r\n\r\n docker inspect | grep IPAddress\r\n\r\nNow SSH into the container. In this example we're using [the default insecure key](https://github.com/phusion/baseimage-docker/blob/master/image/insecure_key), but if you're followed the instructions well then you've already replaced that with your own key. You did replace the key, didn't you?\r\n\r\n ssh -i insecure_key root@\r\n\r\n\r\n## Building the image yourself\r\n\r\nIf for whatever reason you want to build the image yourself instead of downloading it from the Docker registry, follow these instructions.\r\n\r\nClone this repository:\r\n\r\n git clone https://github.com/phusion/baseimage-docker.git\r\n cd baseimage-docker\r\n\r\nStart a virtual machine with Docker in it. You can use the Vagrantfile that we've already provided.\r\n\r\n vagrant up\r\n vagrant ssh\r\n cd /vagrant\r\n\r\nBuild the image:\r\n\r\n make build\r\n\r\nIf you want to call the resulting image something else, pass the NAME variable, like this:\r\n\r\n make build NAME=joe/baseimage\r\n\r\n\r\n## Conclusion\r\n\r\n * Using baseimage-docker? [Tweet about us](https://twitter.com/share) or [follow us on Twitter](https://twitter.com/phusion_nl).\r\n * Having problems? Want to participate in development? Please post a message at [the discussion forum](https://groups.google.com/d/forum/passenger-docker).\r\n * Looking for a more complete base image, one that is ideal for Ruby, Python, Node.js and Meteor web apps? Take a look at [passenger-docker](https://github.com/phusion/passenger-docker).\r\n\r\n[](http://www.phusion.nl/)\r\n\r\nPlease enjoy baseimage-docker, a product by [Phusion](http://www.phusion.nl/). :-)\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file diff --git a/stylesheets/print.css b/stylesheets/print.css new file mode 100644 index 0000000..541695b --- /dev/null +++ b/stylesheets/print.css @@ -0,0 +1,226 @@ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +body { + font-size: 13px; + line-height: 1.5; + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + color: #000; +} + +a { + color: #d5000d; + font-weight: bold; +} + +header { + padding-top: 35px; + padding-bottom: 10px; +} + +header h1 { + font-weight: bold; + letter-spacing: -1px; + font-size: 48px; + color: #303030; + line-height: 1.2; +} + +header h2 { + letter-spacing: -1px; + font-size: 24px; + color: #aaa; + font-weight: normal; + line-height: 1.3; +} +#downloads { + display: none; +} +#main_content { + padding-top: 20px; +} + +code, pre { + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; + color: #222; + margin-bottom: 30px; + font-size: 12px; +} + +code { + padding: 0 3px; +} + +pre { + border: solid 1px #ddd; + padding: 20px; + overflow: auto; +} +pre code { + padding: 0; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + border: 1px solid #ebebeb; + text-align: center; + font-weight: 300; +} + +form { + background: #f2f2f2; + padding: 20px; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +h1 { + font-size: 2.8em; +} + +h2 { + font-size: 22px; + font-weight: bold; + color: #303030; + margin-bottom: 8px; +} + +h3 { + color: #d5000d; + font-size: 18px; + font-weight: bold; + margin-bottom: 8px; +} + +h4 { + font-size: 16px; + color: #303030; + font-weight: bold; +} + +h5 { + font-size: 1em; + color: #303030; +} + +h6 { + font-size: .8em; + color: #303030; +} + +p { + font-weight: 300; + margin-bottom: 20px; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + font-size: 1.6em; + border-left: 10px solid #e9e9e9; + margin-bottom: 20px; + padding: 0 0 0 30px; +} + +ul li { + list-style: disc inside; + padding-left: 20px; +} + +ol li { + list-style: decimal inside; + padding-left: 3px; +} + +dl dd { + font-style: italic; + font-weight: 100; +} + +footer { + margin-top: 40px; + padding-top: 20px; + padding-bottom: 30px; + font-size: 13px; + color: #aaa; +} + +footer a { + color: #666; +} + +/* MISC */ +.clearfix:after { + clear: both; + content: '.'; + display: block; + visibility: hidden; + height: 0; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} \ No newline at end of file diff --git a/stylesheets/pygment_trac.css b/stylesheets/pygment_trac.css new file mode 100644 index 0000000..c6a6452 --- /dev/null +++ b/stylesheets/pygment_trac.css @@ -0,0 +1,69 @@ +.highlight { background: #ffffff; } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold; } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #d14 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086B3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #d14 } /* Literal.String.Backtick */ +.highlight .sc { color: #d14 } /* Literal.String.Char */ +.highlight .sd { color: #d14 } /* Literal.String.Doc */ +.highlight .s2 { color: #d14 } /* Literal.String.Double */ +.highlight .se { color: #d14 } /* Literal.String.Escape */ +.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ +.highlight .si { color: #d14 } /* Literal.String.Interpol */ +.highlight .sx { color: #d14 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #d14 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ + +.type-csharp .highlight .k { color: #0000FF } +.type-csharp .highlight .kt { color: #0000FF } +.type-csharp .highlight .nf { color: #000000; font-weight: normal } +.type-csharp .highlight .nc { color: #2B91AF } +.type-csharp .highlight .nn { color: #000000 } +.type-csharp .highlight .s { color: #A31515 } +.type-csharp .highlight .sc { color: #A31515 } diff --git a/stylesheets/stylesheet.css b/stylesheets/stylesheet.css new file mode 100644 index 0000000..020ad6d --- /dev/null +++ b/stylesheets/stylesheet.css @@ -0,0 +1,371 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* LAYOUT STYLES */ +body { + font-size: 1em; + line-height: 1.5; + background: #e7e7e7 url(../images/body-bg.png) 0 0 repeat; + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); + color: #6d6d6d; +} + +a { + color: #d5000d; +} +a:hover { + color: #c5000c; +} + +header { + padding-top: 35px; + padding-bottom: 25px; +} + +header h1 { + font-family: 'Chivo', 'Helvetica Neue', Helvetica, Arial, serif; font-weight: 900; + letter-spacing: -1px; + font-size: 48px; + color: #303030; + line-height: 1.2; +} + +header h2 { + letter-spacing: -1px; + font-size: 24px; + color: #aaa; + font-weight: normal; + line-height: 1.3; +} + +#container { + background: transparent url(../images/highlight-bg.jpg) 50% 0 no-repeat; + min-height: 595px; +} + +.inner { + width: 620px; + margin: 0 auto; +} + +#container .inner img { + max-width: 100%; +} + +#downloads { + margin-bottom: 40px; +} + +a.button { + -moz-border-radius: 30px; + -webkit-border-radius: 30px; + border-radius: 30px; + border-top: solid 1px #cbcbcb; + border-left: solid 1px #b7b7b7; + border-right: solid 1px #b7b7b7; + border-bottom: solid 1px #b3b3b3; + color: #303030; + line-height: 25px; + font-weight: bold; + font-size: 15px; + padding: 12px 8px 12px 8px; + display: block; + float: left; + width: 179px; + margin-right: 14px; + background: #fdfdfd; /* Old browsers */ + background: -moz-linear-gradient(top, #fdfdfd 0%, #f2f2f2 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdfdfd), color-stop(100%,#f2f2f2)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* IE10+ */ + background: linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdfdfd', endColorstr='#f2f2f2',GradientType=0 ); /* IE6-9 */ + -webkit-box-shadow: 10px 10px 5px #888; + -moz-box-shadow: 10px 10px 5px #888; + box-shadow: 0px 1px 5px #e8e8e8; +} +a.button:hover { + border-top: solid 1px #b7b7b7; + border-left: solid 1px #b3b3b3; + border-right: solid 1px #b3b3b3; + border-bottom: solid 1px #b3b3b3; + background: #fafafa; /* Old browsers */ + background: -moz-linear-gradient(top, #fdfdfd 0%, #f6f6f6 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdfdfd), color-stop(100%,#f6f6f6)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* IE10+ */ + background: linear-gradient(top, #fdfdfd 0%,#f6f6f6, 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdfdfd', endColorstr='#f6f6f6',GradientType=0 ); /* IE6-9 */ +} + +a.button span { + padding-left: 50px; + display: block; + height: 23px; +} + +#download-zip span { + background: transparent url(../images/zip-icon.png) 12px 50% no-repeat; +} +#download-tar-gz span { + background: transparent url(../images/tar-gz-icon.png) 12px 50% no-repeat; +} +#view-on-github span { + background: transparent url(../images/octocat-icon.png) 12px 50% no-repeat; +} +#view-on-github { + margin-right: 0; +} + +code, pre { + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; + color: #222; + margin-bottom: 30px; + font-size: 14px; +} + +code { + background-color: #f2f2f2; + border: solid 1px #ddd; + padding: 0 3px; +} + +pre { + padding: 20px; + background: #303030; + color: #f2f2f2; + text-shadow: none; + overflow: auto; +} +pre code { + color: #f2f2f2; + background-color: #303030; + border: none; + padding: 0; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +hr { + height: 1px; + line-height: 1px; + margin-top: 1em; + padding-bottom: 1em; + border: none; + background: transparent url('../images/hr.png') 50% 0 no-repeat; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + border: 1px solid #ebebeb; + text-align: center; + font-weight: 300; +} + +form { + background: #f2f2f2; + padding: 20px; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +h1 { + font-size: 32px; +} + +h2 { + font-size: 22px; + font-weight: bold; + color: #303030; + margin-bottom: 8px; +} + +h3 { + color: #d5000d; + font-size: 18px; + font-weight: bold; + margin-bottom: 8px; +} + +h4 { + font-size: 16px; + color: #303030; + font-weight: bold; +} + +h5 { + font-size: 1em; + color: #303030; +} + +h6 { + font-size: .8em; + color: #303030; +} + +p { + font-weight: 300; + margin-bottom: 20px; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + font-size: 1.6em; + border-left: 10px solid #e9e9e9; + margin-bottom: 20px; + padding: 0 0 0 30px; +} + +ul li { + list-style: disc inside; + padding-left: 20px; +} + +ol li { + list-style: decimal inside; + padding-left: 3px; +} + +dl dt { + color: #303030; +} + +footer { + background: transparent url('../images/hr.png') 0 0 no-repeat; + margin-top: 40px; + padding-top: 20px; + padding-bottom: 30px; + font-size: 13px; + color: #aaa; +} + +footer a { + color: #666; +} +footer a:hover { + color: #444; +} + +/* MISC */ +.clearfix:after { + clear: both; + content: '.'; + display: block; + visibility: hidden; + height: 0; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} + +/* #Media Queries +================================================== */ + +/* Smaller than standard 960 (devices and browsers) */ +@media only screen and (max-width: 959px) {} + +/* Tablet Portrait size to standard 960 (devices and browsers) */ +@media only screen and (min-width: 768px) and (max-width: 959px) {} + +/* All Mobile Sizes (devices and browser) */ +@media only screen and (max-width: 767px) { + header { + padding-top: 10px; + padding-bottom: 10px; + } + #downloads { + margin-bottom: 25px; + } + #download-zip, #download-tar-gz { + display: none; + } + .inner { + width: 94%; + margin: 0 auto; + } +} + +/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ +@media only screen and (min-width: 480px) and (max-width: 767px) {} + +/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ +@media only screen and (max-width: 479px) {}