mirror of
https://github.com/phusion/baseimage-docker.git
synced 2026-03-26 20:38:58 +00:00
Compare commits
32 Commits
rel-0.9.10
...
rel-0.9.11
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f58282d4d3 | ||
|
|
e6258b37b5 | ||
|
|
71ce2a6d9d | ||
|
|
08d5b93095 | ||
|
|
d0e63da07b | ||
|
|
2beb0e253e | ||
|
|
0302713554 | ||
|
|
7ac6795aa5 | ||
|
|
feab2fce75 | ||
|
|
3019bbf09b | ||
|
|
18a7fe26ec | ||
|
|
b9d788611a | ||
|
|
1357e9399e | ||
|
|
ba1e1ffbf5 | ||
|
|
0b468fb61b | ||
|
|
9db4f43b74 | ||
|
|
5806f51ea3 | ||
|
|
c431f2d151 | ||
|
|
76100b639a | ||
|
|
ecf6e6b226 | ||
|
|
92c2ea22ed | ||
|
|
436be20ff0 | ||
|
|
f445cafe03 | ||
|
|
93572a5698 | ||
|
|
f5efca365c | ||
|
|
949bd1d89f | ||
|
|
2b339a3344 | ||
|
|
b665b78454 | ||
|
|
5b403fe06c | ||
|
|
1a6c43b8d7 | ||
|
|
0325abf74e | ||
|
|
22c3d60d94 |
5
CONTRIBUTING.md
Normal file
5
CONTRIBUTING.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
Hey, thanks for wanting to contribute to baseimage-docker. :)
|
||||||
|
|
||||||
|
If you have a question, please use the [discussion forum](https://groups.google.com/d/forum/passenger-docker). The Github issue tracker is only for **bug reports and feature requests**.
|
||||||
|
|
||||||
|
If you want to develop baseimage-docker, use the Vagrantfile in the repository. It will setup an Ubuntu VM with Docker installed in it. Use the Makefile to build the image.
|
||||||
10
Changelog.md
10
Changelog.md
@@ -1,3 +1,13 @@
|
|||||||
|
## 0.9.11 (release date: 2014-06-24)
|
||||||
|
|
||||||
|
* Introduced the `docker-bash` tool. This is a shortcut tool for logging into a container using SSH. Usage: `docker-bash <CONTAINER ID>`. See the README for details.
|
||||||
|
* Fixed various process waiting issues in `my_init`. Closes GH-27, GH-82 and GH-83. Thanks to André Luiz dos Santos and Paul Annesley.
|
||||||
|
* The `ca-certificates` package is now installed by default. This is because we include `apt-transport-https`, but Ubuntu 14.04 no longer installs `ca-certificates` by default anymore. Closes GH-73.
|
||||||
|
* Output print by Runit services are now redirected to the Docker logs instead of to proctitle. Thanks to Paul Annesley.
|
||||||
|
* Container environment variables are now made available to SSH root shells. If you login with SSH through a non-root account, then container environment variables are only made available if that user is a member of the `docker_env` group. Thanks to Bernard Potocki.
|
||||||
|
* `add-apt-repository` is now installed by default. Closes GH-74.
|
||||||
|
* Various minor fixes and contributions thanks to yebyen, John Eckhart, Christoffer Sawicki and Brant Fitzsimmons.
|
||||||
|
|
||||||
## 0.9.10 (release date: 2014-05-12)
|
## 0.9.10 (release date: 2014-05-12)
|
||||||
|
|
||||||
* Upgraded to Ubuntu 14.04 (Trusty). We will no longer release images based on 12.04.
|
* Upgraded to Ubuntu 14.04 (Trusty). We will no longer release images based on 12.04.
|
||||||
|
|||||||
4
Makefile
4
Makefile
@@ -1,5 +1,5 @@
|
|||||||
NAME = phusion/baseimage
|
NAME = phusion/baseimage
|
||||||
VERSION = 0.9.10
|
VERSION = 0.9.11
|
||||||
|
|
||||||
.PHONY: all build test tag_latest release ssh
|
.PHONY: all build test tag_latest release ssh
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ release: test tag_latest
|
|||||||
@echo "*** Don't forget to create a tag. git tag rel-$(VERSION) && git push origin rel-$(VERSION)"
|
@echo "*** Don't forget to create a tag. git tag rel-$(VERSION) && git push origin rel-$(VERSION)"
|
||||||
|
|
||||||
ssh:
|
ssh:
|
||||||
chmod 600 image/insecure_key.pub
|
chmod 600 image/insecure_key
|
||||||
@ID=$$(docker ps | grep -F "$(NAME):$(VERSION)" | awk '{ print $$1 }') && \
|
@ID=$$(docker ps | grep -F "$(NAME):$(VERSION)" | awk '{ print $$1 }') && \
|
||||||
if test "$$ID" = ""; then echo "Container is not running."; exit 1; fi && \
|
if test "$$ID" = ""; then echo "Container is not running."; exit 1; fi && \
|
||||||
IP=$$(docker inspect $$ID | grep IPAddr | sed 's/.*: "//; s/".*//') && \
|
IP=$$(docker inspect $$ID | grep IPAddr | sed 's/.*: "//; s/".*//') && \
|
||||||
|
|||||||
32
README.md
32
README.md
@@ -50,6 +50,7 @@ You can configure the stock `ubuntu` image yourself from your Dockerfile, so why
|
|||||||
* [Using the insecure key for one container only](#using_the_insecure_key_for_one_container_only)
|
* [Using the insecure key for one container only](#using_the_insecure_key_for_one_container_only)
|
||||||
* [Enabling the insecure key permanently](#enabling_the_insecure_key_permanently)
|
* [Enabling the insecure key permanently](#enabling_the_insecure_key_permanently)
|
||||||
* [Using your own key](#using_your_own_key)
|
* [Using your own key](#using_your_own_key)
|
||||||
|
* [The `docker-bash` tool](#docker_bash)
|
||||||
* [Disabling SSH](#disabling_ssh)
|
* [Disabling SSH](#disabling_ssh)
|
||||||
* [Building the image yourself](#building)
|
* [Building the image yourself](#building)
|
||||||
* [Conclusion](#conclusion)
|
* [Conclusion](#conclusion)
|
||||||
@@ -150,7 +151,7 @@ Note that the shell script must run the daemon **without letting it daemonize/fo
|
|||||||
|
|
||||||
The baseimage-docker init system, `/sbin/my_init`, runs the following scripts during startup, in the following order:
|
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.
|
* All executable scripts in `/etc/my_init.d`, if this directory exists. The scripts are run in lexicographic order.
|
||||||
* The script `/etc/rc.local`, if this file exists.
|
* 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.
|
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.
|
||||||
@@ -287,7 +288,9 @@ But note that:
|
|||||||
<a name="envvar_security"></a>
|
<a name="envvar_security"></a>
|
||||||
#### Security
|
#### Security
|
||||||
|
|
||||||
Because environment variables can potentially contain sensitive information, `/etc/container_environment` and its Bash and JSON dumps are by default owned by root, and root-accessible only. If you are sure that your environment variables don't contain sensitive data, then you can relax the permissions on that directory and those files by making them world-readable:
|
Because environment variables can potentially contain sensitive information, `/etc/container_environment` and its Bash and JSON dumps are by default owned by root, and accessible only by the `docker_env` group (so that any user added this group will have these variables automatically loaded).
|
||||||
|
|
||||||
|
If you are sure that your environment variables don't contain sensitive data, then you can also relax the permissions on that directory and those files by making them world-readable:
|
||||||
|
|
||||||
RUN chmod 755 /etc/container_environment
|
RUN chmod 755 /etc/container_environment
|
||||||
RUN chmod 644 /etc/container_environment.sh /etc/container_environment.json
|
RUN chmod 644 /etc/container_environment.sh /etc/container_environment.json
|
||||||
@@ -314,7 +317,7 @@ Find out the ID of the container that you just ran:
|
|||||||
|
|
||||||
Once you have the ID, look for its IP address with:
|
Once you have the ID, look for its IP address with:
|
||||||
|
|
||||||
docker inspect <ID> | grep IPAddress
|
docker inspect -f "{{ .NetworkSettings.IPAddress }}" <ID>
|
||||||
|
|
||||||
Now SSH into the container as follows:
|
Now SSH into the container as follows:
|
||||||
|
|
||||||
@@ -352,12 +355,33 @@ Find out the ID of the container that you just ran:
|
|||||||
|
|
||||||
Once you have the ID, look for its IP address with:
|
Once you have the ID, look for its IP address with:
|
||||||
|
|
||||||
docker inspect <ID> | grep IPAddress
|
docker inspect -f "{{ .NetworkSettings.IPAddress }}" <ID>
|
||||||
|
|
||||||
Now SSH into the container as follows:
|
Now SSH into the container as follows:
|
||||||
|
|
||||||
ssh -i /path-to/your_key root@<IP address>
|
ssh -i /path-to/your_key root@<IP address>
|
||||||
|
|
||||||
|
<a name="docker_bash"></a>
|
||||||
|
#### The `docker-bash` tool
|
||||||
|
|
||||||
|
Looking up the IP of a container and running an SSH command quickly becomes tedious. Luckily, we provide the `docker-bash` tool which automates this process. This tool is to be run on the *Docker host*, not inside a Docker container.
|
||||||
|
|
||||||
|
First, install the tool on the Docker host:
|
||||||
|
|
||||||
|
curl --fail -L -O https://github.com/phusion/baseimage-docker/archive/master.tar.gz && \
|
||||||
|
tar xzf master.tar.gz && \
|
||||||
|
sudo ./baseimage-docker-master/install-tools.sh
|
||||||
|
|
||||||
|
Then run the tool as follows to login to a container using SSH:
|
||||||
|
|
||||||
|
docker-bash YOUR-CONTAINER-ID
|
||||||
|
|
||||||
|
You can lookup `YOUR-CONTAINER-ID` by running `docker ps`.
|
||||||
|
|
||||||
|
By default, `docker-bash` will open a Bash session. You can also tell it to run a command, and then exit:
|
||||||
|
|
||||||
|
docker-bash YOUR-CONTAINER-ID echo hello world
|
||||||
|
|
||||||
|
|
||||||
<a name="building"></a>
|
<a name="building"></a>
|
||||||
## Building the image yourself
|
## Building the image yourself
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ LOG_LEVEL_DEBUG = 3
|
|||||||
|
|
||||||
log_level = None
|
log_level = None
|
||||||
|
|
||||||
|
terminated_child_processes = {}
|
||||||
|
|
||||||
class AlarmException(Exception):
|
class AlarmException(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -73,6 +75,8 @@ def import_envvars(clear_existing_environment = True, override_existing_environm
|
|||||||
def export_envvars(to_dir = True):
|
def export_envvars(to_dir = True):
|
||||||
shell_dump = ""
|
shell_dump = ""
|
||||||
for name, value in os.environ.items():
|
for name, value in os.environ.items():
|
||||||
|
if name in ['HOME', 'USER', 'GROUP', 'UID', 'GID', 'SHELL']:
|
||||||
|
continue
|
||||||
if to_dir:
|
if to_dir:
|
||||||
with open("/etc/container_environment/" + name, "w") as f:
|
with open("/etc/container_environment/" + name, "w") as f:
|
||||||
f.write(value)
|
f.write(value)
|
||||||
@@ -95,19 +99,36 @@ def shquote(s):
|
|||||||
# the string $'b is then quoted as '$'"'"'b'
|
# the string $'b is then quoted as '$'"'"'b'
|
||||||
return "'" + s.replace("'", "'\"'\"'") + "'"
|
return "'" + s.replace("'", "'\"'\"'") + "'"
|
||||||
|
|
||||||
|
# Waits for the child process with the given PID, while at the same time
|
||||||
|
# reaping any other child processes that have exited (e.g. adopted child
|
||||||
|
# processes that have terminated).
|
||||||
def waitpid_reap_other_children(pid):
|
def waitpid_reap_other_children(pid):
|
||||||
|
global terminated_child_processes
|
||||||
|
|
||||||
|
status = terminated_child_processes.get(pid)
|
||||||
|
if status:
|
||||||
|
# A previous call to waitpid_reap_other_children(),
|
||||||
|
# with an argument not equal to the current argument,
|
||||||
|
# already waited for this process. Return the status
|
||||||
|
# that was obtained back then.
|
||||||
|
del terminated_child_processes[pid]
|
||||||
|
return status
|
||||||
|
|
||||||
done = False
|
done = False
|
||||||
status = None
|
status = None
|
||||||
try:
|
|
||||||
this_pid, status = os.waitpid(pid, os.WNOHANG)
|
|
||||||
except OSError as e:
|
|
||||||
if e.errno == errno.ECHILD or e.errno == errno.ESRCH:
|
|
||||||
return None
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
while not done:
|
while not done:
|
||||||
this_pid, status = os.waitpid(-1, 0)
|
try:
|
||||||
done = this_pid == pid
|
this_pid, status = os.waitpid(-1, 0)
|
||||||
|
if this_pid == pid:
|
||||||
|
done = True
|
||||||
|
else:
|
||||||
|
# Save status for later.
|
||||||
|
terminated_child_processes[this_pid] = status
|
||||||
|
except OSError as e:
|
||||||
|
if e.errno == errno.ECHILD or e.errno == errno.ESRCH:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
raise
|
||||||
return status
|
return status
|
||||||
|
|
||||||
def stop_child_process(name, pid, signo = signal.SIGTERM, time_limit = KILL_PROCESS_TIMEOUT):
|
def stop_child_process(name, pid, signo = signal.SIGTERM, time_limit = KILL_PROCESS_TIMEOUT):
|
||||||
@@ -200,7 +221,7 @@ def run_startup_files():
|
|||||||
def start_runit():
|
def start_runit():
|
||||||
info("Booting runit daemon...")
|
info("Booting runit daemon...")
|
||||||
pid = os.spawnl(os.P_NOWAIT, "/usr/bin/runsvdir", "/usr/bin/runsvdir",
|
pid = os.spawnl(os.P_NOWAIT, "/usr/bin/runsvdir", "/usr/bin/runsvdir",
|
||||||
"-P", "/etc/service", "log: %s" % ('.' * 395))
|
"-P", "/etc/service")
|
||||||
info("Runit started as PID %d" % pid)
|
info("Runit started as PID %d" % pid)
|
||||||
return pid
|
return pid
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,10 @@ dpkg-divert --local --rename --add /usr/bin/ischroot
|
|||||||
ln -sf /bin/true /usr/bin/ischroot
|
ln -sf /bin/true /usr/bin/ischroot
|
||||||
|
|
||||||
## Install HTTPS support for APT.
|
## Install HTTPS support for APT.
|
||||||
$minimal_apt_get_install apt-transport-https
|
$minimal_apt_get_install apt-transport-https ca-certificates
|
||||||
|
|
||||||
|
## Install add-apt-repository
|
||||||
|
$minimal_apt_get_install software-properties-common
|
||||||
|
|
||||||
## Upgrade all packages.
|
## Upgrade all packages.
|
||||||
apt-get dist-upgrade -y --no-install-recommends
|
apt-get dist-upgrade -y --no-install-recommends
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ 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
|
chown root:adm /dev/xconsole
|
||||||
[ -x /sbin/restorecon ] && /sbin/restorecon $XCONSOLE
|
[ -x /sbin/restorecon ] && /sbin/restorecon $XCONSOLE
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,11 @@ mkdir -p /etc/container_environment
|
|||||||
touch /etc/container_environment.sh
|
touch /etc/container_environment.sh
|
||||||
touch /etc/container_environment.json
|
touch /etc/container_environment.json
|
||||||
chmod 700 /etc/container_environment
|
chmod 700 /etc/container_environment
|
||||||
chmod 600 /etc/container_environment.sh /etc/container_environment.json
|
|
||||||
|
groupadd docker_env
|
||||||
|
chown :docker_env /etc/container_environment.sh /etc/container_environment.json
|
||||||
|
chmod 640 /etc/container_environment.sh /etc/container_environment.json
|
||||||
|
ln -s /etc/container_environment.sh /etc/profile.d/
|
||||||
|
|
||||||
## Install runit.
|
## Install runit.
|
||||||
$minimal_apt_get_install runit
|
$minimal_apt_get_install runit
|
||||||
|
|||||||
10
install-tools.sh
Executable file
10
install-tools.sh
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
dir=`dirname "$0"`
|
||||||
|
cd "$dir"
|
||||||
|
|
||||||
|
set -x
|
||||||
|
cp tools/* /usr/local/bin/
|
||||||
|
mkdir -p /usr/local/share/baseimage-docker
|
||||||
|
cp image/insecure_key /usr/local/share/baseimage-docker/
|
||||||
|
chmod 644 /usr/local/share/baseimage-docker/insecure_key
|
||||||
82
tools/docker-bash
Executable file
82
tools/docker-bash
Executable file
@@ -0,0 +1,82 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
KNOWN_HOSTS_FILE=
|
||||||
|
IP=
|
||||||
|
|
||||||
|
function usage()
|
||||||
|
{
|
||||||
|
echo "Usage: docker-bash <CONTAINER_ID> [COMMAND...]"
|
||||||
|
echo "Login to a Baseimage-based Docker container using SSH."
|
||||||
|
echo "If COMMAND is not given, opens an interactive shell."
|
||||||
|
echo "Otherwise, runs COMMAND inside the container."
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanup()
|
||||||
|
{
|
||||||
|
local pids=`jobs -p`
|
||||||
|
if [[ "$pids" != "" ]]; then
|
||||||
|
kill $pids
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$KNOWN_HOSTS_FILE" != "" ]]; then
|
||||||
|
rm -f "$KNOWN_HOSTS_FILE"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $# = 0 ]]; then
|
||||||
|
usage
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
CONTAINER_ID="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
if ! [[ -e ~/.baseimage_docker_insecure_key ]]; then
|
||||||
|
if [[ -e /usr/local/share/baseimage-docker/insecure_key ]]; then
|
||||||
|
cp /usr/local/share/baseimage-docker/insecure_key ~/.baseimage_docker_insecure_key
|
||||||
|
else
|
||||||
|
dir=`dirname "$0"`
|
||||||
|
dir=`cd "$dir/.." && pwd`
|
||||||
|
if [[ -e "$dir/image/insecure_key" ]]; then
|
||||||
|
cp "$dir/image/insecure_key" ~/.baseimage_docker_insecure_key
|
||||||
|
else
|
||||||
|
echo "*** ERROR ***: Baseimage-docker insecure key not found." >&2
|
||||||
|
echo "You probably didn't install docker-bash properly. Please reinstall it:" >&2
|
||||||
|
echo "" >&2
|
||||||
|
echo " curl --fail -L -O https://github.com/phusion/baseimage-docker/archive/master.tar.gz && \\" >&2
|
||||||
|
echo " tar xzf master.tar.gz && \\" >&2
|
||||||
|
echo " sudo ./baseimage-docker-master/install-tools.sh" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
chown "`whoami`": ~/.baseimage_docker_insecure_key
|
||||||
|
chmod 600 ~/.baseimage_docker_insecure_key
|
||||||
|
fi
|
||||||
|
|
||||||
|
KNOWN_HOSTS_FILE=`mktemp /tmp/docker-bash.XXXXXXXXX`
|
||||||
|
IP=`docker inspect -f "{{ .NetworkSettings.IPAddress }}" "$CONTAINER_ID"`
|
||||||
|
|
||||||
|
# Prevent SSH from warning about adding a host to the known_hosts file.
|
||||||
|
ssh-keyscan "$IP" >"$KNOWN_HOSTS_FILE" 2>&1
|
||||||
|
|
||||||
|
if ! ssh -i ~/.baseimage_docker_insecure_key \
|
||||||
|
-o UserKnownHostsFile="$KNOWN_HOSTS_FILE" \
|
||||||
|
-o StrictHostKeyChecking=no \
|
||||||
|
-o PasswordAuthentication=no \
|
||||||
|
-o KbdInteractiveAuthentication=no \
|
||||||
|
-o ChallengeResponseAuthentication=no \
|
||||||
|
"root@$IP" "$@"
|
||||||
|
then
|
||||||
|
STATUS=$?
|
||||||
|
if [[ $# = 0 ]]; then
|
||||||
|
echo "----------------"
|
||||||
|
echo "It appears that login to the Docker container failed. This could be caused by the following reasons:"
|
||||||
|
echo "- The Docker container you're trying to login to is not based on Baseimage-docker. The docker-bash tool only works with Baseimage-docker-based containers."
|
||||||
|
echo "- You did not enable the the insecure key inside the container. Please read https://github.com/phusion/baseimage-docker/blob/master/README.md#login to learn how to enable the insecure key."
|
||||||
|
fi
|
||||||
|
exit $STATUS
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user