1
0
mirror of https://github.com/phusion/baseimage-docker.git synced 2026-03-25 20:07:55 +00:00

Compare commits

...

389 Commits

Author SHA1 Message Date
Travis Rowland
fdfe6b1937 Merge pull request #449 from phusion/Theaxiom-patch-2
Incrementing version AFFECTS #448
2018-01-26 01:25:41 -08:00
Travis Rowland
95d89dd251 Merge branch 'master' into Theaxiom-patch-2 2017-11-23 15:12:00 -08:00
Travis Rowland
06e2983ba9 Merge pull request #453 from sundbry/sigint-logging
Fork syslog-ng into a new process group via bash monitor mode
2017-11-23 15:11:35 -08:00
Travis Rowland
5ab2367f76 Merge branch 'master' into sigint-logging 2017-11-23 12:28:39 -08:00
Travis Rowland
61d585bce9 Merge pull request #447 from kamermans/bugfix/syslog_unclean_shutdown
Gracefully handle syslog-ng shutdown
2017-11-23 12:28:14 -08:00
Ryan Sundberg
b77633463f Fork syslog-ng into a new process group via bash monitor mode
This prevents SIGINT from a user interrupt from prematurely quitting syslog-ng.
See https://github.com/phusion/baseimage-docker/issues/450
2017-11-22 23:18:19 -08:00
Steve Kamerman
9bb3117b0c Merge branch 'master' into bugfix/syslog_unclean_shutdown 2017-11-03 17:14:19 -04:00
Travis Rowland
338238d685 Merge branch 'master' into Theaxiom-patch-2 2017-11-02 11:47:18 -07:00
Travis Rowland
c5680a44b1 Merge pull request #446 from phusion/add-code-of-conduct-1
Create CODE_OF_CONDUCT.md
2017-11-02 11:46:51 -07:00
Travis Rowland
4468bb296e Incrementing version AFFECTS #448 2017-11-02 09:34:12 -07:00
Steve Kamerman
25d13ef2b8 Gracefully handle syslog-ng shutdown 2017-11-01 17:26:31 -04:00
Travis Rowland
4cb596bfc9 Create CODE_OF_CONDUCT.md 2017-11-01 12:16:33 -07:00
Travis Rowland
42c48d8465 Merge pull request #425 from sundbry/syslog-shutdown
Start syslog-ng before runit, and stop after runit.
2017-11-01 12:06:35 -07:00
Ryan Sundberg
18a10580e1 Syslog-ng start and stop, preserving stdout file descriptor 2017-10-31 15:41:59 -07:00
Ryan Sundberg
d765626688 Prefix syslog-ng shutdown scripts with boot order 2017-10-31 14:24:18 -07:00
Ryan Sundberg
69d1b96431 Capitalization 2017-10-31 14:21:23 -07:00
Ryan Sundberg
89389d5086 Merge branch 'syslog-shutdown' of github.com:sundbry/baseimage-docker into syslog-shutdown 2017-10-31 14:16:47 -07:00
Ryan Sundberg
70b5c73902 System logging notes in README.md 2017-10-31 14:16:27 -07:00
Travis Rowland
b05616332a Merge branch 'master' into syslog-shutdown 2017-10-30 11:59:01 -07:00
Steve Kamerman
421ca4ea05 Renamed install_clean 2017-10-30 10:22:42 -04:00
Steve Kamerman
c41f837f82 Added --no-install-recommends by default 2017-10-30 10:22:42 -04:00
Steve Kamerman
fcc1283c85 Added install_clean.sh utility 2017-10-30 10:22:42 -04:00
Kingdon Barrett
ffc1f6db05 Merge pull request #444 from SConaway/patch-1
Update README.md
2017-10-25 12:57:17 -04:00
Steven Conaway
6a774f2f48 Update README.md 2017-10-23 18:53:46 -07:00
Travis Rowland
c7efb776b8 Merge pull request #439 from mortn/patch-1
Adding "more" to the first sentence.
2017-10-09 10:31:52 -07:00
Morten Abildgaard
2be1e6f407 Adding "more" to the first sentence.
I think this is what it's supposed to say.
2017-10-08 11:42:53 +02:00
David Hiendl
2bb9d89325 configured syslog-ng to log to stdout directly instead of using tail (#438) 2017-10-05 21:13:01 +02:00
Dotan J. Nahum
8d7f3abd2d Reflect 'latest' in imagelayers.io image. (#435) 2017-10-05 19:51:41 +02:00
Ryan Sundberg
91363dcf37 Merge branch 'master' of https://github.com/phusion/baseimage-docker into syslog-shutdown 2017-09-28 11:26:45 -07:00
Zsolt Ero
0cf1fd05ac removed testing artifact 2017-08-17 00:04:42 +02:00
Zsolt Ero
544511f883 bad-tag test 2017-08-16 23:58:18 +02:00
Zsolt Ero
0ad69ad848 good-tag test 2017-08-16 23:57:12 +02:00
Zsolt Ero
39ad242428 yaml quotes fix 2017-08-16 23:51:24 +02:00
Zsolt Ero
a52c8d4ae0 test_release, test_master 2017-08-16 23:41:17 +02:00
Kingdon Barrett
1bd5b85eb1 Merge pull request #432 from phusion/patch-1
Replaces #410
2017-08-08 13:34:30 -04:00
Travis Rowland
1a235a13e1 Update my_init 2017-07-31 21:49:57 -04:00
Jose Diaz-Gonzalez
0e15f28fb7 feat: allow users to specify an alternative init directory
In some existing environments, packages might already use another environment for the purpose this `/etc/my_init.d` directory serves.
2017-07-31 21:49:57 -04:00
Zsolt Ero
d6702be8c3 fix_pam_bug removed (#431) 2017-08-01 01:35:38 +02:00
Przemysław Dąbek
40bad74956 sanitize_shenvname returns string with [0-9a-zA-Z_] characters (#423)
* sanitize_shenvname returns string with [0-9a-zA-Z_] characters

* moved regex pattern to constant
2017-07-31 15:38:33 +02:00
Ryan Sundberg
a6bf447f9e Start syslog-ng before runit, and stop after runit.
When syslog-ng is managed as an runit service, application logs may be
lost during shutdown, when the syslog-ng service stops before the app
exits.

This change uses the my_init.d directory to manage syslog-ng at a lower
runlevel than runit.
2017-07-01 15:08:08 -07:00
Travis Rowland
b57f08c71f Merge pull request #409 from goneio/refactor/remove-unnecessary-env-layers
Remove 3 unnecessary layers from the layer count.
2017-05-23 14:15:51 -07:00
Matthew Baggett
a3faefd3d3 Remove 3 unnecessary layers from the layer count. 2017-05-18 13:59:29 +01:00
Travis Rowland
cd23614b27 Revert "Incrementing version to 0.9.23"
This reverts commit 914f0967b0.
2017-05-17 15:14:56 -07:00
Travis Rowland
914f0967b0 Incrementing version to 0.9.23 2017-05-17 15:12:05 -07:00
Zsolt Ero
068b4534d4 prepare pre and post shudown.d folders (#407) 2017-05-11 17:13:49 +02:00
Zsolt Ero
2a8c9ebe38 apt-get fixes (#406)
* apt-fixes

* DEBIAN_FRONTEND teletype at the end
2017-05-09 11:39:43 +02:00
Zsolt Ero
7f77348a6b pre and post shutdown scripts added (#402) 2017-05-09 10:50:59 +02:00
Zsolt Ero
9f998e1a09 more pep8 linting (#400) 2017-05-09 09:52:48 +02:00
Travis Rowland
59d209cbe8 Merge pull request #399 from josegonzalez/patch-1
Improve pep8 compliance
2017-05-08 20:46:45 -07:00
Jose Diaz-Gonzalez
7022d31858 chore: remove all E501 updates 2017-05-08 17:41:25 -06:00
Jose Diaz-Gonzalez
263b582139 feat: add newline and enforce file encoding 2017-05-08 17:23:07 -06:00
Jose Diaz-Gonzalez
f7dfb05850 refactor: improve pep8 compliance
This changeset fixes PEP8 issues, minus `E501 line too long (80 > 79 characters)`, as that should be more of a guideline than a strict rule, and harder to follow without silly refactoring.

Also removed two unused exception variables.
2017-05-08 17:07:48 -06:00
Travis Rowland
8f7fcfec33 Merge pull request #396 from xmjiao/patch-1
Suppress the status reports from "sv -w"
2017-04-22 23:46:32 -07:00
Xiangmin Jiao
b2c329af51 Suppress the status reports from "sv -w" 2017-04-22 20:46:36 -04:00
Kingdon Barrett
f012793a75 Merge pull request #395 from phusion/fix-pam-build
fixes the build
2017-04-19 20:21:17 -04:00
Kingdon Barrett
d3af157387 fixes the build
pam sources are missing (they were in main)
2017-04-19 20:11:06 -04:00
Travis Rowland
9c934771ad Merge pull request #392 from tgranqvist/master
https://github.com/phusion/baseimage-docker/issues/391
2017-04-13 01:14:01 -07:00
Tom Granqvist
7f7b164d20 Merge pull request #1 from tgranqvist/tgranqvist-patch-1
Fixing bug in my_init.shutdown_runit_services
2017-04-13 11:09:37 +03:00
Tom Granqvist
06b065782d Fixing bug in my_init.shutdown_runit_services
The os.system() call received two arguments from a typo with string formatting.
2017-04-13 11:05:39 +03:00
Travis Rowland
287e96c811 Update Makefile
Incrementing version for next release.
2017-04-11 01:31:10 -07:00
Travis Rowland
a6fd9f8b56 Merge pull request #389 from phusion/next
Release 0.9.20
2017-04-11 01:22:41 -07:00
Travis Rowland
10d2364014 Update Makefile
Incrementing version
2017-04-11 01:08:24 -07:00
Travis Rowland
8af7692f62 Merge pull request #388 from optimisticanshul/patch-1
down wait for 7 secs this will fix it.
2017-04-11 00:59:08 -07:00
Anshul Sharma
ac382d47b8 down wait for 7 secs this will fix it. 2017-04-11 08:07:32 +05:30
Travis Rowland
a7b8b36359 Update Changelog.md
Removing CHANGELOG.md
2017-04-08 00:18:10 -07:00
Travis Rowland
41fbb91544 Merge pull request #385 from jsravn/fix-kill-timeouts
Fix kill timeouts
2017-04-07 03:52:41 -07:00
James Ravn
93477b34cc Update README.md 2017-04-07 11:45:55 +01:00
James Ravn
f706ea8d92 Add shutdown details to README 2017-04-07 11:44:20 +01:00
James Ravn
a5469e5572 Cast KILL*TIMEOUTS to int
As int is required by signal.alarm.
2017-04-07 11:36:31 +01:00
Travis Rowland
3801457f3a Merge pull request #383 from shooterman/chinese
Typo  chinese  translation
2017-04-01 19:00:00 -07:00
shooter
079464dc43 typo 2017-03-31 21:24:15 +08:00
shooter
8b99273eb6 typo
Make the sentence more smooth
2017-03-31 18:35:24 +08:00
shooter
3c0e09426d typo chinese translation
'负责' means 'responsible'
'复杂' means 'complex', metaphorical meaning  'too noisy'
2017-03-31 17:36:31 +08:00
Travis Rowland
48d3f310ad Merge pull request #382 from lucafavatella/syslog-ng-system
Correct translation of syslog-ng driver `system()` on Docker
2017-03-23 12:04:57 -07:00
Luca Favatella
45facca75e Correct translation of syslog-ng driver system() on Docker
According to [the stock Ubuntu 16.04
config](https://github.com/hyperknot/baseimage16/blob/1.0.1/image/services/syslog-ng/syslog-ng.conf.original#L21),
the default source driver is `system()`, that is documented in [the
syslog-ng 3.5 official
documentation](https://www.balabit.com/documents/syslog-ng-ose-3.5-guides/en/syslog-ng-ose-guide-admin/html-single/index.html#configuring-source-system)
on Linux as `unix-dgram("/dev/log");` with some `/proc/kmsg`
involvement if kernel "is version 3.5 or newer".

`/proc/kmsg` causes trouble on Docker hence using syslog-ng 3.5 on
Docker `unix-dgram("/dev/log")` shall be used (not
`unix-stream("/dev/log");`).

If using syslog-ng
[3.6](https://www.balabit.com/documents/syslog-ng-ose-3.6-guides/en/syslog-ng-ose-guide-admin/html-single/index.html#configuring-source-system)
or
[newer](https://www.balabit.com/documents/syslog-ng-ose-3.9-guides/en/syslog-ng-ose-guide-admin/html-single/index.html#configuring-source-system)
on Docker, `system()` shall be able to be used.  But [Ubuntu 16.04 is
at syslog-ng 3.5](http://packages.ubuntu.com/xenial/syslog-ng-core) so
`system()` cannot be used.

See also https://github.com/phusion/baseimage-docker/issues/277
2017-03-23 18:10:36 +00:00
Travis Rowland
3a315a1590 Merge pull request #380 from endersonmaia/preserve-some-build-files
Preserve /bd_build/{cleanup.sh,buildconfig} files. See #188
2017-03-22 14:47:35 -07:00
Enderson Maia
59677e23c3 Preserve /bd_build/{cleanup.sh,buildconfig} files. See #188
Signed-off-by: Enderson Maia <endersonmaia@gmail.com>
2017-03-22 14:41:18 -03:00
Travis Rowland
d2c7194aa4 Merge pull request #379 from kingdonb/next
Fix grammar
2017-03-21 12:07:33 -07:00
Kingdon Barrett
00034a9965 Fix grammar
Looks like a proofreading error
2017-03-21 09:26:00 -04:00
Travis Rowland
ce6a9e0dfc Merge pull request #378 from phusion/next
Release 0.9.20
2017-03-21 04:23:33 -07:00
Travis Rowland
17a5cede8c Incrementing version 2017-03-21 03:37:18 -07:00
Travis Rowland
f7bba93be3 Preserve /build/{cleanup.sh,buildconfig} files. See #188 2017-03-21 03:37:00 -07:00
Travis Rowland
6216f70411 Revert "Merge branch 'i386' into next"
This reverts commit 34408d8013, reversing
changes made to 5d80f284b0.
2017-03-21 03:15:25 -07:00
Travis Rowland
34408d8013 Merge branch 'i386' into next 2017-03-21 03:06:29 -07:00
Travis Rowland
5d80f284b0 Merge pull request #374 from romantic668/next
Update README.md
2017-03-21 02:49:26 -07:00
Travis Rowland
e3eeed2091 Merge pull request #376 from phusion/revert-188-preserve-some-build-scripts
Revert "Preserve /build/{cleanup.sh,buildconfig} files."
2017-03-21 02:48:11 -07:00
Travis Rowland
f9838ccce0 Revert "Preserve /build/{cleanup.sh,buildconfig} files." 2017-03-21 02:41:20 -07:00
romantic668
ce5038b2a7 Update README.md
Hi, I am doing a technical writing project. It is good practice to keep the writing concise. For example, I removed ...supposed to... Though it may lead to loss in meaning, readers will benefit from this concision. Hope it helps
2017-03-21 02:20:17 -07:00
Travis Rowland
c1d2b4bad8 Update README.md
Adding travis-ci badge to README.md
2017-03-21 01:49:54 -07:00
Travis Rowland
8f33bcf3d2 Create .travis.yml
Adding Travis-CI
2017-03-21 01:26:07 -07:00
Travis Rowland
ce2a25ddc0 Merge pull request #372 from phusion/next
Update README.md regarding ignored env vars.
2017-03-20 21:00:29 -07:00
Travis Rowland
7e02e426e5 Update README.md regarding ignored env vars.
Closes #119
2017-03-20 20:59:39 -07:00
Travis Rowland
cc1659b829 Merge pull request #371 from phusion/next
Updating README.md Fixes #228
2017-03-20 20:50:52 -07:00
Travis Rowland
5205fa04f7 Updating README.md Fixes #228 2017-03-20 20:48:24 -07:00
Travis Rowland
70e2551ca7 Merge pull request #369 from kingdonb/i386-next
WIP: fix libgc bug for i386 baseimage-docker
2017-03-20 20:37:33 -07:00
Kingdon Barrett
9fed983d80 services/cron sshd syslog-ng are all directories
rm -f balks at wiping them out
2017-03-21 03:17:24 +00:00
Kingdon Barrett
2a9860b120 packages don't exist and aren't build deps on i386 2017-03-21 03:07:34 +00:00
Kingdon Barrett
a09aae6dba fix libgc bug for i386 baseimage-docker 2017-03-21 02:40:54 +00:00
Travis Rowland
8c842a35d7 Merge pull request #188 from endersonmaia/preserve-some-build-scripts
Preserve /build/{cleanup.sh,buildconfig} files.
2017-03-20 12:43:06 -07:00
Enderson Maia
e019d5fa11 Preserve /build/{cleanup.sh,buildconfig} files.
These files are useful for those who create Docker images based on this
baseimage, and need to make a final cleanup and/or use some
configurations that are inside buildconfig file.
2017-03-20 09:35:54 -03:00
Travis Rowland
75784205cf Merge branch 'pavlobaron-master' into next 2017-03-19 16:18:16 -07:00
Travis Rowland
d9e762730a cleaning up getter/setter for KILL_PROCESS_TIMEOUT/KILL_ALL_PROCESSES_TIMEOUT 2017-03-19 16:17:52 -07:00
Travis Rowland
7ec5a0a65f Merge branch 'master' of https://github.com/pavlobaron/baseimage-docker into pavlobaron-master 2017-03-19 16:15:04 -07:00
Travis Rowland
5cc60221e6 Document selection of syslog-ng over rsyslog
Fixes #114
2017-03-19 01:57:18 -07:00
Travis Rowland
15e27eefe6 Merge pull request #363 from lukecampbell/setuser
Cleanup and improves readability of setuser
2017-03-19 01:32:30 -07:00
Travis Rowland
1c6b9f11d1 Merge pull request #354 from wangyuehong/master
fix typos for README_ZH_cn_.md and README_ZH_tw_.md
2017-03-19 01:30:40 -07:00
Travis Rowland
e12eeb8083 Merge pull request #352 from jedie/patch-2
README: "RUN chmod +x /etc/my_init.d/logtime.sh"
2017-03-19 01:29:46 -07:00
Travis Rowland
d8a7ca7a4d Merge branch 'next' into patch-2 2017-03-19 01:29:24 -07:00
Travis Rowland
96a2d92978 Merge pull request #351 from jedie/patch-1
README: "RUN chmod +x /etc/service/memcached/run"
2017-03-19 01:26:04 -07:00
Travis Rowland
67a0c6d121 Merge branch 'next' into patch-1 2017-03-19 01:25:43 -07:00
Travis Rowland
1811cb7530 Merge pull request #348 from milinnovations/fix_cron_pam
Provided a fix for cron not working out of the box.
2017-03-19 01:20:24 -07:00
Travis Rowland
fdda2d42bf Merge pull request #339 from zhouhaibing089/logrotate-fix
override the logrotate.conf without `su root syslog` Fixes #338
2017-03-19 01:07:02 -07:00
Travis Rowland
4e5a7e91ce Merge pull request #336 from axilleas/fix-locales
Reconfigure locales and expose them in Dockerfile
2017-03-19 01:04:14 -07:00
Travis Rowland
e89e07acb5 Merge pull request #334 from nawork/master
Removing -f option of `docker tag`
2017-03-19 01:01:55 -07:00
Travis Rowland
116cf0e2dd Merge pull request #209 from pbecotte/master
Add instructions for enabling sshd on the fly without permanently enabli...
2017-03-19 00:26:28 -07:00
Travis Rowland
241c41e093 Merge pull request #203 from UnrealQuester/copy
Use COPY instead of ADD
2017-03-19 00:21:29 -07:00
Luke Campbell
ffb22ecf60 Cleanup and improves readability of setuser 2017-02-24 12:03:53 -05:00
wangyuehong
7400c0b3b8 typo fix for README_ZH_cn_.md and README_ZH_tw_.md 2016-12-02 23:30:13 +09:00
Jens Diemer
4e80b8540a RUN chmod +x 2016-11-29 12:18:43 +01:00
Jens Diemer
9920d9d834 RUN chmod +x /etc/service/memcached/run is needed.
otherwise i get the error:
```
fatal: unable to start ./run: access denied
```
2016-11-29 12:05:34 +01:00
Matěj Týč
ac1211b0ed Provided a fix for cron not working out of the box. 2016-11-15 16:41:47 +01:00
Achilleas Pipinellis
bb3fef5377 Expose the locales in Dockerfile
While the locales are generated with locale-gen, this does not enforce
the en_US.UTF-8 locale inside the container.

See the following links for more information:

- https://github.com/docker/docker/issues/2424
- http://jaredmarkell.com/docker-and-locales/
2016-09-12 09:49:24 +02:00
zhouhaibing089
d3eceae5ef override the logrotate.conf without su root syslog 2016-09-12 10:49:28 +08:00
Andreas Elvers
ecdbe62eca Removing -f option of docker tag since this option is gone in docker 1.12.0. 2016-08-24 15:44:16 +02:00
Hongli Lai (Phusion)
24b8bcebc8 Fix 0.9.19 release date 2016-07-08 22:51:43 +02:00
Hongli Lai (Phusion)
096c0d4d2e Prepare for 0.9.19 release 2016-07-08 20:27:23 +02:00
Hongli Lai (Phusion)
ce8fc04b74 Add marketing blurb as suggested by GH-298 2016-07-08 20:25:11 +02:00
Hongli Lai (Phusion)
9001796aa8 Upon rotating /var/log/syslog, restart syslog-forwarder 2016-07-08 20:20:25 +02:00
Hongli Lai (Phusion)
c6cc1cb8e9 Credit Ernestas Lukoševičius 2016-07-08 20:17:21 +02:00
Ernestas Lukoševičius
50db81d8be Fix incorrect runit service name for syslog tail
Closes GH-292.
2016-07-08 20:16:33 +02:00
Hongli Lai (Phusion)
82862ec7f7 Do not set the APT force-unsafe-io flag
Docker already does this for us. Closes GH-265.
2016-07-08 20:09:24 +02:00
Hongli Lai (Phusion)
3edd5d1564 Fixes a problem in PAM which may cause chpasswd and related tools to fail
This is caused by Docker bug 6345 which is already closed, but for some
reason the problem still persists. Closes GH-181. Patch contributed
by Michael Zedeler.
2016-07-08 20:00:02 +02:00
Hongli Lai (Phusion)
6d5518974f Fix typo in my_init 2016-07-08 18:50:44 +02:00
Hongli Lai (Phusion)
a81f293bfb Update Ubuntu version mentions in READMEs 2016-07-08 18:42:03 +02:00
Hongli Lai (Phusion)
c93a14391a During shutdown, repeatedly tell Runit to shutdown services
Works around a potential race condition in Runit itself.
Closes GH-315. Thanks to Chris Kite for submitting this patch.
2016-07-08 18:37:03 +02:00
Hongli Lai (Phusion)
1f39ac326f Update Changelog 2016-07-08 18:07:54 +02:00
Hongli Lai (Phusion)
823ff30f36 Merge pull request #284
Changes to upgrade this to Ubuntu-16.04
2016-07-08 18:05:58 +02:00
Pierre Jacomet
e436d1c4af Changes to upgrade this to Ubuntu-16.04 2016-04-28 19:10:08 -07:00
Hongli Lai
5f0849ba4b Merge pull request #284 from BlackGlory/patch-1
Remove the original content has been translated
2016-04-06 15:00:25 +02:00
BlackGlory
3fe0878edb Remove the original content has been translated 2016-02-05 19:10:19 +08:00
pavlobaron
ea6b0ace79 configure process kill timeouts through environment with fallbacks 2016-01-22 09:49:48 +01:00
Alexander Buddenbrock
17eadef537 Use COPY instead of ADD
While COPY and ADD are essentially interchangeable here, it is still
considered good practice to use COPY whenever possible. From the docker
docks on best practices:

"Although ADD and COPY are functionally similar, generally speaking,
COPY is preferred. That’s because it’s more transparent than ADD.
[...] For other items (files, directories) that do not require ADD’s tar
auto-extraction capability, you should always use COPY."

Additionally, ADD commands were not cached prior to 0.7.3 (which was
released on 2013-01-02).
2015-12-14 21:34:23 +01:00
Hongli Lai (Phusion)
8ec76f25ca Update Changelog 2015-12-08 12:32:52 +01:00
Hongli Lai (Phusion)
6052c7a3e7 Merge branch 'next' 2015-12-08 12:31:34 +01:00
Hongli Lai (Phusion)
bfd971a084 Fix test runner: obtain container IP with 'docker inspect' 2015-12-08 12:25:42 +01:00
Hongli Lai (Phusion)
d141556910 Bump version to 0.9.18 2015-12-08 12:01:06 +01:00
Hongli Lai (Phusion)
19d67d820c Update Changelog 2015-12-08 11:59:53 +01:00
Hongli Lai
14ec533a16 Merge pull request #235 from endersonmaia/PR-182-fix
Fixed bug introduced in PR-182
2015-07-16 09:01:32 +02:00
Hongli Lai
784d9837ee Merge pull request #236 from endersonmaia/fix-README
Fix README changed on PR-182
2015-07-15 22:44:28 +02:00
Enderson Maia
d3f2382c73 Fix README changed on PR-182
There no point in changing the build process of an image based on this
baseimage, since the services would be already installed (or note) on
the original image. The point for optional services installation is
just useful when build your own image based on this baseimage source
repository, change the `image/buildconfig` file.
2015-07-15 17:34:35 -03:00
Enderson Maia
e053f04cf6 Fixed bug introduced in PR-182
If you disable the installation of all services, you could have a != 0
output, and break the `docker build` process.
2015-07-15 17:31:01 -03:00
Hongli Lai (Phusion)
bbc639b372 Update imagelayers.io image: show size for 0.9.17 2015-07-15 22:17:08 +02:00
Hongli Lai (Phusion)
f8c4992d03 Touch README.md to refresh imagelayers.io image 2015-07-15 22:14:36 +02:00
Hongli Lai (Phusion)
567a53db24 Note 0.9.17 release date 2015-07-15 21:55:24 +02:00
Hongli Lai (Phusion)
850d7374c4 Update Changelog 2015-07-15 21:54:42 +02:00
Hongli Lai (Phusion)
c1ed635f33 Merge branch 'endersonmaia-optional-default-services' into next 2015-07-15 21:08:48 +02:00
Enderson Maia
9adbd423d0 Made services installation optional during build
You can user `ENV` directive in Dockerfile to disable the installation
for some services or change `image/buildconfig`.

The flags are :

DISABLE_SSHD
DISABLE_CRON
DISABLE_SYSLOG
2015-07-15 15:03:33 -03:00
Hongli Lai (Phusion)
7425da2825 Fix a potential hang in my_init during shutdown
Thanks to SAPikachu. Closes GH-151.
2015-07-15 17:35:45 +02:00
Hongli Lai (Phusion)
23d0a30e59 Update copyright statement 2015-07-15 17:01:34 +02:00
Hongli Lai
6ec9f8ca59 Merge pull request #234 from endersonmaia/patch-1
Provide information about image size
2015-07-15 16:25:46 +02:00
Enderson Tadeu S. Maia
6b09bb736f Provide information about image size 2015-07-15 11:20:49 -03:00
Hongli Lai (Phusion)
06b010919b Update Changelog 2015-07-15 16:18:46 +02:00
Hongli Lai (Phusion)
c56b1a332f Document the fact that 0.9.17 fixes OpenSSL CVE-2015-1793 2015-07-15 15:49:33 +02:00
Hongli Lai (Phusion)
afb0835328 Add OS upgrade instructions 2015-07-15 15:46:03 +02:00
Hongli Lai (Phusion)
a9e956d9f9 syslog-ng: do not forward messages to /dev/tty10
Closes GH-222.
2015-07-15 15:27:03 +02:00
Hongli Lai (Phusion)
43af4a393e my_init container_environment.sh: ensure that environment variable names don't include characters unsupported by Bash
Closes GH-230.
2015-07-15 15:12:18 +02:00
Hongli Lai (Phusion)
b72ef2eba3 Remove nano, replace VIM with vim-tiny
This reduces the virtual size by 42 MB.
2015-07-15 15:02:13 +02:00
Hongli Lai (Phusion)
404832ba47 Remove some unnecessary cron jobs
Closes GH-205.
2015-07-15 14:52:41 +02:00
Hongli Lai (Phusion)
ee56097511 Bump version to 0.9.17 2015-07-15 14:37:27 +02:00
Hongli Lai (Phusion)
f57320388c Get rid of default HOME environment variable
Closes GH-231.
2015-07-15 14:36:10 +02:00
Hongli Lai (Phusion)
e575443aba my_init: do not use /etc/container_environment if directory doesn't exist 2015-07-15 14:33:15 +02:00
Hongli Lai (Phusion)
9e65ebfbdc Rename /build to /bd_build for fewer AUFS layer collissions 2015-07-15 14:28:55 +02:00
Hongli Lai
68a94437d9 Merge pull request #226 from metavige/master
增加正體中文 README
2015-06-05 17:48:16 +02:00
metavige
f7beb9218c 增加正體中文 README 2015-06-05 22:46:57 +08:00
Hongli Lai
2761d369d3 Merge pull request #220 from OhCoder/revised-chinese-readme
Revised chinese readme
2015-05-26 16:32:18 +02:00
OhCoder
196d44590f fix some duplicated words 2015-05-22 01:28:21 +08:00
OhCoder
c5daad6a18 fix a worng Chinese word. 2015-05-21 23:02:52 +08:00
OhCoder
9089485fb6 revised the overview table 2015-05-21 22:44:47 +08:00
OhCoder
e54970d76c update table of contents 2015-05-21 21:08:40 +08:00
Hongli Lai
b3232acad0 Merge pull request #218 from OhCoder/master
Revise the README_ZH_cn version
2015-05-20 22:44:26 +02:00
OhCoder
ffe8b447ca update Docker link 2015-05-20 22:46:20 +08:00
OhCoder
7bc3d1252d merge the newest version 2015-05-20 22:38:03 +08:00
OhCoder
2a9cccff16 update the paragraphs above the menu. 2015-05-20 22:19:05 +08:00
OhCoder
e1848ec817 modify the exclamation mark 2015-05-20 21:15:24 +08:00
OhCoder
a898aa51b9 modify the first paragraph 2015-05-20 21:13:14 +08:00
OhCoder
cf48520dba remove the blank space between English words and Chinses words from the first paragraph 2015-05-20 21:09:44 +08:00
OhCoder
1ab802c396 add the *swp file in the .gitignore file 2015-05-20 21:04:37 +08:00
OhCoder
b931dc5a47 remove *swp file 2015-05-20 21:03:01 +08:00
OhCoder
25f48b847d modify the first paragraph. 2015-05-20 21:02:09 +08:00
Daniel Knoppel (Phusion)
d04ad47930 Avoid suggesting that there should be a comment line before the shebang. 2015-05-20 09:44:52 +02:00
Paul Becotte
45c57234d7 Add instructions for enabling sshd on the fly without permanently enabling it in the dockerfile to the README 2015-04-02 11:36:39 -04:00
Hongli Lai
c983f03960 Merge pull request #197 from temoto/patch-3
syslog-forwarder continue after logrotate
2015-02-20 13:07:22 +01:00
Sergey Shepelev
eb23de21d9 syslog-forwarder continue after logrotate
tail -F to continue reading new /var/log/syslog
2015-02-20 00:44:38 +03:00
Hongli Lai
3a5afa485a Merge pull request #194 from bukzor/editorconfig
editorconfig helps me match your style
2015-02-10 16:39:19 +01:00
Buck Golemon
efd9a67a79 editorconfig helps me match your style, and avoid repeated python whitespace errors 2015-02-06 13:13:20 -08:00
Hongli Lai (Phusion)
5eeb176bd0 No longer recommend setting 'ENV HOME' in Dockerfile
This is because https://github.com/docker/docker/issues/2968 has been fixed.
2015-01-26 17:15:49 +01:00
Hongli Lai
3678d6d92a Merge pull request #185 from oadam/patch-1
Update README.md
2015-01-23 17:21:36 +01:00
Olivier Adam
795f12a554 Update README.md 2015-01-23 17:18:35 +01:00
Hongli Lai (Phusion)
4f52a9c6a4 Link to the PID 1 problem article 2015-01-20 13:23:53 +01:00
Hongli Lai (Phusion)
1812fbf093 Note 0.9.16 release date 2015-01-20 11:40:15 +01:00
Hongli Lai (Phusion)
65e212f235 When uploading new release, run 'docker tag' with '-f' 2015-01-20 11:39:50 +01:00
Hongli Lai (Phusion)
bc40f72c84 Update documentation 2015-01-20 11:14:53 +01:00
Hongli Lai (Phusion)
4a41a00697 Merge branch 'reduce-dockerfile-steps' of git://github.com/kanzure/baseimage-docker into kanzure-reduce-dockerfile-steps 2015-01-20 11:04:49 +01:00
Hongli Lai (Phusion)
d85b76dfd9 Update URLs in the README, add translation note 2015-01-20 10:52:48 +01:00
Hongli Lai (Phusion)
a0e2a13b0a Merge branch 'master' into next 2015-01-20 10:50:13 +01:00
Hongli Lai
c1c5e70dd5 Merge pull request #156 from zhaopengme/master
Add Chinese translation of the README
2015-01-20 10:49:23 +01:00
Hongli Lai (Phusion)
6e55e3d515 Redirect syslog to 'docker logs' and fix cron
Closes GH-123. Closes GH-115.
2015-01-19 18:07:15 +01:00
Hongli Lai (Phusion)
0b2de757f5 Fixed some locale issues
Closes GH-178. Thanks to David J. M. Karlsen.
2015-01-19 17:32:05 +01:00
Hongli Lai (Phusion)
9b08ea9cd4 Logrotate now reloads syslog-ng properly
Closes GH-167.
2015-01-19 16:55:09 +01:00
Hongli Lai (Phusion)
2640bc7b03 Make 'docker exec' the default and disable SSH by default
Closes GH-168.
2015-01-19 16:40:17 +01:00
Hongli Lai (Phusion)
a0a48d8fd3 Merge branch 'remove_etc_hosts_workaround' into next 2015-01-19 16:01:53 +01:00
Hongli Lai (Phusion)
d9023071e4 Bump version to 0.9.16 2015-01-19 16:00:13 +01:00
Hongli Lai (Phusion)
8f2877c806 Do not set APT's force-unsafe-io option because the latest ubuntu image already does that 2015-01-17 14:32:41 +01:00
Hongli Lai (Phusion)
19c2df66b3 Remove workaround for Docker bug #2267 now that Docker has fixed this
Closes GH-155.
2015-01-16 16:50:39 +01:00
Hongli Lai (Phusion)
ea56d35011 Update README 2015-01-16 14:29:19 +01:00
Hongli Lai (Phusion)
e77d34aedf Clarify our stand point on running multiple processes and fat containers 2015-01-16 14:27:24 +01:00
Bryan Bishop
81af926a78 remove Dockerfile step for mkdir /build
The ADD command will create /build automatically, so the RUN mkdir step
can be safely removed. Also, this has the benefit of reducing the number
of steps in the Dockerfile which is helpful for not as quickly hitting
the 127 layer limit.
2014-11-24 10:56:23 -06:00
mikey.zhaopeng
c4385735af add the Chinese translation 2014-10-24 08:53:28 +08:00
Hongli Lai (Phusion)
e54a443cca Fix setuid bit on /usr/bin/sudo, bump version to 0.9.15.
Closes GH-148.
2014-10-03 12:37:00 +02:00
Hongli Lai (Phusion)
4db83076bd Bump version to 0.9.14 2014-10-01 11:00:21 +02:00
Hongli Lai (Phusion)
fc74a85e5d Update Changelog 2014-10-01 11:00:04 +02:00
Hongli Lai
04173bb162 Merge pull request #142 from andreamtp/patch-1
Update README.md
2014-09-20 14:47:39 +02:00
andreamtp
715a6eebde Update README.md
updated link to the Changelog of the master branch instead of nsenter
2014-09-20 14:42:09 +02:00
Hongli Lai (Phusion)
2d2c13b519 Note 0.9.13 release date 2014-08-22 18:10:34 +02:00
Hongli Lai (Phusion)
2135d2192e Update Changelog 2014-08-22 18:03:35 +02:00
Hongli Lai
ae652517e8 Merge pull request #129 from kingdonb/master
syslog-ng.ctl left around after commit
2014-08-22 16:49:00 +02:00
Kingdon Barrett
212e080b58 syslog-ng.ctl left around after commit
For phusion/baseimage#128
2014-08-07 15:15:07 -04:00
Hongli Lai
97e256cc61 Merge pull request #124 from arkadijs/master
Correct typo
2014-08-04 15:06:34 +02:00
Arkadi Shishlov
f0514872ea Correct typo 2014-08-04 14:51:28 +03:00
Hongli Lai (Phusion)
0de8640bac Change the docker_env group ID from 1000 to 8377. 2014-07-25 14:49:06 +02:00
Hongli Lai (Phusion)
5e5794c528 Bump version to 0.9.13 2014-07-25 14:38:01 +02:00
Hongli Lai (Phusion)
9be2ee2916 Fix my_init not properly exiting with a non-zero exit status when Ctrl-C is pressed. 2014-07-25 14:37:03 +02:00
Hongli Lai (Phusion)
a0d4877272 When releasing, throw an error if the release date isn't noted in Changelog.md 2014-07-17 10:16:23 +02:00
Hongli Lai (Phusion)
a06da035d0 Note 0.9.12 release date 2014-07-17 10:14:01 +02:00
Hongli Lai (Phusion)
d55fa363bf Update changelog 2014-07-16 21:07:59 +02:00
Hongli Lai (Phusion)
eb189e7864 Officially support nsenter 2014-07-16 21:07:49 +02:00
Hongli Lai (Phusion)
7fd667bc1f Update Changelog 2014-07-13 23:59:40 +02:00
Hongli Lai
5106ffd4b1 Merge pull request #105 from bubenkoff/patch-1
Allow X11 forwarding and remove invalid xauth location
2014-07-13 23:58:19 +02:00
Hongli Lai (Phusion)
3526928ad9 Update README 2014-07-13 23:09:52 +02:00
Hongli Lai (Phusion)
9cf192ca02 Fix mistake in changelog 2014-07-13 23:06:05 +02:00
Hongli Lai (Phusion)
25e8b1c535 Make docker-bash work on a regular sh shell instead of bash.
Closes GH-103.
2014-07-13 12:50:16 +02:00
Hongli Lai (Phusion)
2fa47a225b Update Readme 2014-07-13 01:31:14 +02:00
Hongli Lai (Phusion)
b9d75d899d Fix documentation order 2014-07-13 01:12:04 +02:00
Hongli Lai (Phusion)
1f38e2226e Added a workaround for Docker's inability to modify /etc/hosts in the container.
See Docker bug 2267: https://github.com/dotcloud/docker/issues/2267
2014-07-13 00:49:05 +02:00
Hongli Lai (Phusion)
291b9aae02 Bump version to 0.9.12 2014-07-13 00:49:05 +02:00
Hongli Lai (Phusion)
75902437c9 Move scripts into bin directory 2014-07-13 00:49:04 +02:00
Hongli Lai
73d900dece Merge pull request #106 from mephi42/master
my_init: use stderr for all logs

Useful when you want to run tar within the container and pipe the archive to host.
2014-07-03 11:36:04 +02:00
mephi42
669435158f my_init: use stderr for all logs
Useful when you want to run tar within the container
and pipe the archive to host.
2014-07-02 19:12:42 -04:00
Anatoly Bubenkov
a32cbb7808 remove explicit xauth location
Change allows to connect by ssh using X11 forwarding from linux host, otherwise you get
debug1: Remote: No xauth program; cannot forward with spoofing.
2014-07-02 16:04:37 +02:00
Hongli Lai
070245feb8 Merge pull request #97 from dgoujard/master
Update doc with more informations in ssh section
2014-06-24 17:07:46 +02:00
Hongli Lai (Phusion)
f58282d4d3 Note release date 2014-06-24 16:40:22 +02:00
Hongli Lai (Phusion)
e6258b37b5 Give credit to Brant Fitzsimmons 2014-06-24 16:39:56 +02:00
Hongli Lai
71ce2a6d9d Merge pull request #98 from bfitzsimmons/patch-1
Fixed typo.
2014-06-23 19:09:11 +02:00
Brant Fitzsimmons
08d5b93095 Fixed typo. 2014-06-23 12:56:26 -04:00
Damien Goujard
7d2bdfe67e Update doc with more informations in ssh section 2014-06-22 09:39:59 +02:00
Hongli Lai
d0e63da07b Merge pull request #86 from imanel/patch-2
Don't write HOME env variable
2014-06-20 13:45:36 +02:00
Bernard Potocki
2beb0e253e Change break to continue 2014-06-20 12:38:17 +02:00
Hongli Lai (Phusion)
0302713554 Update documentation 2014-06-20 11:33:10 +02:00
Hongli Lai
7ac6795aa5 Merge pull request #84 from imanel/patch-1
Preserve ENV variables for SSH client
2014-06-20 11:28:27 +02:00
Hongli Lai
feab2fce75 Merge pull request #94 from pda/stderr-not-proctitle
my_init: runsvdir no longer redirects stderr to proctitle.
2014-06-20 11:26:39 +02:00
Paul Annesley
3019bbf09b my_init: runsvdir no longer redirects stderr to proctitle.
As described at http://smarden.org/runit/runsvdir.8.html passing a log
option to runsvdir causes stderr to be redirected to the proctitle.

That prevents stderr from reaching docker logs, which is a big problem.
2014-06-18 09:38:52 -07:00
Bernard Potocki
18a7fe26ec Add USER, GROUP, UID, GID and SHELL to restricted env variables 2014-06-18 17:29:02 +02:00
Bernard Potocki
b9d788611a Update readme 2014-06-18 17:13:44 +02:00
Bernard Potocki
1357e9399e Add docker_env group and make container_environment scripts group-readable 2014-06-18 17:10:35 +02:00
Hongli Lai (Phusion)
ba1e1ffbf5 Fix an anchor in the README 2014-06-17 17:41:20 +02:00
Hongli Lai (Phusion)
0b468fb61b Introduce the docker-bash tool.
This is a shortcut tool for logging into a container using SSH. Usage: `docker-bash <CONTAINER_ID>`.
2014-06-17 17:40:34 +02:00
Hongli Lai
9db4f43b74 Merge pull request #93 from qerub/ipaddress
Use Go template instead of grep to extract container IP address
2014-06-17 14:40:05 +02:00
Hongli Lai (Phusion)
5806f51ea3 Fixed various process waiting issues in my_init.
Closes GH-27. Closes GH-82. Closes GH-83.
Thanks to André Luiz dos Santos and Paul Annesley.
2014-06-17 14:35:05 +02:00
Hongli Lai (Phusion)
c431f2d151 Update Changelog 2014-06-17 13:27:03 +02:00
Hongli Lai
76100b639a Merge pull request #88 from jeckhart/fix-syslogng-runit-run
Missing target of chown in syslog-ng runit run file
2014-06-17 13:15:20 +02:00
Hongli Lai
ecf6e6b226 Merge pull request #90 from yebyen/patch-1
needed for insecure key usage
2014-06-17 13:03:48 +02:00
Hongli Lai (Phusion)
92c2ea22ed Install add-apt-repository.
Closes GH-74.
2014-06-17 12:46:14 +02:00
Hongli Lai (Phusion)
436be20ff0 Bump version to 0.9.11 2014-06-17 12:45:24 +02:00
Christoffer Sawicki
f445cafe03 Use Go template instead of grep to extract container IP address 2014-06-16 14:20:46 +02:00
Hongli Lai
93572a5698 Update CONTRIBUTING.md
Fix link
2014-06-16 12:41:42 +02:00
Hongli Lai
f5efca365c Create CONTRIBUTING.md 2014-06-16 12:41:13 +02:00
yebyen
949bd1d89f needed for insecure key usage
`chmod 600` is for the benefit of ssh client, which will otherwise spew:

```
chmod 600 image/insecure_key.pub
SSHing into 172.17.0.2
Warning: Permanently added '172.17.0.2' (ECDSA) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0664 for 'image/insecure_key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: image/insecure_key
```

As you can see though, the wrong file is `chmod`'ed -- it's the private key that SSH will insist should be protected with a more restrictive mode.

After this, `CMD ["/sbin/my_init", "--enable-insecure-key"]` works as expected.
2014-06-09 12:32:52 -04:00
John Eckhart
2b339a3344 Missing target of chown 2014-06-04 02:10:00 -04:00
Bernard Potocki
b665b78454 Make container_envoriments.sh and .json readable by other users
Prevents bug when loading env variables on non-root user login.
2014-06-02 15:06:02 +02:00
Bernard Potocki
5b403fe06c Don't write HOME env variable
Loading HOME variable breaks multi-user container (i.e. logging as postgres user) if you try to load variables via `/etc/container_environment.sh`.
2014-06-02 15:03:49 +02:00
Bernard Potocki
1a6c43b8d7 Preserve ENV variables for SSH client
Currently when you ssh to host you will not see ENV variables set. This was mentioned earlier in #54 and solution is tested.

Additional rationale: currently you can't see docker link ENV variables inside ssh, so you need to load this file every time you connect to container. I would say that expected behavior is to preserve them in services that are provided at default (cron/ssh)
2014-06-02 00:11:24 +02:00
Hongli Lai
0325abf74e Changelog.md now explicitly mentions that the latest version is not yet released 2014-05-16 14:17:15 +02:00
Hongli Lai (Phusion)
22c3d60d94 Install ca-certificates package 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.
2014-05-12 23:07:17 +02:00
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
Hongli Lai (Phusion)
5ae32384d5 Document 0.9.9 release date 2014-03-25 17:18:16 +01:00
Hongli Lai (Phusion)
f55fde8d99 Fix a bug in the build process 2014-03-25 17:06:53 +01:00
Hongli Lai (Phusion)
0632b4865b Set the INITRD env variable and make 'ischroot' always return true.
This prevents initramfs and initscripts updates from breaking.
2014-03-25 16:44:33 +01:00
Hongli Lai (Phusion)
7914d8ac55 Enable more Ubuntu APT repositories. 2014-03-25 16:44:29 +01:00
Hongli Lai (Phusion)
73709ed0a0 During 'docker build', temporarily disable dpkg fsync to make it faster 2014-03-25 16:22:04 +01:00
Hongli Lai (Phusion)
dfaac83527 Run 'docker build' with '--rm' instead of '-rm', the latter which has been deprecated in Docker 0.9. 2014-03-25 15:49:46 +01:00
Hongli Lai (Phusion)
e11f2b8cfd Bump version to 0.9.9 2014-03-25 15:49:16 +01:00
Hongli Lai (Phusion)
fa3098206d Update Changelog 2014-03-25 15:48:05 +01:00
Hongli Lai (Phusion)
ad347d91c8 Merge branch 'amirgur1-master' 2014-03-25 15:37:18 +01:00
Hongli Lai (Phusion)
55727c2f30 Cleanup Amir Gur's patch 2014-03-25 15:36:15 +01:00
Hongli Lai (Phusion)
c8e79991b7 Merge branch 'master' of https://github.com/amirgur1/baseimage-docker into amirgur1-master 2014-03-25 15:30:00 +01:00
Hongli Lai
a03b58d94d Merge pull request #42 from rhacker/patch-1
Fix typo in Makefile
2014-03-19 10:49:41 +01:00
Dung Quang
ed89f20836 Update Makefile 2014-03-19 09:14:34 +07:00
Hongli Lai (Phusion)
fd8a1273ad Update Changelog 2014-03-17 12:59:03 +01:00
Hongli Lai
4094d20cec Merge pull request #38 from slawo-ch/patch-1
properly specify location of sftp-server binary
2014-03-17 12:57:51 +01:00
Slawomir Chodnicki
585932c74c properly specify location of sftp-server binary
Currently there is a symlink at /usr/lib/sftp-server to /usr/lib/openssh/sftp-server in the image. That seems to give trouble with packages like the rssh restricted shell, which will not follow a symlink to the sftp server binary for security reasons. So currently it is not possible to use this image as a basis for scp/sftp only access over ssh.
2014-03-15 18:08:28 +01:00
Hongli Lai
3366687e86 Merge pull request #35 from Laurent-Sarrazin/patch-1
Fix a typo
2014-03-14 11:54:15 +01:00
Laurent Sarrazin
b749352f1e Fix a typo 2014-03-12 23:27:50 +01:00
Hongli Lai
25d9972c0b Merge pull request #34 from felixhummel/typo
rw is enough for the insecure_key
2014-03-11 15:12:13 +01:00
Felix Hummel
5b1b6e8364 rw is enough for the insecure_key 2014-03-11 13:15:59 +01:00
Hongli Lai
0dab5aa4c8 Merge pull request #30 from ruphin/master
typo fix
2014-03-06 12:52:15 +01:00
Amir Gur
2ef5fa1659 * More Parametrization, example.
* All synced_folders are included.
 * Vagrantfile of baseimage and passenger are nearly identical now.  (I got to that when wanting to try passenger.  But already had a vagrant box started from baseimage, there was no need to dup the effort, just reuse the existing single box for all.  Then in end of day, may not need multiple Vagrantfiles.  Passenger is a simple structure/process for managing dockers, but only needing to use baseimage once and have one VM up)
2014-03-06 02:28:27 -08:00
Goffert van Gool
17cb4cebca typo fix 2014-03-06 02:54:37 +01:00
Amir Gur
ac7f9b0785 - Parametrized passenger-docker location 2014-03-04 14:33:57 -08:00
Amir Gur
d06b177508 - Parametrize
- Print docker version
- Add a d alias to docker
- Cleanup
2014-03-03 18:39:28 -08:00
Hongli Lai (Phusion)
775ded05dc Fix permissions on test scripts 2014-02-26 11:56:19 +01:00
Hongli Lai (Phusion)
cc9847580d Document release date 2014-02-26 11:56:10 +01:00
Hongli Lai (Phusion)
46334c7363 Bump version to 0.9.8 2014-02-26 11:44:19 +01:00
Hongli Lai (Phusion)
1684aa1448 Fix my_init not properly forcing Runit to shut down if Runit appears to refuse to respond to SIGTERM. 2014-02-25 22:49:34 +01:00
Hongli Lai (Phusion)
367cddb201 Fix a regression in my_init which causes it to delete environment variables passed from Docker. 2014-02-25 22:08:37 +01:00
Hongli Lai (Phusion)
27782aca39 Note release date in Changelog.md 2014-02-25 15:21:57 +01:00
Hongli Lai (Phusion)
4e60438c66 Fixed some warnings in 00_regen_ssh_host_keys.sh. 2014-02-25 15:18:28 +01:00
Hongli Lai (Phusion)
ec719ad255 Small documentation updates regarding environment variables 2014-02-25 13:37:55 +01:00
Hongli Lai (Phusion)
23651ad5ff Cleanup Changelog 2014-02-25 12:48:21 +01:00
Hongli Lai (Phusion)
300adc0bf2 Store environment variables in a file, and allow init scripts to change environment variables.
Closes GH-23.
2014-02-25 12:47:02 +01:00
Hongli Lai (Phusion)
c0e872b3e3 Credit Dr Nic and Tomer Cohen. 2014-02-25 11:21:42 +01:00
Hongli Lai (Phusion)
87698aa223 Added the logrotate service. Fixes GH-22. 2014-02-25 11:18:25 +01:00
Hongli Lai (Phusion)
68e4f5e8bf Removed some default Ubuntu cron jobs which are not useful in Docker containers. 2014-02-25 11:16:09 +01:00
Hongli Lai (Phusion)
8cf30f326e Change the documented way to start a shell: run bash through my_init 2014-02-25 11:09:56 +01:00
Hongli Lai (Phusion)
9af37c0d58 Fixed syslog-ng not being able to start because of a missing afsql module.
Closes pull request 7.
2014-02-25 11:07:54 +01:00
Hongli Lai (Phusion)
095c1e715c Add a Changelog entry that documents why all EXPOSEd ports are now removed. 2014-02-25 10:52:11 +01:00
Hongli Lai (Phusion)
aa46e10163 Remove all EXPOSEd ports. Fixes GH-15. 2014-02-25 10:49:08 +01:00
Hongli Lai (Phusion)
5e9f60b0ea Update documentation regarding the insecure key. 2014-02-25 10:45:55 +01:00
Hongli Lai (Phusion)
139bc7b81e Merge branch 'feature/16' of https://github.com/thomasleveil/baseimage-docker into thomasleveil-feature/16 2014-02-25 10:30:30 +01:00
Hongli Lai
3d5a46482f Merge pull request #20 from thomasleveil/fix/failed-shutdown-msg
Fix failed shutdown message not displaying process name and PID
2014-02-24 13:23:04 +01:00
Hongli Lai
6d1a12673b Merge pull request #21 from thomasleveil/fix/unbuffered-stdout
Fix log not showing messages sent to stdout by my_init
2014-02-24 13:21:43 +01:00
Thomas LÉVEIL
55efefa51b fix log not showing messages sent to stdout by my_init 2014-02-22 17:16:55 +01:00
Thomas LÉVEIL
1443856c34 fix failed shutdown message not displaying process name and PID 2014-02-22 16:36:41 +01:00
Thomas LÉVEIL
bf35ff2bf1 allow to install the insecure key with the new --enable-insecure-key option
fix #16
2014-02-22 16:30:08 +01:00
Thomas LÉVEIL
7bd55402b0 do not remove already installed private keys when installing the secure key 2014-02-22 14:26:48 +01:00
Hongli Lai
1c560d073d Merge pull request #17 from thomasleveil/master
Add the insecure private key in the PuTTY format
2014-02-21 01:21:26 +01:00
Thomas LÉVEIL
3eec5201da Update README.md
to add the download link to the insecure private key in the PuTTY format
2014-02-21 01:10:21 +01:00
Thomas LÉVEIL
02c42206ec Create insecure_key.ppk
as a convenience for PuTTY/WinSCP users
2014-02-21 01:07:52 +01:00
Hongli Lai (Phusion)
3125ec683b Add instructions regarding disabling SSH. 2014-02-20 13:43:03 +01:00
Hongli Lai (Phusion)
829d753a88 Fix typos in the insecure key documentation 2014-02-19 17:15:48 +01:00
Hongli Lai
91a6b2d7a2 Merge pull request #13 from tomer/patch-1
Fix link [reap them] in README.md
2014-02-19 17:13:38 +01:00
Hongli Lai
636444612f Merge pull request #12 from drnic/patch-1
Fix typo in changelog: not -> now
2014-02-19 17:11:17 +01:00
Tomer Cohen
a131b126f5 Fix link [reap them] in README.md 2014-02-19 12:10:17 +02:00
Dr Nic Williams
cb700ed590 not -> now
I'm just guessing... its "now much faster" rather than "not much faster" :)
2014-02-18 16:14:11 -08:00
Hongli Lai (Phusion)
0caf8692fb Update Changelog 2014-02-17 12:01:09 +01:00
Hongli Lai (Phusion)
d8968d136a Improve setuser: set auxilliary groups and more environment variables 2014-02-15 12:42:31 +01:00
Hongli Lai (Phusion)
b6dac86e04 Improve the init system: support skipping startup files and running a custom main command 2014-02-15 12:11:48 +01:00
Hongli Lai (Phusion)
d884118827 Add a 'make ssh' task for easily SSHing into the container 2014-02-13 15:37:35 +01:00
Hongli Lai (Phusion)
c22f8804ad Correctly reap child processes that are adopted during invocation of init scripts. 2014-02-13 15:37:32 +01:00
Hongli Lai (Phusion)
67c6b089e3 Bump version to 0.9.6 2014-02-13 15:37:32 +01:00
Hongli Lai (Phusion)
7e35fe7f32 Update Changelog 2014-02-06 14:00:18 +01:00
Hongli Lai (Phusion)
37cd856425 Disable the insecure SSH key by default 2014-02-06 13:40:27 +01:00
Hongli Lai (Phusion)
a5f521b1b1 Change the name inside the insecure key 2014-02-06 13:06:40 +01:00
Hongli Lai (Phusion)
e833b26944 Bump version to 0.9.5 2014-02-06 13:06:23 +01:00
Hongli Lai (Phusion)
4ab0625de0 Update README 2014-02-06 12:36:06 +01:00
Hongli Lai (Phusion)
a8db7a386f Update Changelog 2014-02-06 12:32:39 +01:00
Hongli Lai (Phusion)
f0fbe3ffc8 Use setuser instead of chpst in the memcached example for consistency. Closes GH-8 2014-02-06 12:31:07 +01:00
Hongli Lai
4a6ee64b63 Merge pull request #6 from yukonlabs/master
Bypass runsvdir-start in order to preserve env
2014-02-06 12:30:51 +01:00
Matt Olson
892dcc7ca4 Bypass runsvdir-start in order to preserve env
runsvdir-start clears the environment, which wipes out any
environment variables passed in when the container starts.
This patch bypasses runsvdir-start and calls runsvdir directly,
preserving the current environment.
2014-02-05 11:52:48 -08:00
Hongli Lai (Phusion)
c844956bab Release 0.9.4 2014-02-03 17:07:09 +01:00
Hongli Lai (Phusion)
3e14c92e21 Bump version to 0.9.4 2014-02-03 17:03:44 +01:00
Hongli Lai (Phusion)
6786e7350d Fixed syslog-ng startup problem 2014-02-03 17:03:39 +01:00
Hongli Lai (Phusion)
b17412ef7c Run tests on release 2014-02-03 17:02:59 +01:00
Hongli Lai (Phusion)
1463b81942 Add unit tests 2014-02-03 17:01:11 +01:00
Hongli Lai (Phusion)
64c7d8be7c Update README 2014-02-02 13:32:39 +01:00
Hongli Lai (Phusion)
06e46b93cf Update README 2014-02-02 13:31:51 +01:00
Hongli Lai (Phusion)
b297ae8b42 Add table of contents to README. 2014-02-01 11:33:34 +01:00
Hongli Lai (Phusion)
017c6c22d5 Add a Changelog entry documenting the SSH host key change 2014-02-01 11:10:23 +01:00
Hongli Lai (Phusion)
74a4a9abf4 Note release date for 0.9.3 2014-02-01 11:08:39 +01:00
Hongli Lai (Phusion)
d2d1f713a4 Add forgotten file 2014-01-31 19:29:50 +01:00
48 changed files with 2959 additions and 272 deletions

11
.editorconfig Normal file
View File

@@ -0,0 +1,11 @@
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
indent_size = 4
indent_style = tab

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
.DS_Store
.vagrant
*.swp

19
.travis.yml Normal file
View File

@@ -0,0 +1,19 @@
sudo: required
services:
- docker
script:
- make build
deploy:
- provider: script
script: make test_release
on:
branch: master
tags: true
condition: '$TRAVIS_TAG =~ ^[0-9]+(\.[0-9]+)*$'
- provider: script
script: make test_master
on:
branch: master

46
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at info@phusion.nl. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

7
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,7 @@
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 Docker image.
All development happens on the `next` branch. The `master` branch is supposed to point to the latest stable release, because users read documentation from the `master` branch.

View File

@@ -1,16 +1 @@
## 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)
* Fixed SFTP support. Thanks Joris van de Donk!
## 0.9.1 (release date: 2013-11-12)
* Improved init process script (`/sbin/my_init`): it now handles shutdown correctly. Previously, `docker stop` would not have any effect on `my_init`, causing the whole container to be killed with SIGKILL. The new init process script gracefully shuts down all runit services, then exits.
## 0.9.0 (release date: 2013-11-12)
* Initial release
For the Changelog, please see [Releases](https://github.com/phusion/baseimage-docker/releases) on GitHub

View File

@@ -1,4 +1,4 @@
Copyright (c) 2013-2014 Phusion
Copyright (c) 2013-2015 Phusion Holding B.V.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,17 +1,36 @@
NAME = phusion/baseimage
VERSION = 0.9.3
VERSION = 0.10.0
.PHONY: all build tag_latest release
.PHONY: all build test tag_latest release ssh
all: build
build:
docker build -t $(NAME):$(VERSION) -rm image
docker build -t $(NAME):$(VERSION) --rm image
test:
env NAME=$(NAME) VERSION=$(VERSION) ./test/runner.sh
tag_latest:
docker tag $(NAME):$(VERSION) $(NAME):latest
release: tag_latest
@if ! docker images phusion/baseimage | awk '{ print $$2 }' | grep -q -F $(VERSION); then echo "$(NAME) version $(VERSION) is not yet built. Please run 'make build'"; false; fi
release: test tag_latest
@if ! docker images $(NAME) | awk '{ print $$2 }' | grep -q -F $(VERSION); then echo "$(NAME) version $(VERSION) is not yet built. Please run 'make build'"; false; fi
docker push $(NAME)
@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 by creating an official GitHub release."
ssh:
chmod 600 image/services/sshd/keys/insecure_key
@ID=$$(docker ps | grep -F "$(NAME):$(VERSION)" | awk '{ print $$1 }') && \
if test "$$ID" = ""; then echo "Container is not running."; exit 1; fi && \
IP=$$(docker inspect $$ID | grep IPAddr | sed 's/.*: "//; s/".*//') && \
echo "SSHing into $$IP" && \
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i image/services/sshd/keys/insecure_key root@$$IP
test_release:
echo test_release
env
test_master:
echo test_master
env

524
README.md
View File

@@ -1,137 +1,470 @@
# A minimal Ubuntu base image modified for Docker-friendliness
Baseimage-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.
[![](https://badge.imagelayers.io/phusion/baseimage:latest.svg)](https://imagelayers.io/?images=phusion/baseimage:latest 'Get your own badge on imagelayers.io')
[![Travis](https://img.shields.io/travis/phusion/baseimage-docker.svg)](https://travis-ci.org/phusion/baseimage-docker)
Baseimage-docker is available for pulling from on [the Docker registry](https://index.docker.io/u/phusion/baseimage/)!
_Baseimage-docker only consumes 6 MB RAM and is much more powerful than Busybox or Alpine. See why below._
* **Github**: https://github.com/phusion/baseimage-docker
* **Discussion forum**: https://groups.google.com/d/forum/passenger-docker
* **Twitter**: https://twitter.com/phusion_nl
* **Blog**: http://blog.phusion.nl/
Baseimage-docker is a special [Docker](https://www.docker.com) image that is configured for correct use within Docker containers. It is Ubuntu, plus:
* Modifications for Docker-friendliness.
* Administration tools that are especially useful in the context of Docker.
* Mechanisms for easily running multiple processes, [without violating the Docker philosophy](#docker_single_process).
You can use it as a base for your own Docker images.
Baseimage-docker is available for pulling from [the Docker registry](https://registry.hub.docker.com/u/phusion/baseimage/)!
### 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.
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; you want a minimal system. 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.
<a name="why_use"></a>
### 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 write a correct Dockerfile. You won't have to worry about the base system and you can focus on the stack and the 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.
## Contents
-----------------------------------------
**Related resources**:
[Website](http://phusion.github.io/baseimage-docker/) |
[Github](https://github.com/phusion/baseimage-docker) |
[Docker registry](https://index.docker.io/u/phusion/baseimage/) |
[Discussion forum](https://groups.google.com/d/forum/passenger-docker) |
[Twitter](https://twitter.com/phusion_nl) |
[Blog](http://blog.phusion.nl/)
**Table of contents**
* [What's inside the image?](#whats_inside)
* [Overview](#whats_inside_overview)
* [Wait, I thought Docker is about running a single process in a container?](#docker_single_process)
* [Does Baseimage-docker advocate "fat containers" or "treating containers as VMs"?](#fat_containers)
* [Inspecting baseimage-docker](#inspecting)
* [Using baseimage-docker as base image](#using)
* [Getting started](#getting_started)
* [Adding additional daemons](#adding_additional_daemons)
* [Running scripts during container startup](#running_startup_scripts)
* [Environment variables](#environment_variables)
* [Centrally defining your own environment variables](#envvar_central_definition)
* [Environment variable dumps](#envvar_dumps)
* [Modifying environment variables](#modifying_envvars)
* [Security](#envvar_security)
* [System logging](#logging)
* [Upgrading the operating system inside the container](#upgrading_os)
* [Container administration](#container_administration)
* [Running a one-shot command in a new container](#oneshot)
* [Running a command in an existing, running container](#run_inside_existing_container)
* [Login to the container via `docker exec`](#login_docker_exec)
* [Usage](#docker_exec)
* [Login to the container via SSH](#login_ssh)
* [Enabling SSH](#enabling_ssh)
* [About SSH keys](#ssh_keys)
* [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)
* [Using your own key](#using_your_own_key)
* [The `docker-ssh` tool](#docker_ssh)
* [Building the image yourself](#building)
* [Removing optional services](#removing_optional_services)
* [Conclusion](#conclusion)
-----------------------------------------
<a name="whats_inside"></a>
## What's inside the image?
<a name="whats_inside_overview"></a>
### 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](https://github.com/phusion/passenger-docker).*
| Component | Why is it included? / Remarks |
| ---------------- | ------------------- |
| Ubuntu 12.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. |
| Ubuntu 16.04 LTS | The base system. |
| A **correct** init process | _Main article: [Docker and the PID 1 zombie reaping problem](http://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/)._ <br><br>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. 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 stops 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. |
| 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. |
| ssh server | Allows you to easily login to your container to inspect or administer things. <br><br>Password and challenge-response authentication are disabled by default. Only key authentication is allowed.<br>It allows an predefined key by default to make debugging easy. You should replace this ASAP. See instructions. |
| 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. All syslog messages are forwarded to "docker logs".<br><br>Why syslog-ng?<br>I've had bad experience with rsyslog. I regularly run into bugs with rsyslog, and once in a while it takes my log host down by entering a 100% CPU loop in which it can't do anything. Syslog-ng seems to be much more stable. |
| logrotate | Rotates and compresses logs on a regular basis. |
| SSH server | Allows you to easily login to your container to [inspect or administer](#login_ssh) things. <br><br>_SSH is **disabled by default** and is only one of the methods provided by baseimage-docker for this purpose. The other method is through [docker exec](#login_docker_exec). SSH is also provided as an alternative because `docker exec` comes with several caveats._<br><br>Password and challenge-response authentication are disabled by default. Only key authentication is allowed. |
| cron | The cron daemon must be running for cron jobs to work. |
| [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. |
| `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`. |
| `install_clean` | A tool for installing `apt` packages that automatically cleans up after itself. All arguments are passed to `apt-get -y install --no-install-recommends` and after installation the apt caches are cleared. To include recommended packages, add `--install-recommends`. |
Baseimage-docker is very lightweight: it only consumes 6 MB of memory.
<a name="docker_single_process"></a>
### 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.
The Docker developers advocate the philosophy of running a single *logical service* per container. A logical service can consist of multiple OS processes.
Baseimage-docker *encourages* multiple processes through the use of runit.
Baseimage-docker only advocates running multiple OS processes inside a single container. We believe this makes sense because at the very least it would solve [the PID 1 problem](http://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/) and the "syslog blackhole" problem. By running multiple processes, we solve very real Unix OS-level problems, with minimal overhead and without turning the container into multiple logical services.
Splitting your logical service into multiple OS processes also makes sense from a security standpoint. By running processes as different users, you can limit the impact of vulnerabilities. Baseimage-docker provides tools to encourage running processes as different users, e.g. the `setuser` tool.
Do we advocate running multiple *logical services* in a single container? Not necessarily, but we do not prohibit it either. While the Docker developers are very opinionated and have very rigid philosophies about how containers *should* be built, Baseimage-docker is completely unopinionated. We believe in freedom: sometimes it makes sense to run multiple services in a single container, and sometimes it doesn't. It is up to you to decide what makes sense, not the Docker developers.
<a name="fat_containers"></a>
### Does Baseimage-docker advocate "fat containers" or "treating containers as VMs"?
There are people who think that Baseimage-docker advocates treating containers as VMs because Baseimage-docker advocates the use of multiple processes. Therefore, they also think that Baseimage-docker does not follow the Docker philosophy. Neither of these impressions are true.
The Docker developers advocate running a single *logical service* inside a single container. But we are not disputing that. Baseimage-docker advocates running multiple *OS processes* inside a single container, and a single logical service can consist of multiple OS processes.
It follows that Baseimage-docker also does not deny the Docker philosophy. In fact, many of the modifications we introduce are explicitly in line with the Docker philosophy. For example, using environment variables to pass parameters to containers is very much the "Docker way", and providing [a mechanism to easily work with environment variables](#environment_variables) in the presence of multiple processes that may run as different users.
<a name="inspecting"></a>
## Inspecting baseimage-docker
To look around in the image, run:
docker run -rm -t -i phusion/baseimage bash -l
docker run --rm -t -i phusion/baseimage:<VERSION> /sbin/my_init -- bash -l
where `<VERSION>` is [one of the baseimage-docker version numbers](https://github.com/phusion/baseimage-docker/blob/master/Changelog.md).
You don't have to download anything manually. The above command will automatically pull the baseimage-docker image from the Docker registry.
<a name="using"></a>
## Using baseimage-docker as base image
The image is called `phusion/baseimage`, and is available on the Docker registry.
<a name="getting_started"></a>
### Getting started
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.
The image is called `phusion/baseimage`, and is available on the Docker registry.
# 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/*
<a name="adding_additional_daemons"></a>
### 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.
You can add additional daemons (e.g. your own app) 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.
Here's an example showing you how a memcached server runit entry can be made.
In `memcached.sh` (make sure this file is chmod +x):
### 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
# `/sbin/setuser memcache` runs the given command as the user `memcache`.
# If you omit that part, the command will be run as root.
exec /sbin/setuser memcache /usr/bin/memcached >>/var/log/memcached.log 2>&1
In `Dockerfile`:
### In Dockerfile:
RUN mkdir /etc/service/memcached
ADD memcached.sh /etc/service/memcached/run
COPY memcached.sh /etc/service/memcached/run
RUN chmod +x /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.
<a name="running_startup_scripts"></a>
### 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.
* 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.
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.
**Important note:** If you are executing the container in interactive mode (i.e. when you run a container with `-it`), rather than daemon mode, you are sending stdout directly to the terminal (`-i` interactive `-t` terminal). If you are not calling `/sbin/my_init` in your run declaration, `/sbin/my_init` will not be executed, therefore your scripts will not be called during container startup.
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):
In `logtime.sh`:
#!/bin/sh
date > /tmp/boottime.txt
### In Dockerfile:
In `Dockerfile`:
RUN mkdir -p /etc/my_init.d
ADD logtime.sh /etc/my_init.d/logtime.sh
COPY logtime.sh /etc/my_init.d/logtime.sh
RUN chmod +x /etc/my_init.d/logtime.sh
### Login to the container
<a name="environment_variables"></a>
You can use SSH to login to any container that is based on baseimage-docker.
#### Shutting down your process
Start a container based on baseimage-docker (or a container based on an image based on baseimage-docker):
`/sbin/my_init` handles termination of children processes at shutdown. When it receives a SIGTERM
it will pass the signal onto the child processes for correct shutdown. If your process is started with
a shell script, make sure you `exec` the actual process, otherwise the shell will receive the signal
and not your process.
docker run phusion/baseimage
`/sbin/my_init` will terminate processes after a 5 second timeout. This can be adjusted by setting
environment variables:
# Give children processes 5 minutes to timeout
ENV KILL_PROCESS_TIMEOUT=300
# Give all other processes (such as those which have been forked) 5 minutes to timeout
ENV KILL_ALL_PROCESSES_TIMEOUT=300
### Environment variables
If you use `/sbin/my_init` as the main container command, then any environment variables set with `docker run --env` or with the `ENV` command in the Dockerfile, will be picked up by `my_init`. These variables will also be passed to all child processes, including `/etc/my_init.d` startup scripts, Runit and Runit-managed services. There are however a few caveats you should be aware of:
* Environment variables on Unix are inherited on a per-process basis. This means that it is generally not possible for a child process to change the environment variables of other processes.
* Because of the aforementioned point, there is no good central place for defining environment variables for all applications and services. Debian has the `/etc/environment` file but it only works in some situations.
* Some services change environment variables for child processes. Nginx is one such example: it removes all environment variables unless you explicitly instruct it to retain them through the `env` configuration option. If you host any applications on Nginx (e.g. using the [passenger-docker](https://github.com/phusion/passenger-docker) image, or using Phusion Passenger in your own image) then they will not see the environment variables that were originally passed by Docker.
* We ignore HOME, SHELL, USER and a bunch of other environment variables on purpose, because _not_ ignoring them will break multi-user containers. See https://github.com/phusion/baseimage-docker/pull/86 -- A workaround for setting the `HOME` environment variable looks like this: `RUN echo /root > /etc/container_environment/HOME`. See https://github.com/phusion/baseimage-docker/issues/119
`my_init` provides a solution for all these caveats.
<a name="envvar_central_definition"></a>
#### Centrally defining your own environment variables
During startup, before running any [startup scripts](#running_startup_scripts), `my_init` imports environment variables from the directory `/etc/container_environment`. This directory contains files named after the environment variable names. The file contents contain the environment variable values. This directory is therefore a good place to centrally define your own environment variables, which will be inherited by all startup scripts and Runit services.
For example, here's how you can define an environment variable from your Dockerfile:
RUN echo Apachai Hopachai > /etc/container_environment/MY_NAME
You can verify that it works, as follows:
$ docker run -t -i <YOUR_NAME_IMAGE> /sbin/my_init -- bash -l
...
*** Running bash -l...
# echo $MY_NAME
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 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>
#### Environment variable dumps
While the previously mentioned mechanism is good for centrally defining environment variables, itself does not prevent services (e.g. Nginx) from changing and resetting environment variables from child processes. However, the `my_init` mechanism does make it easy for you to query what the original environment variables are.
During startup, right after importing environment variables from `/etc/container_environment`, `my_init` will dump all its environment variables (that is, all variables imported from `container_environment`, as well as all variables it picked up from `docker run --env`) to the following locations, in the following formats:
* `/etc/container_environment`
* `/etc/container_environment.sh` - a dump of the environment variables in Bash format. You can source the file directly from a Bash shell script.
* `/etc/container_environment.json` - a dump of the environment variables in JSON format.
The multiple formats make it easy for you to query the original environment variables no matter which language your scripts/apps are written in.
Here is an example shell session showing you how the dumps look like:
$ docker run -t -i \
--env FOO=bar --env HELLO='my beautiful world' \
phusion/baseimage:<VERSION> /sbin/my_init -- \
bash -l
...
*** Running bash -l...
# ls /etc/container_environment
FOO HELLO HOME HOSTNAME PATH TERM container
# cat /etc/container_environment/HELLO; echo
my beautiful world
# cat /etc/container_environment.json; echo
{"TERM": "xterm", "container": "lxc", "HOSTNAME": "f45449f06950", "HOME": "/root", "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "FOO": "bar", "HELLO": "my beautiful world"}
# source /etc/container_environment.sh
# echo $HELLO
my beautiful world
<a name="modifying_envvars"></a>
#### Modifying environment variables
It is even possible to modify the environment variables in `my_init` (and therefore the environment variables in all child processes that are spawned after that point in time), by altering the files in `/etc/container_environment`. After each time `my_init` runs a [startup script](#running_startup_scripts), it resets its own environment variables to the state in `/etc/container_environment`, and re-dumps the new environment variables to `container_environment.sh` and `container_environment.json`.
But note that:
* modifying `container_environment.sh` and `container_environment.json` has no effect.
* Runit services cannot modify the environment like that. `my_init` only activates changes in `/etc/container_environment` when running startup scripts.
<a name="envvar_security"></a>
#### 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 accessible only to 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 644 /etc/container_environment.sh /etc/container_environment.json
<a name="logging"></a>
### System logging
Baseimage-docker uses syslog-ng to provide a syslog facility to the container. Syslog-ng is not managed as an runit service (see below). Syslog messages are forwarded to the console via the service at /etc/service/syslog-forwarder.
#### Log startup/shutdown sequence
In order to ensure that all application log messages are captured by syslog-ng, syslog-ng is started separately before the runit supervisor process, and shutdown after runit exits. This uses the [startup script facility](#running_startup_scripts) provided by this image. This avoids a race condition which would exist if syslog-ng were managed as an runit service, where runit kills syslog-ng in parallel with the container's other services, causing log messages to be dropped during a graceful shutdown if syslog-ng exits while logs are still being produced by other services.
<a name="upgrading_os"></a>
### Upgrading the operating system inside the container
Baseimage-docker images contain an Ubuntu 16.04 operating system. You may want to update this OS from time to time, for example to pull in the latest security updates. OpenSSL is a notorious example. Vulnerabilities are discovered in OpenSSL on a regular basis, so you should keep OpenSSL up-to-date as much as you can.
While we release Baseimage-docker images with the latest OS updates from time to time, you do not have to rely on us. You can update the OS inside Baseimage-docker images yourself, and it is recommended that you do this instead of waiting for us.
To upgrade the OS in the image, run this in your Dockerfile:
RUN apt-get update && apt-get upgrade -y -o Dpkg::Options::="--force-confold"
<a name="container_administration"></a>
## Container administration
One of the ideas behind Docker is that containers should be stateless, easily restartable, and behave like a black box. However, you may occasionally encounter situations where you want to login to a container, or to run a command inside a container, for development, inspection and debugging purposes. This section describes how you can administer the container for those purposes.
<a name="oneshot"></a>
### Running a one-shot command in a new container
_**Note:** This section describes how to run a command insider a -new- container. To run a command inside an existing running container, see [Running a command in an existing, running container](#run_inside_existing_container)._
Normally, when you want to create a new container in order to run a single command inside it, and immediately exit after the command exits, you invoke Docker like this:
docker run YOUR_IMAGE COMMAND ARGUMENTS...
However the downside of this approach is that the init system is not started. That is, while invoking `COMMAND`, important daemons such as cron and syslog are not running. Also, orphaned child processes are not properly reaped, because `COMMAND` is PID 1.
Baseimage-docker provides a facility to run a single one-shot command, while solving all of the aforementioned problems. Run a single command in the following manner:
docker run YOUR_IMAGE /sbin/my_init -- COMMAND ARGUMENTS ...
This will perform the following:
* Runs all system startup files, such as /etc/my_init.d/* and /etc/rc.local.
* Starts all runit services.
* Runs the specified command.
* When the specified command exits, stops all runit services.
For example:
$ docker run phusion/baseimage:<VERSION> /sbin/my_init -- ls
*** Running /etc/rc.local...
*** Booting runit daemon...
*** Runit started as PID 80
*** Running ls...
bin boot dev etc home image lib lib64 media mnt opt proc root run sbin selinux srv sys tmp usr var
*** ls exited with exit code 0.
*** Shutting down runit daemon (PID 80)...
*** Killing all processes...
You may find that the default invocation is too noisy. Or perhaps you don't want to run the startup files. You can customize all this by passing arguments to `my_init`. Invoke `docker run YOUR_IMAGE /sbin/my_init --help` for more information.
The following example runs `ls` without running the startup files and with less messages, while running all runit services:
$ docker run phusion/baseimage:<VERSION> /sbin/my_init --skip-startup-files --quiet -- ls
bin boot dev etc home image lib lib64 media mnt opt proc root run sbin selinux srv sys tmp usr var
<a name="run_inside_existing_container"></a>
### Running a command in an existing, running container
There are two ways to run a command inside an existing, running container.
* Through the `docker exec` tool. This is builtin Docker tool, available since Docker 1.4. Internally, it uses Linux kernel system calls in order to execute a command within the context of a container. Learn more in [Login to the container, or running a command inside it, via `docker exec`](#login_docker_exec).
* Through SSH. This approach requires running an SSH daemon inside the container, and requires you to setup SSH keys. Learn more in [Login to the container, or running a command inside it, via SSH](#login_ssh).
Both way have their own pros and cons, which you can learn in their respective subsections.
<a name="login_docker_exec"></a>
### Login to the container, or running a command inside it, via `docker exec`
You can use the `docker exec` tool on the Docker host OS to login to any container that is based on baseimage-docker. You can also use it to run a command inside a running container. `docker exec` works by using Linux kernel system calls.
Here's how it compares to [using SSH to login to the container or to run a command inside it](#login_ssh):
* Pros
* Does not require running an SSH daemon inside the container.
* Does not require setting up SSH keys.
* Works on any container, even containers not based on baseimage-docker.
* Cons
* If the `docker exec` process on the host is terminated by a signal (e.g. with the `kill` command or even with Ctrl-C), then the command that is executed by `docker exec` is *not* killed and cleaned up. You will either have to do that manually, or you have to run `docker exec` with `-t -i`.
* Requires privileges on the Docker host to be able to access the Docker daemon. Note that anybody who can access the Docker daemon effectively has root access.
* Not possible to allow users to login to the container without also letting them login to the Docker host.
<a name="docker_exec_usage"></a>
#### Usage
Start a container:
docker run YOUR_IMAGE
Find out the ID of the container that you just ran:
docker ps
Now that you have the ID, you can use `docker exec` to run arbitrary commands in the container. For example, to run `echo hello world`:
docker exec YOUR-CONTAINER-ID echo hello world
To open a bash session inside the container, you must pass `-t -i` so that a terminal is available:
docker exec -t -i YOUR-CONTAINER-ID bash -l
<a name="login_ssh"></a>
### Login to the container, or running a command inside it, via SSH
You can use SSH to login to any container that is based on baseimage-docker. You can also use it to run a command inside a running container.
Here's how it compares to [using `docker exec` to login to the container or to run a command inside it](#login_docker_exec):
* Pros
* Does not require root privileges on the Docker host.
* Allows you to let users login to the container, without letting them login to the Docker host. However, this is not enabled by default because baseimage-docker does not expose the SSH server to the public Internet by default.
* Cons
* Requires setting up SSH keys. However, baseimage-docker makes this easy for many cases through a pregenerated, insecure key. Read on to learn more.
<a name="enabling_ssh"></a>
#### Enabling SSH
Baseimage-docker disables the SSH server by default. Add the following to your Dockerfile to enable it:
RUN rm -f /etc/service/sshd/down
# 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
Alternatively, to enable sshd only for a single instance of your container, create a folder with a [startup script](#running_startup_scripts). The contents of that should be
### In myfolder/enable_ssh.sh (make sure this file is chmod +x):
#!/bin/sh
rm -f /etc/service/sshd/down
ssh-keygen -P "" -t dsa -f /etc/ssh/ssh_host_dsa_key
Then, you can start your container with
docker run -d -v `pwd`/myfolder:/etc/my_init.d my/dockerimage
This will initialize sshd on container boot. You can then access it with the insecure key as below, or using the methods to add a secure key. Further, you can publish the port to your machine with -p 22:2222 allowing you to ssh to localhost:2222 instead of looking up the ip address.
<a name="ssh_keys"></a>
#### About SSH keys
First, you must ensure that you have the right SSH keys installed inside the container. By default, no keys are installed, so nobody can login. For convenience reasons, we provide [a pregenerated, insecure key](https://github.com/phusion/baseimage-docker/blob/master/image/services/sshd/keys/insecure_key) [(PuTTY format)](https://github.com/phusion/baseimage-docker/blob/master/image/services/sshd/keys/insecure_key.ppk) that you can easily enable. However, please be aware that using this key is for convenience only. It does not provide any security because this key (both the public and the private side) is publicly available. **In production environments, you should use your own keys**.
<a name="using_the_insecure_key_for_one_container_only"></a>
#### Using the insecure key for one container only
You can temporarily enable the insecure key for one container only. This means that the insecure key is installed at container boot. If you `docker stop` and `docker start` the container, the insecure key will still be there, but if you use `docker run` to start a new container then that container will not contain the insecure key.
Start a container with `--enable-insecure-key`:
docker run YOUR_IMAGE /sbin/my_init --enable-insecure-key
Find out the ID of the container that you just ran:
@@ -139,12 +472,83 @@ Find out the ID of the container that you just ran:
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. 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?
Now that you have the IP address, you can use SSH to login to the container, or to execute a command inside it:
# Download the insecure private key
curl -o insecure_key -fSL https://github.com/phusion/baseimage-docker/raw/master/image/services/sshd/keys/insecure_key
chmod 600 insecure_key
# Login to the container
ssh -i insecure_key root@<IP address>
# Running a command inside the container
ssh -i insecure_key root@<IP address> echo hello world
<a name="enabling_the_insecure_key_permanently"></a>
#### Enabling the insecure key permanently
It is also possible to enable the insecure key in the image permanently. This is not generally recommended, but is suitable for e.g. temporary development or demo environments where security does not matter.
Edit your Dockerfile to install the insecure key permanently:
RUN /usr/sbin/enable_insecure_key
Instructions for logging into the container is the same as in section [Using the insecure key for one container only](#using_the_insecure_key_for_one_container_only).
<a name="using_your_own_key"></a>
#### Using your own key
Edit your Dockerfile to install an SSH public key:
## Install an SSH of your choice.
COPY your_key.pub /tmp/your_key.pub
RUN cat /tmp/your_key.pub >> /root/.ssh/authorized_keys && rm -f /tmp/your_key.pub
Then rebuild your image. Once you have that, start a container based on that image:
docker run your-image-name
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 -f "{{ .NetworkSettings.IPAddress }}" <ID>
Now that you have the IP address, you can use SSH to login to the container, or to execute a command inside it:
# Login to the container
ssh -i /path-to/your_key root@<IP address>
# Running a command inside the container
ssh -i /path-to/your_key root@<IP address> echo hello world
<a name="docker_ssh"></a>
#### The `docker-ssh` tool
Looking up the IP of a container and running an SSH command quickly becomes tedious. Luckily, we provide the `docker-ssh` 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-ssh YOUR-CONTAINER-ID
You can lookup `YOUR-CONTAINER-ID` by running `docker ps`.
By default, `docker-ssh` will open a Bash session. You can also tell it to run a command, and then exit:
docker-ssh YOUR-CONTAINER-ID echo hello world
<a name="building"></a>
## 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.
@@ -168,6 +572,26 @@ If you want to call the resulting image something else, pass the NAME variable,
make build NAME=joe/baseimage
<a name="removing_optional_services"></a>
### Removing optional services
The default baseimage-docker installs `syslog-ng`, `cron` and `sshd` services during the build process.
In case you don't need one or more of these services in your image, you can disable its installation.
As shown in the following example, to prevent `sshd` from being installed into your image, set `1` to the `DISABLE_SSH` variable in the `./image/buildconfig` file.
### In ./image/buildconfig
# ...
# Default services
# Set 1 to the service you want to disable
export DISABLE_SYSLOG=0
export DISABLE_SSH=1
export DISABLE_CRON=0
Then you can proceed with `make build` command.
<a name="conclusion"></a>
## Conclusion
* Using baseimage-docker? [Tweet about us](https://twitter.com/share) or [follow us on Twitter](https://twitter.com/phusion_nl).

569
README_ZH_cn_.md Normal file
View File

@@ -0,0 +1,569 @@
<a name="a-minimal-ubuntu-base-image-modified-for-docker-friendliness"></a>
# Docker友好的最小的Ubuntu基础镜像
Baseimage-docker是一个特殊的[Docker](http://www.docker.io)镜像在Docker容器内做了配置并且可以正确使用。它确实是一个Ubuntu系统, 除此之外进行了如下修订:
* 为更加友好的支持Docker做了修订。
* 在Docker环境下作为管理工具特别有用。
* 在[不违反Docker哲学](#docker_single_process)的前提下,能够很容易的运行多进程的机制。
可以把它作为自己的基础Docker镜像。
Baseimage-docker项目可以直接从Docker的[registry](https://index.docker.io/u/phusion/baseimage/)获取!
<a name="what-are-the-problems-with-the-stock-ubuntu-base-image"></a>
### 原生的Ubuntu基础镜像有什么问题呢
原生Ubuntu不是为了在Docker内运行而设计的。它的初始化系统Upstart假定运行的环境要么是真实的硬件要么是虚拟的硬件而不是在Docker容器内。但是在一个Docker的容器内并不需要一个完整的系统你需要的只是一个很小的系统。但是如果你不是非常熟悉Unix的系统模型想要在Docker容器内裁减出最小的系统会碰到很多难以正确解决的陌生的技术坑。这些坑会引起很多莫名其妙的问题。
Baseimage-docker让这一切完美。在"内容"部分描述了所有这些修改。
<a name="why-use-baseimage-docker"></a>
### 为什么使用baseimage-docker
你自己可以从Dockerfile配置一个原生`ubuntu`镜像为什么还要多此一举的使用baseimage-docker呢?
* 配置一个Docker友好的基础系统并不是一个简单的任务。如前所述过程中会碰到很多坑。当你搞定这些坑之后只不过是又重新发明了一个baseimage-docker而已。使用baseimage-docker可以免去你这方面需要做的努力。
* 减少需要正确编写Dockerfile文件的时间。你不用再担心基础系统可以专注于你自己的技术栈和你的项目。
* 减少需要运行`docker build`的时间让你更快的迭代Dockerfile。
* 减少了重新部署的时的下载时间。Docker只需要在第一次部署的时候下载一次基础镜像。在随后的部署中,只需要改变你下载之后对基础镜像进行修改的部分。
-----------------------------------------
**相关资源**
[网站](http://phusion.github.io/baseimage-docker/) |
[Github](https://github.com/phusion/baseimage-docker) |
[Docker registry](https://index.docker.io/u/phusion/baseimage/) |
[论坛](https://groups.google.com/d/forum/passenger-docker) |
[Twitter](https://twitter.com/phusion_nl) |
[Blog](http://blog.phusion.nl/)
**目录**
* [镜像里面有什么?](#whats_inside)
* [概述](#whats_inside_overview)
* [等等,我认为Docker在一个容器中只能允许运行一个进程?](#docker_single_process)
* [Baseimage-docker更侧重于“胖容器”还是“把容器当作虚拟机”](#fat_containers)
* [查看baseimage-docker](#inspecting)
* [使用baseimage-docker作为基础镜像](#using)
* [开始](#getting_started)
* [增加额外的后台进程](#adding_additional_daemons)
* [容器启动时运行脚本](#running_startup_scripts)
* [环境变量](#environment_variables)
* [集中定义自己的环境变量](#envvar_central_definition)
* [保存环境变量](#envvar_dumps)
* [修改环境变量](#modifying_envvars)
* [安全性](#envvar_security)
* [容器管理](#container_administration)
* [在一个新容器中运行单条命令](#oneshot)
* [在正在运行的的容器中运行一条命令](#run_inside_existing_container)
* [通过`docer exec`登录容器](#login_docker_exec)
* [用法](#nsenter_usage)
* [使用SSH登录容器](#login_ssh)
* [启用SSH](#enabling_ssh)
* [关于SSH的key](#ssh_keys)
* [只对一个容器使用不安全key](#using_insecure_key_for_one_container_only)
* [永久开启不安全key](#enabling_the_insecure_key_permanently)
* [使用你自己的key](#using_your_own_key)
* [`docker-ssh`工具](#docker_ssh)
* [构建自己的镜像](#building)
* [总结](#conclusion)
-----------------------------------------
<a name="whats_inside"></a>
## 镜像里面有什么?
<a name="whats_inside_overview"></a>
### 概述
*想看一个里面包含RubyPythonNode.js以及Meteor的完整基础镜像可以看一下[passenger-docker](https://github.com/phusion/passenger-docker)。*
| 模块 | 为什么包含这些?以及备注 |
| ---------------- | ------------------- |
| Ubuntu 16.04 LTS | 基础系统。 |
| 一个**正确**的初始化进程 | *主要文章:[Docker和PID 1 僵尸进程回收问题](http://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/)*<br/><br/>根据Unix进程模型[初始化进程](https://en.wikipedia.org/wiki/Init) -- PID 1 -- 继承了所有[孤立的子进程](https://en.wikipedia.org/wiki/Orphan_process),并且必须[进行回收](https://en.wikipedia.org/wiki/Wait_(system_call))。大多数Docker容器没有一个初始化进程可以正确的完成此操作随着时间的推移会导致他们的容器出现了大量的[僵尸进程](https://en.wikipedia.org/wiki/Zombie_process)。<br/><br/>而且,`docker stop`发送SIGTERM信号给初始化进程照理说此信号应该可以停止所有服务。不幸的是由于它们对硬件进行了关闭操作导致Docker内的大多数初始化系统没有正确执行。这会导致进程强行被SIGKILL信号关闭从而丧失了一个正确取消初始化设置的机会。这会导致文件损坏。<br/><br/>Baseimage-docker配有一个名为`/sbin/my_init`的初始化进程来同时正确的完成这些任务。 |
| 修复了APT与Docker不兼容的问题 | 详情参见https://github.com/dotcloud/docker/issues/1024 。 |
| syslog-ng | 对于很多服务包括kernel自身都需要一个syslog后台进程以便可以正确的将log输出到/var/log/syslog中。如果没有运行syslog后台进程很多重要的信息就会默默的丢失了。<br/><br/>只对本地进行监听。所有syslog信息会被转发给“docker logs”。 |
| logrotate | 定期转存和压缩日志。 |
| SSH服务 | 允许你很容易的登录到容器中进行[查询或管理](#login_ssh)操作。<br/><br/>_SSH**默认是禁用**的这也是baseimage-docker为此目的提供的唯一方法。其它方法需要通过[docker exec](#login_docker_exec)。由于`docker exec`同时带来了几个需要注意的问题SSH同时也提供了一个可替换的方法。_<br/><br/>密码和challenge-response认证方式默认是禁用的。只有key认证通过之后才能够开启。 |
| cron | 为了保证cron任务能够工作必须运行cron后台进程。 |
| [runit](http://smarden.org/runit/) | 替换Ubuntu的Upstart。用于服务监控和管理。比SysV init更容易使用同时当这些服务崩溃之后支持后台进程自动重启。比Upstart更易使用更加的轻量级。 |
| `setuser` | 使用其它账户运行命令的工具。比`su`更容易使用,比使用`sudo`有那么一点优势,跟`chpst`不同,这个工具需要正确的设置`$HOME`。像`/sbin/setuser`这样。 |
Baseimage-docker非常的轻量级仅仅占用6MB内存。
<a name="docker_single_process"></a>
### 等等,我认为Docker在一个容器中就运行一个进程吗?
绝对不是这样的. 在一个docker容器中,运行多个进程也是很好的. 事实上,没有什么技术原因限制你只运行一个进程,运行很多的进程,只会把容器中系统的基本功能搞的更乱,比如syslog.
Baseimage-docker *鼓励* 通过runit来运行多进程.
<a name="inspecting"></a>
## 检测一下baseimage-docker
要检测镜像,执行下面的命令:
docker run --rm -t -i phusion/baseimage:<VERSION> /sbin/my_init -- bash -l
`<VERSION>` 是[baseimage-docker的版本号](https://github.com/phusion/baseimage-docker/blob/master/Changelog.md).
你不用手动去下载任何文件.上面的命令会自动从docker仓库下载baseimage-docker镜像.
<a name="using"></a>
## 使用baseimage-docker作为基础镜像
<a name="getting_started"></a>
### 入门指南
镜像名字叫`phusion/baseimage`,在Docker仓库上也是可用的.
下面的这个是一个Dockerfile的模板.
# 使用phusion/baseimage作为基础镜像,去构建你自己的镜像,需要下载一个明确的版本,千万不要使用`latest`.
# 查看https://github.com/phusion/baseimage-docker/blob/master/Changelog.md,可用看到版本的列表.
FROM phusion/baseimage:<VERSION>
# 设置正确的环境变量.
ENV HOME /root
# 生成SSH keys,baseimage-docker不包含任何的key,所以需要你自己生成.你也可以注释掉这句命令,系统在启动过程中,会生成一个.
RUN /etc/my_init.d/00_regen_ssh_host_keys.sh
# 初始化baseimage-docker系统
CMD ["/sbin/my_init"]
# 这里可以放置你自己需要构建的命令
# 当完成后,清除APT.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
<a name="adding_additional_daemons"></a>
### 增加后台进程
你可以通过runit工具向你的镜像中添加后台进程(例如:你自己的某些应用).你需要编写一个运行你需要的后台进程的脚本就可以了,runit工具会保证它的正常运行,如果进程死掉,runit也会重启它的.
脚本的名称必须是`run`,必须是可以运行的,它需要放到`/etc/service/<NAME>`.
这里有一个例子,向你展示如果运行memcached服务的.
### memcached.sh(确定文件的权限是chmod +x):
#!/bin/sh
# `/sbin/setuser memcache` 指定一个`memcache`用户来运行命令.如果你忽略了这部分,就会使用root用户执行.
exec /sbin/setuser memcache /usr/bin/memcached >>/var/log/memcached.log 2>&1
### 在Dockerfile中:
RUN mkdir /etc/service/memcached
COPY memcached.sh /etc/service/memcached/run
注意脚本必须运行在后台的,**不能让他们进程进行daemonize/fork**.通常,后台进程会提供一个标志位或者配置文件.
<a name="running_startup_scripts"></a>
### 在容器启动的时候,运行脚本.
baseimage-docker的初始化脚本 `/sbin/my_init`,在启动的时候进程运行,按照下面的顺序:
* 如果`/etc/my_init.d`存在,则按照字母顺序执行脚本.
* 如果`/etc/rc.local`存在,则执行里面的脚本.
所有的脚本都是正确退出的,例如:退出的code是0.如果有任何脚本以非0的code退出,启动就会失败.
下面的例子向你展示了怎么添加一个启动脚本.这个脚本很简单的记录的一个系统启动时间,将启动时间记录到/tmp/boottime.txt.
### 在 logtime.sh (文件权限chmod +x):
#!/bin/sh
date > /tmp/boottime.txt
### 在 Dockerfile中:
RUN mkdir -p /etc/my_init.d
COPY logtime.sh /etc/my_init.d/logtime.sh
<a name="environment_variables"></a>
### 环境变量
如果你使用`/sbin/my_init`作为主容器命令,那么通过`docker run --env`或者在Dockerfile文件中设置的`ENV`环境变量,都会被`my_init`读取.
* 在Unix系统中,环境变量都会被子进程给继承.这就意味着,子进程不可能修改环境变量或者修改其他进程的环境变量.
* 由于上面提到的一点,这里没有一个可以为所有应用和服务集中定义环境的地方.Debian提供了一个`/etc/environment` 文件,解决一些问题.
* 某些服务更改环境变量是为了给子进程使用.Nginx有这样的一个例子:它移除了所有的环境变量,除非你通过`env`进行了配置,明确了某些是保留的.如果你部署了任何应用在Nginx镜像(例如:使用[passenger-docker](https://github.com/phusion/passenger-docker)镜像或者使用Phusion Passenger作为你的镜像.),那么你通过Docker,你不会看到任何环境变量.
`my_init`提供了一个办法来解决这些问题.
<a name="envvar_central_definition"></a>
#### 集中定义你的环境变量
在启动的时候,在执行[startup scripts](#running_startup_scripts),`my_init`会从`/etc/container_environment`导入环境变量.这个文件夹下面,包含的文件,文件被命名为环境变量的名字.文件内容就是环境变量的值.这个文件夹是因此是一个集中定义你的环境变量的好地方,它会继承到所有启动项目和Runit管理的服务中.
给个例子,在你的dockerfile如何定义一个环境变量:
RUN echo Apachai Hopachai > /etc/container_environment/MY_NAME
你可以按照下面这样验证:
$ docker run -t -i <YOUR_NAME_IMAGE> /sbin/my_init -- bash -l
...
*** Running bash -l...
# echo $MY_NAME
Apachai Hopachai
**换行处理**
如果你观察仔细一点,你会注意到'echo'命令,实际上在它是在新行打印出来的.为什么$MY_NAME没有包含在一行呢? 因为`my_init`在尾部有个换行字符.如果你打算让你的值包含一个新行,你需要增*另外*一个新字符,像这样:
RUN echo -e "Apachai Hopachai\n" > /etc/container_environment/MY_NAME
<a name="envvar_dumps"></a>
#### 环境变量存储
上面提到集中定义环境变量,它不会从子服务进程改变父服务进程或者重置环境变量.而且,`my_init`也会很容易的让你查询到原始的环境变量是什么.
在启动的时候,`/etc/container_environment`, `my_init`中的变量会存储起来,并且导入到环境变量中,例如一下的格式:
* `/etc/container_environment`
* `/etc/container_environment.sh`- 一个bash存储的环境变量格式.你可以从这个命令中得到base格式的文件.
* `/etc/container_environment.json` - 一个json格式存储的环境变量格式.
多种格式可以让你不管采用什么语言/apps都可以很容易使用环境变量.
这里有个例子,展示怎么使用:
$ docker run -t -i \
--env FOO=bar --env HELLO='my beautiful world' \
phusion/baseimage:<VERSION> /sbin/my_init -- \
bash -l
...
*** Running bash -l...
# ls /etc/container_environment
FOO HELLO HOME HOSTNAME PATH TERM container
# cat /etc/container_environment/HELLO; echo
my beautiful world
# cat /etc/container_environment.json; echo
{"TERM": "xterm", "container": "lxc", "HOSTNAME": "f45449f06950", "HOME": "/root", "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "FOO": "bar", "HELLO": "my beautiful world"}
# source /etc/container_environment.sh
# echo $HELLO
my beautiful world
<a name="modifying_envvars"></a>
#### 修改环境变量
通过修改`/etc/container_environment`这个文件,很有可能修改了`my_init`中的环境变量.之后,每次`my_init`启动[启动脚本](#running_startup_scripts),就会重置掉我们自己`/etc/container_environment`中的环境变量,也就会导致`container_environment.sh``container_environment.json`重新存储.
但是记住这些:
* 修改`container_environment.sh``container_environment.json`是没有效果的.
* Runit 的服务是不能像这样修改环境变量的.`my_init`运行的时候,只对`/etc/container_environment`中的修改是生效的.
<a name="envvar_security"></a>
#### 安全
因为环境变量可能包含敏感信息, `/etc/container_environment`和它的bash文件和JSON文件,默认都是root,都是可以被`docker_env`群组可以访问的(所以任何用户只要添加到群组中,都可以自动的获取这些信息).
如果你确定你的环境变量中没有什么敏感信息,那么你可以放松管理权限,将文件夹和文件分配下面的权限:
RUN chmod 755 /etc/container_environment
RUN chmod 644 /etc/container_environment.sh /etc/container_environment.json
<a name="workaroud_modifying_etc_hosts"></a>
### 解决Docker没有办法解决的/etc/hosts的问题
当前是没有办法在docker容器中修改`/etc/hosts`,这个是因为[Docker bug 2267](https://github.com/dotcloud/docker/issues/2267).Baseimage-docker包含了解决这个问题的办法,你必须明白是怎么修改的.
修改的办法包含在系统库中的` libnss_files.so.2`文件,这个文件使用`/etc/workaround-docker-2267/hosts`来代替系统使用`/etc/hosts`.如果需要修改`/etc/hosts`,你只要修改`/etc/workaround-docker-2267/hosts`就可以了.
增加这个修改到你的Dockerfile.下面的命令修改了文件`libnss_files.so.2`.
RUN /usr/bin/workaround-docker-2267
(其实你不用在Dockerfile文件中运行这个命令,你可以在容器中运行一个shell就可以了.)
验证一下它是否生效了,[在你的容器中打开一个shell](#inspecting),修改`/etc/workaround-docker-2267/hosts`,检查一下是否生效了:
bash# echo 127.0.0.1 my-test-domain.com >> /etc/workaround-docker-2267/hosts
bash# ping my-test-domain.com
...should ping 127.0.0.1...
**注意apt-get升级:** 如果Ubuntu升级,就有可能将`libnss_files.so.2`覆盖掉,那么修改就会失效.你必须重新运行`/usr/bin/workaround-docker-2267`.为了安全一点,你应该在运行`apt-get upgrade`之后,运行一下这个命令.
<a name="disabling_ssh"></a>
### 禁用SSH
Baseimage-docker默认是支持SSH的,所以可以[使用SSH](#login_ssh)来[管理你的容器](#container_administration).万一你不想支持SSH,你只要禁用它就可以:
RUN rm -rf /etc/service/sshd /etc/my_init.d/00_regen_ssh_host_keys.sh
<a name="container_administration"></a>
## 容器管理
一个优秀的docker想法,就是docker是一个无状态的,容易启动的容器,就想一个黑盒子.然而,你可能遇到某种情况,需要登录到容器,或者运行命令在容器中.或者为了开发,需要查看或者debug的目的.这章就给你讲解怎么管理容器.
<a name="oneshot"></a>
### 在一个新容器中运行一个一闪而过的命令
_**备注:** 这章讲解怎么在一个-新-容器中运行命令.要在一个存在的容器中运行命令,请查看[在一个存在的容器中,运行一个命令](#run_inside_existing_container)._
正常情况下,当你创建了一个新容器,为了在容器中运行一个单独的命令,而且在运行之后会立即退出的,你会这样调用docker命令:
docker run YOUR_IMAGE COMMAND ARGUMENTS...
然而下面的方法初始化系统的进行是不会启动.它是这样的,当调用`COMMAND`的时候,重要的后台进程,例如定时任务和系统日志都是不运行的.同样,子进程也是不会出现的,因为`COMMAND`的pid是1.
Baseimage-docker提供了一个灵活的方式运行只要一闪而过的命令,同时也解决了上述所说的问题.以一下的方式运行一条命令:
docker run YOUR_IMAGE /sbin/my_init -- COMMAND ARGUMENTS ...
他们会按照下面的流程执行:
* 运行所有的启动文件,例如 /etc/my_init.d/* and /etc/rc.local.
* 运行所有的runit服务
* 运行指定的命令
* 运行指定的命令结束之后,结束所有runit服务.
例如:
$ docker run phusion/baseimage:<VERSION> /sbin/my_init -- ls
*** Running /etc/my_init.d/00_regen_ssh_host_keys.sh...
No SSH host key available. Generating one...
Creating SSH2 RSA key; this may take some time ...
Creating SSH2 DSA key; this may take some time ...
Creating SSH2 ECDSA key; this may take some time ...
*** Running /etc/rc.local...
*** Booting runit daemon...
*** Runit started as PID 80
*** Running ls...
bin boot dev etc home image lib lib64 media mnt opt proc root run sbin selinux srv sys tmp usr var
*** ls exited with exit code 0.
*** Shutting down runit daemon (PID 80)...
*** Killing all processes...
你会发现默认的启动流程太复杂或者你不希望执行启动文件, 你可以自定义这些参数传递给 `my_init`. 调用`docker run YOUR_IMAGE /sbin/my_init --help`可以看到帮助信息.
例如上面运行`ls`命令,同时要求不运行启动脚本,减少信息打印,运行runit所有命令.
$ docker run phusion/baseimage:<VERSION> /sbin/my_init --skip-startup-files --quiet -- ls
bin boot dev etc home image lib lib64 media mnt opt proc root run sbin selinux srv sys tmp usr var
<a name="run_inside_existing_container"></a>
### 在一个已经运行的容器中,运行一条命令
这里有两种办法, 在一个已经运行的容器内执行命令.
* 通过`nseneter`工具. 这个工具用于Linux内核调用在内嵌容器中运行命令. 可以查看[通过`nsenter`,登录容器或者在容器内执行命令](#login_nsenter).
* 通过SSH.这种办法需要在容器中运行ssh服务,而且需要你创建自己的sshkey. 可以查看[通过`ssh`,登录容器或者在容器内执行命令](#login_ssh).
两种方法都是他们各自的优点和确定, 你可以学习他们各自的章节来了解他们.
<a name="login_nsenter"></a>
### 通过`nsenter`,登录容器或者在容器内执行命令
你可以使用在docker主机上面的`nsenter`工具,来登录任何基于baseimage-docker的docker容器.你可以使用它在你的容器中运行命令.
这里有个和[通过`ssh`,登录容器或者在容器内执行命令](#login_ssh)的优缺点的比较:
* 优点
* 不需要在容器中运行ssh服务.
* 不需要ssh key.
* 运行在任何容器上,甚至不是基于baseimage-docker的容器.
* 缺点
* 通过`nsenter`运行的进程会和正常运行稍微有不同.例如,他们不同结束掉在容器中正常运行的进程.这适用于所有的子进程.
* 如果`nsenter`进程被其他命令(如`kill`命令)给终止,然后由nsenter所执行的命令,是*不会*被结束的.你将不得不手动清理.(备注:终端控制命令像Ctrl-C ** 清理所有的子进程,因为终端信号被发送到所有流程的终端会话)
* 需要学习新工具.
* 需要在docker主机上面提供root权限.
* 需要在docker主机上面是可用的.在写这篇文字的时候(2014年7月),大多数linux发行版没有加载它.然而,baseimage-docker提供了预编译的二进制文件,允许你通过[docker-bash](#docker_bash)工具,来很容易的使用它.
* 不可能没有登录到docker主机,就登录到docker容器中.(也就是说,你必须登录到docker主机,通过docker主机登录到容器.)
<a name="nsenter_usage"></a>
#### 用例
第一,确定`nsenter`已经安装了.在写这篇文字的时候(2014年7月),大多数linux发行版没有加载它.然而,baseimage-docker提供了预编译的二进制文件,允许你通过[docker-bash](#docker_bash)工具,让任何人都可以使用.
接着,启动一个容器.
docker run YOUR_IMAGE
找出你刚才运行容器的`ID`.
docker ps
一旦得到容器的id, 找到运行容器的主进程`PID`.
docker inspect -f "{{ .State.Pid }}" <ID>
现在你已得到容器的主进程PID, 就可以使用`nsenter`来登录容器, 或者在容器中执行命令:
# 登录容器
nsenter --target <MAIN PROCESS PID> --mount --uts --ipc --net --pid bash -l
# 在容器中执行命令
nsenter --target <MAIN PROCESS PID> --mount --uts --ipc --net --pid -- echo hello world
<a name="docker_bash"></a>
#### `docker-bash`工具
目前(2017-03-31), 英文文档没有发现这个命令
查找一个容器的主要进程的PID和输入这么长的nsenter命令很快会变得乏味无比.幸运的是,我们提供了一个`docker-bash` 工具,它可以自动完成只要的工具.这个工具是运行在*docker主机*上面,不是在docker容器中.
该工具还附带了一个预编译的二进制`nsenter`,这样你不需要自己安装`nsenter`了.`docker-bash`是很简单的使用的.
首先,在docker主机上安装这个工具:
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
运行这个工具登录到容器中:
docker-bash YOUR-CONTAINER-ID
你可以通过`docker ps`来查找你的容器ID.
默认,`docker-bash`会打开一个bash 回话.你可以告诉运行什么命令,之后就会自动退出:
docker-bash YOUR-CONTAINER-ID echo hello world
<a name="login_ssh"></a>
### 通过`ssh`,登录容器或者在容器内执行命令
你可以使用ssh来登录任何基于baseimage-docker的容器.你可以使用它在容器中执行命令.
这里有个和[通过`nsenter`,登录容器或者在容器内执行命令](#login_nsenter)的优缺点的比较:
* 优点
* 不像`nsenter`一样,运行在docker主机上面.几乎每个人都会安装一个ssh客户端.
* 不想使用`nsenter`,运行的进程和正在的进程会不一样.
* 不需要docker主机提供root权限.
* 运行你让用户登录到容器,而不需要登录到docker主机.然而,默认这是不启用的,因为baseimage-docker默认不是开放ssh服务的.
* 缺点
* 需要设置ssh key.然而,baseimage-docker会提供一种方法,会让key的生成变得很容易.阅读更多信息.
第一件事情,就是你需要确定你在容器中已经安装设置了ssh key. 默认是不安装任何key的,所以任何人都无法登录.为了方便的原因,我们提供了一个[已经生成的key](https://github.com/phusion/baseimage-docker/blob/master/image/services/sshd/keys/insecure_key) [(PuTTY format)](https://github.com/phusion/baseimage-docker/blob/master/image/services/sshd/keys/insecure_key.ppk),为了让你使用方便.然后,请注意这个key仅仅是为方便.他没有任何安全性,因为它的key是在网络上提供的.**在生产环境,你必须使用你自己的key.**
<a name="using_the_insecure_key_for_one_container_only"></a>
#### 在容器中使用key
你可以临时的使用key仅仅作为容器使用.这就以为这key是安装在容器上的.如果你使用`docker stop``docker start`控制容器,那么key是在容器中,但是如果你使用`docker run`开启一个新容器,那么这个容器是不包含key的.
启动新容器包含key`--enable-insecure-key`:
docker run YOUR_IMAGE /sbin/my_init --enable-insecure-key
找出你的刚才运行的容器的ID:
docker ps
一旦你得到容器的ID,就能找到容器使用的IP地址:
docker inspect -f "{{ .NetworkSettings.IPAddress }}" <ID>
译者注: 类似 `"{{ .NetworkSettings.IPAddress }}"` 是用到了 [Go的模板语法](https://gohugo.io/templates/go-templates/).
现在你得到了IP地址, 你就可以通过SSH来登录容器,或者在容器中执行命令了:
# 下载key
curl -o insecure_key -fSL https://github.com/phusion/baseimage-docker/raw/master/image/services/sshd/keys/insecure_key
chmod 600 insecure_key
# 登录容器
ssh -i insecure_key root@<IP address>
# 在容器中执行命令
ssh -i insecure_key root@<IP address> echo hello world
<a name="enabling_the_insecure_key_permanently"></a>
#### 支持一个长久的key
在一个长久存在的镜像中支持一个key是很可能的.一般是不推荐这么做,但是对于临时开始或者做demo演示,对安全要求不高,还是很合适的.
编辑你的dockerfile,来安装永久的key:
RUN /usr/sbin/enable_insecure_key
在容器中怎么使用,同[在容器中使用key](#using_the_insecure_key_for_one_container_only)的章节说的一样.
<a name="using_your_own_key"></a>
#### 使用你自己的key
编辑你的dockerfile,来安装ssh public key:
## 安装你自己的public key.
COPY your_key.pub /tmp/your_key.pub
RUN cat /tmp/your_key.pub >> /root/.ssh/authorized_keys && rm -f /tmp/your_key.pub
重新创建你的镜像.一旦你创建成功,启动基于这个镜像的容器.
docker run your-image-name
找出你的刚才运行的容器的ID:
docker ps
一旦你拥有容器的ID,就能找到容器使用的IP地址:
docker inspect -f "{{ .NetworkSettings.IPAddress }}" <ID>
现在你有得了IP地址,你就可以通过SSH来登录容器,或者在容器中执行命令了:
# 登录容器
ssh -i /path-to/your_key root@<IP address>
# 在容器中执行命令
ssh -i /path-to/your_key root@<IP address> echo hello world
<a name="docker_ssh"></a>
#### `docker-ssh`工具
找到容器的IP,运行ssh命令,很快会变得乏味无聊.幸运的是,我们提供了一个`docker-ssh`,可以自动完成这些事情.这个工具是运行在*Docker 主机*上的,不是安装在docker容器中的.
首先,在docker主机上面安装这个工具.
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
使用这个工具通过ssh登录容器:
docker-ssh YOUR-CONTAINER-ID
你可以使用`docker ps`找到`YOUR-CONTAINER-ID`.
默认,`docker-bash`会打开一个bash 回话.你可以告诉运行什么命令,之后就会自动退出:
docker-ssh YOUR-CONTAINER-ID echo hello world
<a name="building"></a>
## 创建你自己的镜像
如果某些原因,你需要创建你自己的镜像,来替代从docker仓库下载镜像,可以按照的说明.
克隆仓库:
git clone https://github.com/phusion/baseimage-docker.git
cd baseimage-docker
创建一个包含docker在内的虚拟机.你可以使用我们提供的Vagrantfile.
vagrant up
vagrant ssh
cd /vagrant
编译镜像:
make build
如果你想修改镜像的名称, 通过`NAME`变量可以设置:
make build NAME=joe/baseimage
<a name="conclusion"></a>
## 总结
* Using baseimage-docker? [Tweet about us](https://twitter.com/share) or [follow us on Twitter](https://twitter.com/phusion_nl).
* Having problems? Want to participate in development? Please post a message at [the discussion forum](https://groups.google.com/d/forum/passenger-docker).
* 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).
[<img src="http://www.phusion.nl/assets/logo.png">](http://www.phusion.nl/)
Please enjoy baseimage-docker, a product by [Phusion](http://www.phusion.nl/). :-)

567
README_zh_tw.md Normal file
View File

@@ -0,0 +1,567 @@
<a name="a-minimal-ubuntu-base-image-modified-for-docker-friendliness"></a>
# Docker友好的最小的Ubuntu基礎鏡像
Baseimage-docker是一個特殊的[Docker](http://www.docker.io)鏡像在Docker容器內做了配置並且可以正確使用。它確實是一個Ubuntu系統, 除此之外進行了如下修訂:
* 爲更加友好的支持Docker做了修訂。
* 在Docker環境下作爲管理工具特別有用。
* 在[不違反Docker哲學](#docker_single_process)的前提下,能夠很容易的運行多行程的機制。
可以把它作爲自己的基礎Docker鏡像。
Baseimage-docker項目可以直接從Docker的[registry](https://index.docker.io/u/phusion/baseimage/)獲取!
<a name="what-are-the-problems-with-the-stock-ubuntu-base-image"></a>
### 原生的Ubuntu基礎鏡像有什麼問題呢
原生Ubuntu不是爲了在Docker內運行而設計的。它的初始化系統Upstart假定運行的環境要麼是真實的硬體要麼是虛擬的硬體而不是在Docker容器內。但是在一個Docker的容器內並不需要一個完整的系統你需要的只是一個很小的系統。但是如果你不是非常熟悉Unix的系統模型想要在Docker容器內裁減出最小的系統會碰到很多難以正確解決的陌生的技術坑。這些坑會引起很多莫名其妙的問題。
Baseimage-docker讓這一切完美。在"內容"部分描述了所有這些修改。
<a name="why-use-baseimage-docker"></a>
### 爲什麼使用baseimage-docker
你自己可以從Dockerfile配置一個原生`ubuntu`鏡像爲什麼還要多此一舉的使用baseimage-docker呢?
* 配置一個Docker友好的基礎系統並不是一個簡單的任務。如前所述過程中會碰到很多坑。當你搞定這些坑之後只不過是又重新發明了一個baseimage-docker而已。使用baseimage-docker可以免去你這方面需要做的努力。
* 減少需要正確編寫Dockerfile文件的時間。你不用再擔心基礎系統可以專注於你自己的技術棧和你的項目。
* 減少需要運行`docker build`的時間讓你更快的迭代Dockerfile。
* 減少了重新部署的時的下載時間。Docker只需要在第一次部署的時候下載一次基礎鏡像。在隨後的部署中,只需要改變你下載之後對基礎鏡像進行修改的部分。
-----------------------------------------
**相關資源**
[網站](http://phusion.github.io/baseimage-docker/) |
[Github](https://github.com/phusion/baseimage-docker) |
[Docker registry](https://index.docker.io/u/phusion/baseimage/) |
[論壇](https://groups.google.com/d/forum/passenger-docker) |
[Twitter](https://twitter.com/phusion_nl) |
[Blog](http://blog.phusion.nl/)
**目錄**
* [鏡像裏面有什麼?](#whats_inside)
* [概述](#whats_inside_overview)
* [等等,我認爲Docker在一個容器中只能允許運行一個行程?](#docker_single_process)
* [Baseimage-docker更側重於“胖容器”還是“把容器當作虛擬機”](#fat_containers)
* [查看baseimage-docker](#inspecting)
* [使用baseimage-docker作爲基礎鏡像](#using)
* [開始](#getting_started)
* [增加額外的後臺行程](#adding_additional_daemons)
* [容器啓動時運行腳本](#running_startup_scripts)
* [環境變數](#environment_variables)
* [集中定義自己的環境變數](#envvar_central_definition)
* [保存環境變數](#envvar_dumps)
* [修改環境變數](#modifying_envvars)
* [安全性](#envvar_security)
* [容器管理](#container_administration)
* [在一個新容器中運行單條命令](#oneshot)
* [在正在運行的的容器中運行一條命令](#run_inside_existing_container)
* [通過`docer exec`登錄容器](#login_docker_exec)
* [用法](#nsenter_usage)
* [使用SSH登錄容器](#login_ssh)
* [啓用SSH](#enabling_ssh)
* [關於SSH的key](#ssh_keys)
* [只對一個容器使用不安全key](#using_insecure_key_for_one_container_only)
* [永久開啓不安全key](#enabling_the_insecure_key_permanently)
* [使用你自己的key](#using_your_own_key)
* [`docker-ssh`工具](#docker_ssh)
* [構建自己的鏡像](#building)
* [總結](#conclusion)
-----------------------------------------
<a name="whats_inside"></a>
## 鏡像裏面有什麼?
<a name="whats_inside_overview"></a>
### 概述
*想看一個裏面包含RubyPythonNode.js以及Meteor的完整基礎鏡像可以看一下[passenger-docker](https://github.com/phusion/passenger-docker)。*
| 模塊 | 爲什麼包含這些?以及備註 |
| ---------------- | ------------------- |
| Ubuntu 16.04 LTS | 基礎系統。 |
| 一個**正確**的初始化行程 | *主要文章:[Docker和PID 1 殭屍行程回收問題](http://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/)*<br/><br/>根據Unix行程模型[初始化行程](https://en.wikipedia.org/wiki/Init) -- PID 1 -- 繼承了所有[孤立的子行程](https://en.wikipedia.org/wiki/Orphan_process),並且必須[進行回收](https://en.wikipedia.org/wiki/Wait_(system_call))。大多數Docker容器沒有一個初始化行程可以正確的完成此操作隨着時間的推移會導致他們的容器出現了大量的[殭屍行程](https://en.wikipedia.org/wiki/Zombie_process)。<br/><br/>而且,`docker stop`發送SIGTERM信號給初始化行程照理說此信號應該可以停止所有服務。不幸的是由於它們對硬體進行了關閉操作導致Docker內的大多數初始化系統沒有正確執行。這會導致行程強行被SIGKILL信號關閉從而喪失了一個正確取消初始化設置的機會。這會導致文件損壞。<br/><br/>Baseimage-docker配有一個名爲`/sbin/my_init`的初始化行程來同時正確的完成這些任務。 |
| 修復了APT與Docker不兼容的問題 | 詳情參見https://github.com/dotcloud/docker/issues/1024 。 |
| syslog-ng | 對於很多服務包括kernel自身都需要一個syslog後臺行程以便可以正確的將log輸出到/var/log/syslog中。如果沒有運行syslog後臺行程很多重要的信息就會默默的丟失了。<br/><br/>只對本地進行監聽。所有syslog信息會被轉發給“docker logs”。 |
| logrotate | 定期轉存和壓縮日誌。 |
| SSH服務 | 允許你很容易的登錄到容器中進行[查詢或管理](#login_ssh)操作。<br/><br/>_SSH**默認是禁用**的這也是baseimage-docker爲此目的提供的唯一方法。其它方法需要通過[docker exec](#login_docker_exec)。由於`docker exec`同時帶來了幾個需要注意的問題SSH同時也提供了一個可替換的方法。_<br/><br/>密碼和challenge-response認證方式默認是禁用的。只有key認證通過之後才能夠開啓。 |
| cron | 爲了保證cron任務能夠工作必須運行cron後臺行程。 |
| [runit](http://smarden.org/runit/) | 替換Ubuntu的Upstart。用於服務監控和管理。比SysV init更容易使用同時當這些服務崩潰之後支持後臺行程自動重啓。比Upstart更易使用更加的輕量級。 |
| `setuser` | 使用其它賬戶運行命令的工具。比`su`更容易使用,比使用`sudo`有那麼一點優勢,跟`chpst`不同,這個工具需要正確的設置`$HOME`。像`/sbin/setuser`這樣。 |
Baseimage-docker非常的輕量級僅僅佔用6MB內存。
<a name="docker_single_process"></a>
### 等等,我認爲Docker在一個容器中就運行一個行程嗎?
絕對不是這樣的. 在一個docker容器中,運行多個行程也是很好的. 事實上,沒有什麼技術原因限制你只運行一個行程,運行很多的行程,只會把容器中系統的基本功能搞的更亂,比如syslog.
Baseimage-docker *鼓勵* 通過runit來運行多行程.
<a name="inspecting"></a>
## 檢測一下baseimage-docker
要檢測鏡像,執行下面的命令:
docker run --rm -t -i phusion/baseimage:<VERSION> /sbin/my_init -- bash -l
`<VERSION>` 是[baseimage-docker的版本號](https://github.com/phusion/baseimage-docker/blob/master/Changelog.md).
你不用手動去下載任何文件.上面的命令會自動從docker倉庫下載baseimage-docker鏡像.
<a name="using"></a>
## 使用baseimage-docker作爲基礎鏡像
<a name="getting_started"></a>
### 入門指南
The image is called `phusion/baseimage`, and is available on the Docker registry.
鏡像名字叫`phusion/baseimage`,在Docker倉庫上也是可用的.
下面的這個是一個Dockerfile的模板.
# 使用phusion/baseimage作爲基礎鏡像,去構建你自己的鏡像,需要下載一個明確的版本,千萬不要使用`latest`.
# 查看https://github.com/phusion/baseimage-docker/blob/master/Changelog.md,可用看到版本的列表.
FROM phusion/baseimage:<VERSION>
# 設置正確的環境變數.
ENV HOME /root
# 生成SSH keys,baseimage-docker不包含任何的key,所以需要你自己生成.你也可以註釋掉這句命令,系統在啓動過程中,會生成一個.
RUN /etc/my_init.d/00_regen_ssh_host_keys.sh
# 初始化baseimage-docker系統
CMD ["/sbin/my_init"]
# 這裏可以放置你自己需要構建的命令
# 當完成後,清除APT.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
<a name="adding_additional_daemons"></a>
### 增加後臺行程
你可以通過runit工具向你的鏡像中添加後臺行程(例如:你自己的某些應用).你需要編寫一個運行你需要的後臺行程的腳本就可以了,runit工具會保證它的正常運行,如果行程死掉,runit也會重啓它的.
腳本的名稱必須是`run`,必須是可以運行的,它需要放到`/etc/service/<NAME>`.
這裏有一個例子,向你展示如果運行memcached服務的.
### memcached.sh(確定文件的權限是chmod +x):
#!/bin/sh
# `/sbin/setuser memcache` 指定一個`memcache`用戶來運行命令.如果你忽略了這部分,就會使用root用戶執行.
exec /sbin/setuser memcache /usr/bin/memcached >>/var/log/memcached.log 2>&1
### 在Dockerfile中:
RUN mkdir /etc/service/memcached
COPY memcached.sh /etc/service/memcached/run
注意腳本必須運行在後臺的,**不能讓他們行程進行daemonize/fork**.通常,後臺行程會提供一個標誌位或者配置文件.
<a name="running_startup_scripts"></a>
### 在容器啓動的時候,運行腳本.
baseimage-docker的初始化腳本 `/sbin/my_init`,在啓動的時候行程運行,按照下面的順序:
* 如果`/etc/my_init.d`存在,則按照字母順序執行腳本.
* 如果`/etc/rc.local`存在,則執行裏面的腳本.
所有的腳本都是正確退出的,例如:退出的code是0.如果有任何腳本以非0的code退出,啓動就會失敗.
下面的例子向你展示了怎麼添加一個啓動腳本.這個腳本很簡單的記錄的一個系統啓動時間,將啓動時間記錄到/tmp/boottime.txt.
### 在 logtime.sh (文件權限chmod +x):
#!/bin/sh
date > /tmp/boottime.txt
### 在 Dockerfile中:
RUN mkdir -p /etc/my_init.d
COPY logtime.sh /etc/my_init.d/logtime.sh
<a name="environment_variables"></a>
### 環境變數
如果你使用`/sbin/my_init`作爲主容器命令,那麼通過`docker run --env`或者在Dockerfile文件中設置的`ENV`環境變數,都會被`my_init`讀取.
* 在Unix系統中,環境變數都會被子行程給繼承.這就意味着,子行程不可能修改環境變數或者修改其他行程的環境變數.
* 由於上面提到的一點,這裏沒有一個可以爲所有應用和服務集中定義環境的地方.Debian提供了一個`/etc/environment` 文件,解決一些問題.
* 某些服務更改環境變數是爲了給子行程使用.Nginx有這樣的一個例子:它移除了所有的環境變數,除非你通過`env`進行了配置,明確了某些是保留的.如果你部署了任何應用在Nginx鏡像(例如:使用[passenger-docker](https://github.com/phusion/passenger-docker)鏡像或者使用Phusion Passenger作爲你的鏡像.),那麼你通過Docker,你不會看到任何環境變數.
`my_init`提供了一個辦法來解決這些問題.
<a name="envvar_central_definition"></a>
#### 集中定義你的環境變數
在啓動的時候,在執行[startup scripts](#running_startup_scripts),`my_init`會從`/etc/container_environment`導入環境變數.這個文件夾下面,包含的文件,文件被命名爲環境變數的名字.文件內容就是環境變數的值.這個文件夾是因此是一個集中定義你的環境變數的好地方,它會繼承到所有啓動項目和Runit管理的服務中.
給個例子,在你的dockerfile如何定義一個環境變數:
RUN echo Apachai Hopachai > /etc/container_environment/MY_NAME
你可以按照下面這樣驗證:
$ docker run -t -i <YOUR_NAME_IMAGE> /sbin/my_init -- bash -l
...
*** Running bash -l...
# echo $MY_NAME
Apachai Hopachai
**換行處理**
如果你觀察仔細一點,你會注意到'echo'命令,實際上在它是在新行打印出來的.爲什麼$MY_NAME沒有包含在一行呢? 因爲`my_init`在尾部有個換行字符.如果你打算讓你的值包含一個新行,你需要增*另外*一個新字符,像這樣:
RUN echo -e "Apachai Hopachai\n" > /etc/container_environment/MY_NAME
<a name="envvar_dumps"></a>
#### 環境變數存儲
上面提到集中定義環境變數,它不會從子服務行程改變父服務行程或者重置環境變數.而且,`my_init`也會很容易的讓你查詢到原始的環境變數是什麼.
在啓動的時候,`/etc/container_environment`, `my_init`中的變數會存儲起來,並且導入到環境變數中,例如一下的格式:
* `/etc/container_environment`
* `/etc/container_environment.sh`- 一個bash存儲的環境變數格式.你可以從這個命令中得到base格式的文件.
* `/etc/container_environment.json` - 一個json格式存儲的環境變數格式.
多種格式可以讓你不管採用什麼語言/apps都可以很容易使用環境變數.
這裏有個例子,展示怎麼使用:
$ docker run -t -i \
--env FOO=bar --env HELLO='my beautiful world' \
phusion/baseimage:<VERSION> /sbin/my_init -- \
bash -l
...
*** Running bash -l...
# ls /etc/container_environment
FOO HELLO HOME HOSTNAME PATH TERM container
# cat /etc/container_environment/HELLO; echo
my beautiful world
# cat /etc/container_environment.json; echo
{"TERM": "xterm", "container": "lxc", "HOSTNAME": "f45449f06950", "HOME": "/root", "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "FOO": "bar", "HELLO": "my beautiful world"}
# source /etc/container_environment.sh
# echo $HELLO
my beautiful world
<a name="modifying_envvars"></a>
#### 修改環境變數
通過修改`/etc/container_environment`這個文件,很有可能修改了`my_init`中的環境變數.之後,每次`my_init`啓動[啓動腳本](#running_startup_scripts),就會重置掉我們自己`/etc/container_environment`中的環境變數,也就會導致`container_environment.sh``container_environment.json`重新存儲.
但是記住這些:
* 修改`container_environment.sh``container_environment.json`是沒有效果的.
* Runit 的服務是不能像這樣修改環境變數的.`my_init`運行的時候,只對`/etc/container_environment`中的修改是生效的.
<a name="envvar_security"></a>
#### 安全
因爲環境變數可能包含敏感信息, `/etc/container_environment`和它的bash文件和JSON文件,默認都是root,都是可以被`docker_env`羣組可以訪問的(所以任何用戶只要添加到羣組中,都可以自動的獲取這些信息).
如果你確定你的環境變數中沒有什麼敏感信息,那麼你可以放鬆管理權限,將文件夾和文件分配下面的權限:
RUN chmod 755 /etc/container_environment
RUN chmod 644 /etc/container_environment.sh /etc/container_environment.json
<a name="workaroud_modifying_etc_hosts"></a>
### 解決Docker沒有辦法解決的/etc/hosts的問題
當前是沒有辦法在docker容器中修改`/etc/hosts`,這個是因爲[Docker bug 2267](https://github.com/dotcloud/docker/issues/2267).Baseimage-docker包含了解決這個問題的辦法,你必須明白是怎麼修改的.
修改的辦法包含在系統庫中的` libnss_files.so.2`文件,這個文件使用`/etc/workaround-docker-2267/hosts`來代替系統使用`/etc/hosts`.如果需要修改`/etc/hosts`,你只要修改`/etc/workaround-docker-2267/hosts`就可以了.
增加這個修改到你的Dockerfile.下面的命令修改了文件`libnss_files.so.2`.
RUN /usr/bin/workaround-docker-2267
(其實你不用在Dockerfile文件中運行這個命令,你可以在容器中運行一個shell就可以了.)
驗證一下它是否生效了,[在你的容器中打開一個shell](#inspecting),修改`/etc/workaround-docker-2267/hosts`,檢查一下是否生效了:
bash# echo 127.0.0.1 my-test-domain.com >> /etc/workaround-docker-2267/hosts
bash# ping my-test-domain.com
...should ping 127.0.0.1...
**注意apt-get升級:** 如果Ubuntu升級,就有可能將`libnss_files.so.2`覆蓋掉,那麼修改就會失效.你必須重新運行`/usr/bin/workaround-docker-2267`.爲了安全一點,你應該在運行`apt-get upgrade`之後,運行一下這個命令.
<a name="disabling_ssh"></a>
### 禁用SSH
Baseimage-docker默認是支持SSH的,所以可以[使用SSH](#login_ssh)來[管理你的容器](#container_administration).萬一你不想支持SSH,你可以只要禁用它:
RUN rm -rf /etc/service/sshd /etc/my_init.d/00_regen_ssh_host_keys.sh
<a name="container_administration"></a>
## 容器管理
一個優秀的docker想法,就是docker是一個無狀態的,容易啓動的容器,就想一個黑盒子.然而,你可能遇到某種情況,需要登錄到容器,或者運行命令在容器中.或者爲了開發,需要查看或者debug的目的.這章就給你講解怎麼管理容器.
<a name="oneshot"></a>
### 在一個新容器中運行一個一閃而過的命令
_**備註:** 這章講解怎麼在一個-新-容器中運行命令.要在一個存在的容器中運行命令,請查看[在一個存在的容器中,運行一個命令](#run_inside_existing_container)._
正常情況下,當你創建了一個新容器,爲了在容器中運行一個單獨的命令,而且在運行之後會立即退出的,你會這樣調用docker命令:
docker run YOUR_IMAGE COMMAND ARGUMENTS...
然而下面的方法初始化系統的進行是不會啓動.它是這樣的,當調用`COMMAND`的時候,重要的後臺行程,例如定時任務和系統日誌都是不運行的.同樣,子行程也是不會出現的,因爲`COMMAND`的pid是1.
Baseimage-docker提供了一個靈活的方式運行只要一閃而過的命令,同時也解決了上述所說的問題.以一下的方式運行一條命令:
docker run YOUR_IMAGE /sbin/my_init -- COMMAND ARGUMENTS ...
他們會按照下面的流程執行:
* 運行所有的啓動文件,例如 /etc/my_init.d/* and /etc/rc.local.
* 運行所有的runit服務
* 運行指定的命令
* 運行指定的命令結束之後,結束所有runit服務.
例如:
$ docker run phusion/baseimage:<VERSION> /sbin/my_init -- ls
*** Running /etc/my_init.d/00_regen_ssh_host_keys.sh...
No SSH host key available. Generating one...
Creating SSH2 RSA key; this may take some time ...
Creating SSH2 DSA key; this may take some time ...
Creating SSH2 ECDSA key; this may take some time ...
*** Running /etc/rc.local...
*** Booting runit daemon...
*** Runit started as PID 80
*** Running ls...
bin boot dev etc home image lib lib64 media mnt opt proc root run sbin selinux srv sys tmp usr var
*** ls exited with exit code 0.
*** Shutting down runit daemon (PID 80)...
*** Killing all processes...
你會發現默認的啓動的流程太負責.或者你不希望執行啓動文件.你可以自定義所有通過給`my_init`增加參數.調用`docker run YOUR_IMAGE /sbin/my_init --help`可以看到幫助信息.
例如上面運行`ls`命令,同時要求不運行啓動腳本,減少信息打印,運行runit所有命令.
$ docker run phusion/baseimage:<VERSION> /sbin/my_init --skip-startup-files --quiet -- ls
bin boot dev etc home image lib lib64 media mnt opt proc root run sbin selinux srv sys tmp usr var
<a name="run_inside_existing_container"></a>
### 在一個已經運行的容器中,運行一條命令
這裏有兩種辦法去在一個已經運行的容器中運行命令.
* 通過`nseneter`工具.這個工具用於Linux內核調用在內嵌容器中運行命令.可以查看[通過`nsenter`,登錄容器或者在容器內執行命令](#login_nsenter).
* 通過SSH.這種辦法需要在容器中運行ssh服務,而且需要你創建自己的sshkey.可以查看[通過`ssh`,登錄容器或者在容器內執行命令](#login_ssh).
兩種方法都是他們各自的優點和確定,你可以學習他們各自的章節來了他們.
<a name="login_nsenter"></a>
### 通過`nsenter`,登錄容器或者在容器內執行命令
你可以使用在docker主機上面的`nsenter`工具,來登錄任何基於baseimage-docker的docker容器.你可以使用它在你的容器中運行命令.
這裏有個和[通過`ssh`,登錄容器或者在容器內執行命令](#login_ssh)的優缺點的比較:
* 優點
* 不需要在容器中運行ssh服務.
* 不需要ssh key.
* 運行在任何容器上,甚至不是基於baseimage-docker的容器.
* 缺點
* 通過`nsenter`運行的行程會和正常運行稍微有不同.例如,他們不同結束掉在容器中正常運行的行程.這適用於所有的子行程.
* 如果`nsenter`行程被其他命令(如`kill`命令)給終止,然後由nsenter所執行的命令,是*不會*被結束的.你將不得不手動清理.(備註:終端控制命令像Ctrl-C ** 清理所有的子行程,因爲終端信號被髮送到所有流程的終端會話)
* 需要學習新工具.
* 需要在docker主機上面提供root權限.
* 需要在docker主機上面是可用的.在寫這篇文字的時候(2014年7月),大多數linux發行版沒有加載它.然而,baseimage-docker提供了預編譯的二進制文件,允許你通過[docker-bash](#docker_bash)工具,來很容易的使用它.
* 不可能沒有登錄到docker主機,就登錄到docker容器中.(也就是說,你必須登錄到docker主機,通過docker主機登錄到容器.)
<a name="nsenter_usage"></a>
#### 用例
第一,確定`nsenter`已經安裝了.在寫這篇文字的時候(2014年7月),大多數linux發行版沒有加載它.然而,baseimage-docker提供了預編譯的二進制文件,允許你通過[docker-bash](#docker_bash)工具,讓任何人都可以使用.
接着,啓動一個容器.
docker run YOUR_IMAGE
找出你剛纔運行容器的`ID`.
docker ps
一旦擁有容器的id,找到運行容器的主要行程額`PID`.
docker inspect -f "{{ .State.Pid }}" <ID>
現在你有的容器的主行程的PID,就可以使用`nsenter`來登錄容器,或者在容器裏面執行命令:
# 登錄容器
nsenter --target <MAIN PROCESS PID> --mount --uts --ipc --net --pid bash -l
# 在容器中執行命令
nsenter --target <MAIN PROCESS PID> --mount --uts --ipc --net --pid -- echo hello world
<a name="docker_bash"></a>
#### `docker-bash`工具
查找一個容器的主要行程的PID和輸入這麼長的nsenter命令很快會變得乏味無論.幸運的是,我們提供了一個`docker-bash` 工具,它可以自動完成只要的工具.這個工具是運行在*docker主機*上面,不是在docker容器中.
該工具還附帶了一個預編譯的二進制`nsenter`,這樣你不需要自己安裝`nsenter`了.`docker-bash`是很簡單的使用的.
首先,在docker主機上安裝這個工具:
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
運行這個工具登錄到容器中:
docker-bash YOUR-CONTAINER-ID
你可以通過`docker ps`來查找你的容器ID.
默認,`docker-bash`會打開一個bash 回話.你可以告訴運行什麼命令,之後就會自動退出:
docker-bash YOUR-CONTAINER-ID echo hello world
<a name="login_ssh"></a>
### 通過`ssh`,登錄容器或者在容器內執行命令
你可以使用ssh來登錄任何基於baseimage-docker的容器.你可以使用它在容器中執行命令.
這裏有個和[通過`nsenter`,登錄容器或者在容器內執行命令](#login_nsenter)的優缺點的比較:
* 優點
* 不像`nsenter`一樣,運行在docker主機上面.幾乎每個人都會安裝一個ssh客戶端.
* 不想使用`nsenter`,運行的行程和正在的行程會不一樣.
* 不需要docker主機提供root權限.
* 運行你讓用戶登錄到容器,而不需要登錄到docker主機.然而,默認這是不啓用的,因爲baseimage-docker默認不是開放ssh服務的.
* 缺點
* 需要設置ssh key.然而,baseimage-docker會提供一中辦法,會讓key的生成會很容易.閱讀更多信息.
第一件事情,就是你需要確定你在容器中已經安裝設置了ssh key. 默認是不安裝任何key的,所以任何人都無法登錄.爲了方便的原因,我們提供了一個[已經生成的key](https://github.com/phusion/baseimage-docker/blob/master/image/services/sshd/keys/insecure_key) [(PuTTY format)](https://github.com/phusion/baseimage-docker/blob/master/image/services/sshd/keys/insecure_key.ppk),爲了讓你使用方便.然後,請注意這個key僅僅是爲方便.他沒有任何安全性,因爲它的key是在網絡上提供的.**在生產環境,你必須使用你自己的key.**
<a name="using_the_insecure_key_for_one_container_only"></a>
#### 在容器中使用key
你可以臨時的使用key僅僅作爲容器使用.這就以爲這key是安裝在容器上的.如果你使用`docker stop``docker start`控制容器,那麼key是在容器中,但是如果你使用`docker run`開啓一個新容器,那麼這個容器是不包含key的.
啓動新容器包含key`--enable-insecure-key`:
docker run YOUR_IMAGE /sbin/my_init --enable-insecure-key
找出你的剛纔運行的容器的ID:
docker ps
一旦你擁有容器的ID,就能找到容器使用的IP地址:
docker inspect -f "{{ .NetworkSettings.IPAddress }}" <ID>
現在你有得了IP地址,你就看通過SSH來登錄容器,或者在容器中執行命令了:
# 下載key
curl -o insecure_key -fSL https://github.com/phusion/baseimage-docker/raw/master/image/services/sshd/keys/insecure_key
chmod 600 insecure_key
# 登錄容器
ssh -i insecure_key root@<IP address>
# 在容器中執行命令
ssh -i insecure_key root@<IP address> echo hello world
<a name="enabling_the_insecure_key_permanently"></a>
#### 支持一個長久的key
在一個長久存在的鏡像中支持一個key是很可能的.一般是不推薦這麼做,但是對於臨時開始或者做demo演示,對安全要求不高,還是很合適的.
編輯你的dockerfile,來安裝永久的key:
RUN /usr/sbin/enable_insecure_key
在容器中怎麼使用,同[在容器中使用key](#using_the_insecure_key_for_one_container_only)的章節說的一樣.
<a name="using_your_own_key"></a>
#### 使用你自己的key
編輯你的dockerfile,來安裝ssh public key:
## 安裝你自己的public key.
COPY your_key.pub /tmp/your_key.pub
RUN cat /tmp/your_key.pub >> /root/.ssh/authorized_keys && rm -f /tmp/your_key.pub
重新創建你的鏡像.一旦你創建成功,啓動基於這個鏡像的容器.
docker run your-image-name
找出你的剛纔運行的容器的ID:
docker ps
一旦你擁有容器的ID,就能找到容器使用的IP地址:
docker inspect -f "{{ .NetworkSettings.IPAddress }}" <ID>
現在你有得了IP地址,你就看通過SSH來登錄容器,或者在容器中執行命令了:
# 登錄容器
ssh -i /path-to/your_key root@<IP address>
# 在容器中執行命令
ssh -i /path-to/your_key root@<IP address> echo hello world
<a name="docker_ssh"></a>
#### `docker-ssh`工具
找到容器的IP,運行ssh命令,很快會變得乏味無聊.幸運的是,我們提供了一個`docker-ssh`,可以自動完成這些事情.這個工具是運行在*Docker 主機*上的,不是安裝在docker容器中的.
首先,在docker主機上面安裝這個工具.
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
使用這個工具通過ssh登錄容器:
docker-ssh YOUR-CONTAINER-ID
你可以使用`docker ps`找到`YOUR-CONTAINER-ID`.
默認,`docker-bash`會打開一個bash 回話.你可以告訴運行什麼命令,之後就會自動退出:
docker-ssh YOUR-CONTAINER-ID echo hello world
<a name="building"></a>
## 創建你自己的鏡像
如果某些原因,你需要創建你自己的鏡像,來替代從docker倉庫下載鏡像,可以按照的說明.
克隆倉庫:
git clone https://github.com/phusion/baseimage-docker.git
cd baseimage-docker
創建一個包含docker在的虛擬機.你可以使用我們提供的Vagrantfile.
vagrant up
vagrant ssh
cd /vagrant
編譯鏡像:
make build
如果你想把創建的鏡像名字,叫其他名字,通過`NAME`變數可以設置:
make build NAME=joe/baseimage
<a name="conclusion"></a>
## 總結
* Using baseimage-docker? [Tweet about us](https://twitter.com/share) or [follow us on Twitter](https://twitter.com/phusion_nl).
* Having problems? Want to participate in development? Please post a message at [the discussion forum](https://groups.google.com/d/forum/passenger-docker).
* 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).
[<img src="http://www.phusion.nl/assets/logo.png">](http://www.phusion.nl/)
Please enjoy baseimage-docker, a product by [Phusion](http://www.phusion.nl/). :-)

55
Vagrantfile vendored
View File

@@ -1,31 +1,54 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
ROOT = File.dirname(File.expand_path(__FILE__))
ROOT = File.dirname(File.absolute_path(__FILE__))
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
VAGRANTFILE_API_VERSION = '2'
# Default env properties which can be overridden
# Example overrides:
# 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
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-14.04-amd64-vbox.box'
VMWARE_BOX_URL = ENV['VMWARE_BOX_URL'] || BASE_BOX_URL + 'ubuntu-14.04-amd64-vmwarefusion.box'
BASEIMAGE_PATH = ENV['BASEIMAGE_PATH' ] || '.'
PASSENGER_DOCKER_PATH = ENV['PASSENGER_PATH' ] || '../passenger-docker'
DOCKERIZER_PATH = ENV['DOCKERIZER_PATH'] || '../dockerizer'
$script = <<SCRIPT
wget -q -O - https://get.docker.io/gpg | apt-key add -
echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
apt-get update -qq
apt-get install -q -y --force-yes lxc-docker
usermod -a -G docker vagrant
docker version
su - vagrant -c 'echo alias d=docker >> ~/.bash_aliases'
SCRIPT
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
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 = 'phusion-open-ubuntu-14.04-amd64'
config.vm.box_url = VAGRANT_BOX_URL
config.ssh.forward_agent = true
if File.directory?("#{ROOT}/../passenger-docker")
config.vm.synced_folder File.expand_path("#{ROOT}/../passenger-docker"),
"/vagrant/passenger-docker"
passenger_docker_path = File.absolute_path(PASSENGER_DOCKER_PATH, ROOT)
if File.directory?(passenger_docker_path)
config.vm.synced_folder passenger_docker_path, '/vagrant/passenger-docker'
end
baseimage_path = File.absolute_path(BASEIMAGE_PATH, ROOT)
if File.directory?(baseimage_path)
config.vm.synced_folder baseimage_path, "/vagrant/baseimage-docker"
end
dockerizer_path = File.absolute_path(DOCKERIZER_PATH, ROOT)
if File.directory?(dockerizer_path)
config.vm.synced_folder dockerizer_path, '/vagrant/dockerizer'
end
config.vm.provider :vmware_fusion do |f, override|
override.vm.box_url = "https://oss-binaries.phusionpassenger.com/vagrant/boxes/ubuntu-12.04.3-amd64-vmwarefusion.box"
f.vmx["displayName"] = "baseimage-docker"
override.vm.box_url = VMWARE_BOX_URL
f.vmx['displayName'] = 'baseimage-docker'
end
if Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id").empty?
# Add lxc-docker package
pkg_cmd = "wget -q -O - https://get.docker.io/gpg | apt-key add -;" \
"echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list;" \
"apt-get update -qq; apt-get install -q -y --force-yes lxc-docker; "
# Add vagrant user to the docker group
pkg_cmd << "usermod -a -G docker vagrant; "
config.vm.provision :shell, :inline => pkg_cmd
config.vm.provision :shell, :inline => $script
end
end

View File

@@ -1,14 +1,16 @@
FROM ubuntu:12.04
FROM ubuntu:16.04
MAINTAINER Phusion <info@phusion.nl>
ENV HOME /root
RUN mkdir /build
ADD . /build
COPY . /bd_build
RUN /build/prepare.sh && \
/build/system_services.sh && \
/build/utilities.sh && \
/build/cleanup.sh
RUN /bd_build/prepare.sh && \
/bd_build/system_services.sh && \
/bd_build/utilities.sh && \
/bd_build/cleanup.sh
ENV DEBIAN_FRONTEND="teletype" \
LANG="en_US.UTF-8" \
LANGUAGE="en_US:en" \
LC_ALL="en_US.UTF-8"
CMD ["/sbin/my_init"]
EXPOSE 22 80 443

17
image/bin/install_clean Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash -e
# Apt installer helper for Docker images
ARGS="$*"
NO_RECOMMENDS="--no-install-recommends"
RECOMMENDS="--install-recommends"
if [[ $ARGS =~ "$RECOMMENDS" ]]; then
NO_RECOMMENDS=""
ARGS=$(sed "s/$RECOMMENDS//g" <<<"$ARGS")
fi
echo "Installing $ARGS"
apt-get -q update && apt-get -qy install $NO_RECOMMENDS $ARGS \
&& apt-get -qy autoremove \
&& apt-get clean \
&& rm -r /var/lib/apt/lists/*

423
image/bin/my_init Executable file
View File

@@ -0,0 +1,423 @@
#!/usr/bin/python3 -u
# -*- coding: utf-8 -*-
import argparse
import errno
import json
import os
import os.path
import re
import signal
import stat
import sys
import time
ENV_INIT_DIRECTORY = os.environ.get('ENV_INIT_DIRECTORY', '/etc/my_init.d')
KILL_PROCESS_TIMEOUT = int(os.environ.get('KILL_PROCESS_TIMEOUT', 5))
KILL_ALL_PROCESSES_TIMEOUT = int(os.environ.get('KILL_ALL_PROCESSES_TIMEOUT', 5))
LOG_LEVEL_ERROR = 1
LOG_LEVEL_WARN = 1
LOG_LEVEL_INFO = 2
LOG_LEVEL_DEBUG = 3
SHENV_NAME_WHITELIST_REGEX = re.compile('\W')
log_level = None
terminated_child_processes = {}
_find_unsafe = re.compile(r'[^\w@%+=:,./-]').search
class AlarmException(Exception):
pass
def error(message):
if log_level >= LOG_LEVEL_ERROR:
sys.stderr.write("*** %s\n" % message)
def warn(message):
if log_level >= LOG_LEVEL_WARN:
sys.stderr.write("*** %s\n" % message)
def info(message):
if log_level >= LOG_LEVEL_INFO:
sys.stderr.write("*** %s\n" % message)
def debug(message):
if log_level >= LOG_LEVEL_DEBUG:
sys.stderr.write("*** %s\n" % message)
def ignore_signals_and_raise_keyboard_interrupt(signame):
signal.signal(signal.SIGTERM, signal.SIG_IGN)
signal.signal(signal.SIGINT, signal.SIG_IGN)
raise KeyboardInterrupt(signame)
def raise_alarm_exception():
raise AlarmException('Alarm')
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 import_envvars(clear_existing_environment=True, override_existing_environment=True):
if not os.path.exists("/etc/container_environment"):
return
new_env = {}
for envfile in listdir("/etc/container_environment"):
name = os.path.basename(envfile)
with open("/etc/container_environment/" + envfile, "r") as f:
# 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
if clear_existing_environment:
os.environ.clear()
for name, value in new_env.items():
if override_existing_environment or name not in os.environ:
os.environ[name] = value
def export_envvars(to_dir=True):
if not os.path.exists("/etc/container_environment"):
return
shell_dump = ""
for name, value in os.environ.items():
if name in ['HOME', 'USER', 'GROUP', 'UID', 'GID', 'SHELL']:
continue
if to_dir:
with open("/etc/container_environment/" + name, "w") as f:
f.write(value)
shell_dump += "export " + sanitize_shenvname(name) + "=" + shquote(value) + "\n"
with open("/etc/container_environment.sh", "w") as f:
f.write(shell_dump)
with open("/etc/container_environment.json", "w") as f:
f.write(json.dumps(dict(os.environ)))
def shquote(s):
"""Return a shell-escaped version of the string *s*."""
if not s:
return "''"
if _find_unsafe(s) is None:
return s
# use single quotes, and put single quotes into double quotes
# the string $'b is then quoted as '$'"'"'b'
return "'" + s.replace("'", "'\"'\"'") + "'"
def sanitize_shenvname(s):
"""Return string with [0-9a-zA-Z_] characters"""
return re.sub(SHENV_NAME_WHITELIST_REGEX, "_", s)
# 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):
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
status = None
while not done:
try:
# https://github.com/phusion/baseimage-docker/issues/151#issuecomment-92660569
this_pid, status = os.waitpid(pid, os.WNOHANG)
if this_pid == 0:
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
def stop_child_process(name, pid, signo=signal.SIGTERM, time_limit=KILL_PROCESS_TIMEOUT):
info("Shutting down %s (PID %d)..." % (name, pid))
try:
os.kill(pid, signo)
except OSError:
pass
signal.alarm(time_limit)
try:
try:
waitpid_reap_other_children(pid)
except OSError:
pass
except AlarmException:
warn("%s (PID %d) did not shut down in time. Forcing it to exit." % (name, pid))
try:
os.kill(pid, signal.SIGKILL)
except OSError:
pass
try:
waitpid_reap_other_children(pid)
except OSError:
pass
finally:
signal.alarm(0)
def run_command_killable(*argv):
filename = argv[0]
status = None
pid = os.spawnvp(os.P_NOWAIT, filename, argv)
try:
status = waitpid_reap_other_children(pid)
except BaseException:
warn("An error occurred. Aborting.")
stop_child_process(filename, pid)
raise
if status != 0:
if status is None:
error("%s exited with unknown status\n" % filename)
else:
error("%s failed with status %d\n" % (filename, os.WEXITSTATUS(status)))
sys.exit(1)
def run_command_killable_and_import_envvars(*argv):
run_command_killable(*argv)
import_envvars()
export_envvars(False)
def kill_all_processes(time_limit):
info("Killing all processes...")
try:
os.kill(-1, signal.SIGTERM)
except OSError:
pass
signal.alarm(time_limit)
try:
# Wait until no more child processes exist.
done = False
while not done:
try:
os.waitpid(-1, 0)
except OSError as e:
if e.errno == errno.ECHILD:
done = True
else:
raise
except AlarmException:
warn("Not all processes have exited in time. Forcing them to exit.")
try:
os.kill(-1, signal.SIGKILL)
except OSError:
pass
finally:
signal.alarm(0)
def run_startup_files():
# Run ENV_INIT_DIRECTORY/*
for name in listdir(ENV_INIT_DIRECTORY):
filename = os.path.join(ENV_INIT_DIRECTORY, name)
if is_exe(filename):
info("Running %s..." % filename)
run_command_killable_and_import_envvars(filename)
# Run /etc/rc.local.
if is_exe("/etc/rc.local"):
info("Running /etc/rc.local...")
run_command_killable_and_import_envvars("/etc/rc.local")
def run_pre_shutdown_scripts():
debug("Running pre-shutdown scripts...")
# Run /etc/my_init.pre_shutdown.d/*
for name in listdir("/etc/my_init.pre_shutdown.d"):
filename = "/etc/my_init.pre_shutdown.d/" + name
if is_exe(filename):
info("Running %s..." % filename)
run_command_killable(filename)
def run_post_shutdown_scripts():
debug("Running post-shutdown scripts...")
# Run /etc/my_init.post_shutdown.d/*
for name in listdir("/etc/my_init.post_shutdown.d"):
filename = "/etc/my_init.post_shutdown.d/" + name
if is_exe(filename):
info("Running %s..." % filename)
run_command_killable(filename)
def start_runit():
info("Booting runit daemon...")
pid = os.spawnl(os.P_NOWAIT, "/usr/bin/runsvdir", "/usr/bin/runsvdir",
"-P", "/etc/service")
info("Runit started as PID %d" % pid)
return pid
def wait_for_runit_or_interrupt(pid):
try:
status = waitpid_reap_other_children(pid)
return (True, status)
except KeyboardInterrupt:
return (False, None)
def shutdown_runit_services(quiet=False):
if not quiet:
debug("Begin shutting down runit services...")
os.system("/usr/bin/sv -w %d down /etc/service/* > /dev/null" % KILL_PROCESS_TIMEOUT)
def wait_for_runit_services():
debug("Waiting for runit services to exit...")
done = False
while not done:
done = os.system("/usr/bin/sv status /etc/service/* | grep -q '^run:'") != 0
if not done:
time.sleep(0.1)
# According to https://github.com/phusion/baseimage-docker/issues/315
# there is a bug or race condition in Runit, causing it
# not to shutdown services that are already being started.
# So during shutdown we repeatedly instruct Runit to shutdown
# services.
shutdown_runit_services(True)
def install_insecure_key():
info("Installing insecure SSH key for user root")
run_command_killable("/usr/sbin/enable_insecure_key")
def main(args):
import_envvars(False, False)
export_envvars()
if args.enable_insecure_key:
install_insecure_key()
if not args.skip_startup_files:
run_startup_files()
runit_exited = False
exit_code = None
if not args.skip_runit:
runit_pid = start_runit()
try:
exit_status = None
if len(args.main_command) == 0:
runit_exited, exit_code = wait_for_runit_or_interrupt(runit_pid)
if runit_exited:
if exit_code is None:
info("Runit exited with unknown status")
exit_status = 1
else:
exit_status = os.WEXITSTATUS(exit_code)
info("Runit exited with status %d" % exit_status)
else:
info("Running %s..." % " ".join(args.main_command))
pid = os.spawnvp(os.P_NOWAIT, args.main_command[0], args.main_command)
try:
exit_code = waitpid_reap_other_children(pid)
if exit_code is None:
info("%s exited with unknown status." % args.main_command[0])
exit_status = 1
else:
exit_status = os.WEXITSTATUS(exit_code)
info("%s exited with status %d." % (args.main_command[0], exit_status))
except KeyboardInterrupt:
stop_child_process(args.main_command[0], pid)
raise
except BaseException:
warn("An error occurred. Aborting.")
stop_child_process(args.main_command[0], pid)
raise
sys.exit(exit_status)
finally:
if not args.skip_runit:
run_pre_shutdown_scripts()
shutdown_runit_services()
if not runit_exited:
stop_child_process("runit daemon", runit_pid)
wait_for_runit_services()
run_post_shutdown_scripts()
# Parse options.
parser = argparse.ArgumentParser(description='Initialize the system.')
parser.add_argument('main_command', metavar='MAIN_COMMAND', type=str, nargs='*',
help='The main command to run. (default: runit)')
parser.add_argument('--enable-insecure-key', dest='enable_insecure_key',
action='store_const', const=True, default=False,
help='Install the insecure SSH key')
parser.add_argument('--skip-startup-files', dest='skip_startup_files',
action='store_const', const=True, default=False,
help='Skip running /etc/my_init.d/* and /etc/rc.local')
parser.add_argument('--skip-runit', dest='skip_runit',
action='store_const', const=True, default=False,
help='Do not run runit services')
parser.add_argument('--no-kill-all-on-exit', dest='kill_all_on_exit',
action='store_const', const=False, default=True,
help='Don\'t kill all processes on the system upon exiting')
parser.add_argument('--quiet', dest='log_level',
action='store_const', const=LOG_LEVEL_WARN, default=LOG_LEVEL_INFO,
help='Only print warnings and errors')
args = parser.parse_args()
log_level = args.log_level
if args.skip_runit and len(args.main_command) == 0:
error("When --skip-runit is given, you must also pass a main command.")
sys.exit(1)
# Run main function.
signal.signal(signal.SIGTERM, lambda signum, frame: ignore_signals_and_raise_keyboard_interrupt('SIGTERM'))
signal.signal(signal.SIGINT, lambda signum, frame: ignore_signals_and_raise_keyboard_interrupt('SIGINT'))
signal.signal(signal.SIGALRM, lambda signum, frame: raise_alarm_exception())
try:
main(args)
except KeyboardInterrupt:
warn("Init system aborted.")
exit(2)
finally:
if args.kill_all_on_exit:
kill_all_processes(KILL_ALL_PROCESSES_TIMEOUT)

65
image/bin/setuser Executable file
View File

@@ -0,0 +1,65 @@
#!/usr/bin/python3
'''
Copyright (c) 2013-2015 Phusion Holding B.V.
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.
'''
import sys
import os
import pwd
def abort(message):
sys.stderr.write("setuser: %s\n" % message)
sys.exit(1)
def main():
'''
A simple alternative to sudo that executes a command as a user by setting
the user ID and user parameters to those described by the system and then
using execvp(3) to execute the command without the necessity of a TTY
'''
username = sys.argv[1]
try:
user = pwd.getpwnam(username)
except KeyError:
abort("user %s not found" % username)
os.initgroups(username, user.pw_gid)
os.setgid(user.pw_gid)
os.setuid(user.pw_uid)
os.environ['USER'] = username
os.environ['HOME'] = user.pw_dir
os.environ['UID'] = str(user.pw_uid)
try:
os.execvp(sys.argv[2], sys.argv[2:])
except OSError as e:
abort("cannot execute %s: %s" % (sys.argv[2], str(e)))
if __name__ == '__main__':
if len(sys.argv) < 3:
sys.stderr.write("Usage: /sbin/setuser USERNAME COMMAND [args..]\n")
sys.exit(1)
main()

View File

@@ -1,3 +1,9 @@
export LC_ALL=C
export DEBIAN_FRONTEND=noninteractive
minimal_apt_get_install='apt-get install -y --no-install-recommends'
# Default services
# Set 1 to the service you want to disable
export DISABLE_SYSLOG=${DISABLE_SYSLOG:-0}
export DISABLE_SSH=${DISABLE_SSH:-0}
export DISABLE_CRON=${DISABLE_CRON:-0}

View File

@@ -1,10 +1,11 @@
#!/bin/bash
set -e
source /build/buildconfig
source /bd_build/buildconfig
set -x
apt-get clean
rm -rf /build
find /bd_build/ -not \( -name 'bd_build' -or -name 'buildconfig' -or -name 'cleanup.sh' \) -delete
rm -rf /tmp/* /var/tmp/*
rm -rf /var/lib/apt/lists/*
rm -f /etc/ssh/ssh_host_*

View File

@@ -1,116 +0,0 @@
#!/usr/bin/python2
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):
global pid, status, waiting_for_runit
try:
result = os.wait3(os.WNOHANG)
if result is not None and pid == result[0]:
status = result[1]
except OSError:
pass
def stop_child_process(name):
global pid
print("*** Shutting down %s (PID %d)..." % (name, pid))
try:
os.kill(pid, signal.SIGHUP)
except OSError:
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.
signal.signal(signal.SIGCHLD, reap_child)
print("*** Booting runit...")
pid = os.spawnl(os.P_NOWAIT, "/usr/sbin/runsvdir-start", "/usr/sbin/runsvdir-start")
print("*** Runit started as PID %d" % pid)
signal.signal(signal.SIGTERM, lambda signum, frame: stop_child_process("runit"))
# Wait for runit, and while waiting, reap any adopted orphans.
done = False
while not done:
try:
this_pid, status = os.waitpid(pid, 0)
done = True
except OSError as e:
if e.errno == errno.EINTR:
# Try again
pass
else:
# The SIGCHLD handler probably caught it.
done = True
# Runit has exited. Reset signal handlers.
print("*** Runit exited with code %s. Waiting for all services to shut down..." % status)
signal.signal(signal.SIGCHLD, signal.SIG_DFL)
signal.signal(signal.SIGTERM, signal.SIG_DFL)
signal.siginterrupt(signal.SIGCHLD, False)
signal.siginterrupt(signal.SIGTERM, False)
# Wait at most 5 seconds for services to shut down.
import time
def shutdown(signum = None, frame = None):
global status
if status is not None:
sys.exit(status)
signal.signal(signal.SIGALRM, shutdown)
signal.alarm(5)
done = False
while not done:
done = os.system("/usr/bin/sv status /etc/service/* | grep -q '^run:'") != 0
if not done:
time.sleep(0.5)
shutdown()

View File

@@ -1,25 +1,48 @@
#!/bin/bash
set -e
source /build/buildconfig
source /bd_build/buildconfig
set -x
## Enable Ubuntu Universe.
echo deb http://archive.ubuntu.com/ubuntu precise main universe > /etc/apt/sources.list
echo deb http://archive.ubuntu.com/ubuntu precise-updates main universe >> /etc/apt/sources.list
apt-get update
## Prevent initramfs updates from trying to run grub and lilo.
## https://journal.paul.querna.org/articles/2013/10/15/docker-ubuntu-on-rackspace/
## http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594189
export INITRD=no
mkdir -p /etc/container_environment
echo -n no > /etc/container_environment/INITRD
## Install HTTPS support for APT.
$minimal_apt_get_install apt-transport-https
## Enable Ubuntu Universe, Multiverse, and deb-src for main.
sed -i 's/^#\s*\(deb.*main restricted\)$/\1/g' /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
## Fix some issues with APT packages.
## See https://github.com/dotcloud/docker/issues/1024
dpkg-divert --local --rename --add /sbin/initctl
ln -sf /bin/true /sbin/initctl
## Replace the 'ischroot' tool to make it always return true.
## Prevent initscripts updates from breaking /dev/shm.
## https://journal.paul.querna.org/articles/2013/10/15/docker-ubuntu-on-rackspace/
## https://bugs.launchpad.net/launchpad/+bug/974584
dpkg-divert --local --rename --add /usr/bin/ischroot
ln -sf /bin/true /usr/bin/ischroot
# apt-utils fix for Ubuntu 16.04
$minimal_apt_get_install apt-utils
## Install HTTPS support for APT.
$minimal_apt_get_install apt-transport-https ca-certificates
## Install add-apt-repository
$minimal_apt_get_install software-properties-common
## Upgrade all packages.
echo "initscripts hold" | dpkg --set-selections
apt-get upgrade -y --no-install-recommends
apt-get dist-upgrade -y --no-install-recommends -o Dpkg::Options::="--force-confold"
## Fix locale.
$minimal_apt_get_install language-pack-en
locale-gen en_US
update-locale LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8
echo -n en_US.UTF-8 > /etc/container_environment/LANG
echo -n en_US.UTF-8 > /etc/container_environment/LC_CTYPE

View File

@@ -1,3 +0,0 @@
#!/bin/sh
set -e
exec syslog-ng -F -p /var/run/syslog-ng.pid

19
image/services/cron/cron.sh Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
set -e
source /bd_build/buildconfig
set -x
$minimal_apt_get_install cron
mkdir /etc/service/cron
chmod 600 /etc/crontab
cp /bd_build/services/cron/cron.runit /etc/service/cron/run
# Fix cron issues in 0.9.19, see also #345: https://github.com/phusion/baseimage-docker/issues/345
sed -i 's/^\s*session\s\+required\s\+pam_loginuid.so/# &/' /etc/pam.d/cron
## Remove useless cron entries.
# Checks for lost+found and scans for mtab.
rm -f /etc/cron.daily/standard
rm -f /etc/cron.daily/upstart
rm -f /etc/cron.daily/dpkg
rm -f /etc/cron.daily/password
rm -f /etc/cron.weekly/fstrim

View File

@@ -0,0 +1,8 @@
#!/bin/bash
set -e
if [[ ! -e /etc/service/sshd/down && ! -e /etc/ssh/ssh_host_rsa_key ]] || [[ "$1" == "-f" ]]; then
echo "No SSH host key available. Generating one..."
export LC_ALL=C
export DEBIAN_FRONTEND=noninteractive
dpkg-reconfigure openssh-server
fi

View File

@@ -0,0 +1,30 @@
#!/bin/bash
set -e
AUTHORIZED_KEYS=/root/.ssh/authorized_keys
if [[ -e "$AUTHORIZED_KEYS" ]] && grep -q baseimage-docker-insecure-key "$AUTHORIZED_KEYS"; then
echo "Insecure key has already been added to $AUTHORIZED_KEYS."
else
DIR=`dirname "$AUTHORIZED_KEYS"`
echo "Creating directory $DIR..."
mkdir -p "$DIR"
chmod 700 "$DIR"
chown root:root "$DIR"
echo "Editing $AUTHORIZED_KEYS..."
cat /etc/insecure_key.pub >> "$AUTHORIZED_KEYS"
echo "Success: insecure key has been added to $AUTHORIZED_KEYS"
cat <<-EOF
+------------------------------------------------------------------------------+
| Insecure SSH key installed |
| |
| DO NOT expose port 22 on the Internet unless you know what you are doing! |
| |
| Use the private key below to connect with user root |
+------------------------------------------------------------------------------+
EOF
cat /etc/insecure_key
echo -e "\n\n"
fi

View File

@@ -0,0 +1,26 @@
PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment: imported-openssh-key
Public-Lines: 6
AAAAB3NzaC1yc2EAAAADAQABAAABAQDVmzBG5v7cO9IScGLIzlhGlHNFhXzy87Vf
aPzru7qnIIdQ1e9FEKvtqEws8hVixnCUdviwX5lvcMk4Ef4Tbrmj3dyF0zFtYbji
TSyl/XQlF68DQlc2sTAdHy96wJHvh7ky511tKJzzyWwSqeef4WjeVK28TqcGnq1u
p0S7saFO0dJh6OfDAg2cDmhyweR3VgT0vZJyrDV7hte95MBCdK+Gp7fdCyEZcWm3
S1DBFaeBqHzzt/Y/njAVKbYL9TIVPum8iMg0rMiLi9ShfP+dT5Xud5Oa3dcN2OWh
iDfJw5pfhFJWd44cJ/uGRwQpvNs/PNKsYABhgLlTMUH4iawhu1Xb
Private-Lines: 14
AAABAQCjROxgtX2Gft7yIx8Ol9IXmK6HLCI2XZt7ovb3hFWGGzHy0qMBql2P2Tzo
ed1o038Hq+woe9n+uTnEdtQ6rD6PByzgyW2VSsWTjCOdeJ5HH9Qw7ItXDZZWHBkh
fYHOkXI4e2oI3qshGAtYNLALn7KVhioJriCyyaSM2KOLx5khcY+EJ1inQfwQJKqP
GsdKc72liz07T8ifRj+mNLKtwrxlK3IXYfIdgLp/1pCKdrC80DhprMsD4xvNgq4p
CR9jd4FoqM9t/Up5ppTm+p6A/bDwdIPh6cFFeyMP+G3+bTlW1Gg7RLoNCc6qh53W
WVgEOQqdLHcQ8Ge4RLmbwLUmnRuRAAAAgQD312H46T2YvKzyEKbsddwbO8WktfxW
vVqqxH6z6bRXVFR3hQhmPKjlFXsD74h3W7NJwe9WJ5Pf3vemoBWIo0Hak0M1Z6WC
OIvBohpOYDzIgdlGHifx2ZiAd47Vsn+mfxjtISdWupl9Fw98yRjahWosKmmIHTtR
cIfYHB9ztpR8owAAAIEA3KNMYMFgenE+7q4pwat4t3RKA7rU8SPto5I1+sEHY8rz
cD7ONkIVlEhaqN+uTEYbr5rZa4dsQe4Ia+7ZXmO4djFsAP/fyJX+VCX/bHK83V5H
9toTdRLTqqfqJ3GOeZ41kPIN6UDHVEa4S8tfVM0DMNPEHBjLMfdbZGkoBQAPXWkA
AACBAJV/Bxr1jJohvmURQf/9y6MvO2wcRpTdKVLQhEnGm2cXQdh5CPVae2K+u0CG
d8u0/PDIZMGpueCQo4lft02W0skTDo5Kn+1IUwmQuoRzanVJ5ab+GyVnlouRLp/J
bWMQZ3pjXNkBsQOK/igrKYvqUb1jRsy9zxVQRl4i7JjjLpe/
Private-MAC: ef1e472b5254ae2c5319a522d39ad31d432dde75

View File

@@ -1 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVmzBG5v7cO9IScGLIzlhGlHNFhXzy87VfaPzru7qnIIdQ1e9FEKvtqEws8hVixnCUdviwX5lvcMk4Ef4Tbrmj3dyF0zFtYbjiTSyl/XQlF68DQlc2sTAdHy96wJHvh7ky511tKJzzyWwSqeef4WjeVK28TqcGnq1up0S7saFO0dJh6OfDAg2cDmhyweR3VgT0vZJyrDV7hte95MBCdK+Gp7fdCyEZcWm3S1DBFaeBqHzzt/Y/njAVKbYL9TIVPum8iMg0rMiLi9ShfP+dT5Xud5Oa3dcN2OWhiDfJw5pfhFJWd44cJ/uGRwQpvNs/PNKsYABhgLlTMUH4iawhu1Xb hongli@asuna-3939
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVmzBG5v7cO9IScGLIzlhGlHNFhXzy87VfaPzru7qnIIdQ1e9FEKvtqEws8hVixnCUdviwX5lvcMk4Ef4Tbrmj3dyF0zFtYbjiTSyl/XQlF68DQlc2sTAdHy96wJHvh7ky511tKJzzyWwSqeef4WjeVK28TqcGnq1up0S7saFO0dJh6OfDAg2cDmhyweR3VgT0vZJyrDV7hte95MBCdK+Gp7fdCyEZcWm3S1DBFaeBqHzzt/Y/njAVKbYL9TIVPum8iMg0rMiLi9ShfP+dT5Xud5Oa3dcN2OWhiDfJw5pfhFJWd44cJ/uGRwQpvNs/PNKsYABhgLlTMUH4iawhu1Xb baseimage-docker-insecure-key

25
image/services/sshd/sshd.sh Executable file
View File

@@ -0,0 +1,25 @@
#!/bin/bash
set -e
source /bd_build/buildconfig
set -x
SSHD_BUILD_PATH=/bd_build/services/sshd
## Install the SSH server.
$minimal_apt_get_install openssh-server
mkdir /var/run/sshd
mkdir /etc/service/sshd
touch /etc/service/sshd/down
cp $SSHD_BUILD_PATH/sshd.runit /etc/service/sshd/run
cp $SSHD_BUILD_PATH/sshd_config /etc/ssh/sshd_config
cp $SSHD_BUILD_PATH/00_regen_ssh_host_keys.sh /etc/my_init.d/
## Install default SSH key for root and app.
mkdir -p /root/.ssh
chmod 700 /root/.ssh
chown root:root /root/.ssh
cp $SSHD_BUILD_PATH/keys/insecure_key.pub /etc/insecure_key.pub
cp $SSHD_BUILD_PATH/keys/insecure_key /etc/insecure_key
chmod 644 /etc/insecure_key*
chown root:root /etc/insecure_key*
cp $SSHD_BUILD_PATH/enable_insecure_key /usr/sbin/

View File

@@ -84,8 +84,8 @@ ChallengeResponseAuthentication no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
@@ -101,7 +101,7 @@ ChallengeResponseAuthentication no
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PrintMotd yes
@@ -123,13 +123,10 @@ ChallengeResponseAuthentication no
#Banner none
# override default of no subsystems
Subsystem sftp /usr/lib/sftp-server
Subsystem sftp /usr/lib/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# ForceCommand cvs server
# XAuthLocation added by XQuartz (http://xquartz.macosforge.org)
XAuthLocation /opt/X11/bin/xauth

View File

@@ -0,0 +1,36 @@
# see "man logrotate" for details
# rotate log files weekly
weekly
# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
# su root syslog
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured here

View File

@@ -0,0 +1,37 @@
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
sv reload syslog-ng > /dev/null
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
sv reload syslog-ng > /dev/null
endscript
}

View File

@@ -0,0 +1,151 @@
@version: 3.5
@include "scl.conf"
@include "`scl-root`/system/tty10.conf"
# Syslog-ng configuration file, compatible with default Debian syslogd
# installation.
# First, set some global options.
options { chain_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no);
owner("root"); group("adm"); perm(0640); stats_freq(0);
bad_hostname("^gconfd$");
};
########################
# Sources
########################
# This is the default behavior of sysklogd package
# Logs may come from unix stream, but not from another machine.
#
source s_src {
unix-dgram("/dev/log");
internal();
};
# If you wish to get logs from remote machine you should uncomment
# this and comment the above source line.
#
#source s_net { tcp(ip(127.0.0.1) port(1000)); };
########################
# Destinations
########################
# First some standard logfile
#
destination d_auth { file("/var/log/auth.log"); };
destination d_cron { file("/var/log/cron.log"); };
destination d_daemon { file("/var/log/daemon.log"); };
destination d_kern { file("/var/log/kern.log"); };
destination d_lpr { file("/var/log/lpr.log"); };
destination d_mail { file("/var/log/mail.log"); };
destination d_syslog { file("/var/log/syslog"); };
destination d_user { file("/var/log/user.log"); };
destination d_uucp { file("/var/log/uucp.log"); };
# This files are the log come from the mail subsystem.
#
destination d_mailinfo { file("/var/log/mail.info"); };
destination d_mailwarn { file("/var/log/mail.warn"); };
destination d_mailerr { file("/var/log/mail.err"); };
# Logging for INN news system
#
destination d_newscrit { file("/var/log/news/news.crit"); };
destination d_newserr { file("/var/log/news/news.err"); };
destination d_newsnotice { file("/var/log/news/news.notice"); };
# Some `catch-all' logfiles.
#
destination d_debug { file("/var/log/debug"); };
destination d_error { file("/var/log/error"); };
destination d_messages { file("/var/log/messages"); };
# The named pipe /dev/xconsole is for the nsole' utility. To use it,
# you must invoke nsole' with the -file' option:
#
# $ xconsole -file /dev/xconsole [...]
#
destination d_xconsole { pipe("/dev/xconsole"); };
# Send the messages to an other host
#
#destination d_net { tcp("127.0.0.1" port(1000) log_fifo_size(1000)); };
# Debian only
destination d_ppp { file("/var/log/ppp.log"); };
# stdout for docker
destination d_stdout { pipe("/dev/stdout"); };
########################
# Filters
########################
# Here's come the filter options. With this rules, we can set which
# message go where.
filter f_dbg { level(debug); };
filter f_info { level(info); };
filter f_notice { level(notice); };
filter f_warn { level(warn); };
filter f_err { level(err); };
filter f_crit { level(crit .. emerg); };
filter f_debug { level(debug) and not facility(auth, authpriv, news, mail); };
filter f_error { level(err .. emerg) ; };
filter f_messages { level(info,notice,warn) and
not facility(auth,authpriv,cron,daemon,mail,news); };
filter f_auth { facility(auth, authpriv) and not filter(f_debug); };
filter f_cron { facility(cron) and not filter(f_debug); };
filter f_daemon { facility(daemon) and not filter(f_debug); };
filter f_kern { facility(kern) and not filter(f_debug); };
filter f_lpr { facility(lpr) and not filter(f_debug); };
filter f_local { facility(local0, local1, local3, local4, local5,
local6, local7) and not filter(f_debug); };
filter f_mail { facility(mail) and not filter(f_debug); };
filter f_news { facility(news) and not filter(f_debug); };
filter f_syslog3 { not facility(auth, authpriv, mail) and not filter(f_debug); };
filter f_user { facility(user) and not filter(f_debug); };
filter f_uucp { facility(uucp) and not filter(f_debug); };
filter f_cnews { level(notice, err, crit) and facility(news); };
filter f_cother { level(debug, info, notice, warn) or facility(daemon, mail); };
filter f_ppp { facility(local2) and not filter(f_debug); };
filter f_console { level(warn .. emerg); };
########################
# Log paths
########################
log { source(s_src); filter(f_auth); destination(d_auth); };
log { source(s_src); filter(f_cron); destination(d_cron); };
log { source(s_src); filter(f_daemon); destination(d_daemon); };
log { source(s_src); filter(f_kern); destination(d_kern); };
log { source(s_src); filter(f_lpr); destination(d_lpr); };
log { source(s_src); filter(f_syslog3); destination(d_syslog); destination(d_stdout); };
log { source(s_src); filter(f_user); destination(d_user); };
log { source(s_src); filter(f_uucp); destination(d_uucp); };
log { source(s_src); filter(f_mail); destination(d_mail); };
#log { source(s_src); filter(f_mail); filter(f_info); destination(d_mailinfo); };
#log { source(s_src); filter(f_mail); filter(f_warn); destination(d_mailwarn); };
#log { source(s_src); filter(f_mail); filter(f_err); destination(d_mailerr); };
log { source(s_src); filter(f_news); filter(f_crit); destination(d_newscrit); };
log { source(s_src); filter(f_news); filter(f_err); destination(d_newserr); };
log { source(s_src); filter(f_news); filter(f_notice); destination(d_newsnotice); };
#log { source(s_src); filter(f_ppp); destination(d_ppp); };
log { source(s_src); filter(f_debug); destination(d_debug); };
log { source(s_src); filter(f_error); destination(d_error); };
log { source(s_src); filter(f_messages); destination(d_messages); };
# All messages send to a remote site
#
#log { source(s_src); destination(d_net); };
###
# Include all config files in /etc/syslog-ng/conf.d/
###
@include "/etc/syslog-ng/conf.d/*.conf"

View File

@@ -0,0 +1,34 @@
#!/bin/bash
set -em
# 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
if [ ! -S /var/lib/syslog-ng/syslog-ng.ctl ]; then rm -f /var/lib/syslog-ng/syslog-ng.ctl; fi
PIDFILE="/var/run/syslog-ng.pid"
SYSLOGNG_OPTS=""
[ -r /etc/default/syslog-ng ] && . /etc/default/syslog-ng
syslogng_wait() {
if [ "$2" -ne 0 ]; then
return 1
fi
RET=1
for i in $(seq 1 30); do
status=0
syslog-ng-ctl stats >/dev/null 2>&1 || status=$?
if [ "$status" != "$1" ]; then
RET=0
break
fi
sleep 1s
done
return $RET
}
/usr/sbin/syslog-ng --pidfile "$PIDFILE" -F $SYSLOGNG_OPTS &
syslogng_wait 1 $?

View File

@@ -0,0 +1,21 @@
#!/bin/bash
set -e
source /bd_build/buildconfig
set -x
SYSLOG_NG_BUILD_PATH=/bd_build/services/syslog-ng
## Install a syslog daemon.
$minimal_apt_get_install syslog-ng-core
cp $SYSLOG_NG_BUILD_PATH/syslog-ng.init /etc/my_init.d/10_syslog-ng.init
cp $SYSLOG_NG_BUILD_PATH/syslog-ng.shutdown /etc/my_init.post_shutdown.d/10_syslog-ng.shutdown
mkdir -p /var/lib/syslog-ng
cp $SYSLOG_NG_BUILD_PATH/syslog_ng_default /etc/default/syslog-ng
touch /var/log/syslog
chmod u=rw,g=r,o= /var/log/syslog
cp $SYSLOG_NG_BUILD_PATH/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf
## Install logrotate.
$minimal_apt_get_install logrotate
cp $SYSLOG_NG_BUILD_PATH/logrotate.conf /etc/logrotate.conf
cp $SYSLOG_NG_BUILD_PATH/logrotate_syslogng /etc/logrotate.d/syslog-ng

View File

@@ -0,0 +1,27 @@
#!/bin/bash
PIDFILE="/var/run/syslog-ng.pid"
syslogng_wait() {
if [ "$2" -ne 0 ]; then
return 1
fi
RET=1
for i in $(seq 1 30); do
status=0
syslog-ng-ctl stats >/dev/null 2>&1 || status=$?
if [ "$status" != "$1" ]; then
RET=0
break
fi
sleep 1s
done
return $RET
}
if [ -f "$PIDFILE" ]; then
kill $(cat "$PIDFILE")
fi
syslogng_wait 0 $?

View File

@@ -0,0 +1,12 @@
# If a variable is not set here, then the corresponding
# parameter will not be changed.
# If a variables is set, then every invocation of
# syslog-ng's init script will set them using dmesg.
# log level of messages which should go to console
# see syslog(3) for details
#
#CONSOLE_LOG_LEVEL=1
# Command line options to syslog-ng
SYSLOGNG_OPTS="--no-caps"

View File

@@ -1,12 +0,0 @@
#!/bin/bash
set -e
user="$1"
shift
if [[ "$user" == "root" ]]; then
export HOME=/root
else
export HOME=/home/$user
fi
exec chpst -u "$user" "$@"

View File

@@ -1,35 +1,31 @@
#!/bin/bash
set -e
source /build/buildconfig
source /bd_build/buildconfig
set -x
## Install init process.
cp /build/my_init /sbin/
cp /bd_build/bin/my_init /sbin/
mkdir -p /etc/my_init.d
mkdir -p /etc/my_init.pre_shutdown.d
mkdir -p /etc/my_init.post_shutdown.d
mkdir -p /etc/container_environment
touch /etc/container_environment.sh
touch /etc/container_environment.json
chmod 700 /etc/container_environment
groupadd -g 8377 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.
$minimal_apt_get_install runit
## Install a syslog daemon.
$minimal_apt_get_install syslog-ng-core
mkdir /etc/service/syslog-ng
cp /build/runit/syslog-ng /etc/service/syslog-ng/run
## Install a syslog daemon and logrotate.
[ "$DISABLE_SYSLOG" -eq 0 ] && /bd_build/services/syslog-ng/syslog-ng.sh || true
## Install the SSH server.
$minimal_apt_get_install openssh-server
mkdir /var/run/sshd
mkdir /etc/service/sshd
cp /build/runit/sshd /etc/service/sshd/run
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.
mkdir -p /root/.ssh
chmod 700 /root/.ssh
chown root:root /root/.ssh
cat /build/insecure_key.pub > /root/.ssh/authorized_keys
[ "$DISABLE_SSH" -eq 0 ] && /bd_build/services/sshd/sshd.sh || true
## Install cron daemon.
$minimal_apt_get_install cron
mkdir /etc/service/cron
cp /build/runit/cron /etc/service/cron/run
[ "$DISABLE_CRON" -eq 0 ] && /bd_build/services/cron/cron.sh || true

View File

@@ -1,10 +1,14 @@
#!/bin/bash
set -e
source /build/buildconfig
source /bd_build/buildconfig
set -x
## Often used tools.
$minimal_apt_get_install curl less nano vim psmisc
$minimal_apt_get_install curl less vim-tiny psmisc
ln -s /usr/bin/vim.tiny /usr/bin/vim
## This tool runs a command as another user and sets $HOME.
cp /build/setuser /sbin/setuser
cp /bd_build/bin/setuser /sbin/setuser
## This tool allows installation of apt packages with automatic cache cleanup.
cp /bd_build/bin/install_clean /sbin/install_clean

12
install-tools.sh Executable file
View File

@@ -0,0 +1,12 @@
#!/bin/sh
set -e
dir=`dirname "$0"`
cd "$dir"
set -x
cp tools/docker-bash /usr/local/bin/
cp tools/docker-ssh /usr/local/bin/
cp tools/baseimage-docker-nsenter /usr/local/bin/
mkdir -p /usr/local/share/baseimage-docker
cp image/services/sshd/keys/insecure_key /usr/local/share/baseimage-docker/
chmod 644 /usr/local/share/baseimage-docker/insecure_key

42
test/runner.sh Executable file
View File

@@ -0,0 +1,42 @@
#!/bin/bash
set -e
function abort()
{
echo "$@"
exit 1
}
function cleanup()
{
echo " --> Stopping container"
docker stop $ID >/dev/null
docker rm $ID >/dev/null
}
PWD=`pwd`
echo " --> Starting insecure container"
ID=`docker run -d -v $PWD/test:/test $NAME:$VERSION /sbin/my_init --enable-insecure-key`
sleep 1
echo " --> Obtaining IP"
IP=`docker inspect -f "{{ .NetworkSettings.IPAddress }}" "$ID"`
if [[ "$IP" = "" ]]; then
abort "Unable to obtain container IP"
fi
trap cleanup EXIT
echo " --> Enabling SSH in the container"
docker exec -t -i $ID /etc/my_init.d/00_regen_ssh_host_keys.sh -f
docker exec -t -i $ID rm /etc/service/sshd/down
docker exec -t -i $ID sv start /etc/service/sshd
sleep 1
echo " --> Logging into container and running tests"
cp image/services/sshd/keys/insecure_key /tmp/insecure_key
chmod 600 /tmp/insecure_key
sleep 1 # Give container some more time to start up.
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /tmp/insecure_key root@$IP \
/bin/bash /test/test.sh

22
test/test.sh Executable file
View File

@@ -0,0 +1,22 @@
#!/bin/bash
set -o pipefail
function ok()
{
echo " OK"
}
function fail()
{
echo " FAIL"
exit 1
}
echo "Checking whether all services are running..."
services=`sv status /etc/service/*`
status=$?
if [[ "$status" != 0 || "$services" = "" || "$services" =~ down ]]; then
fail
else
ok
fi

1
tools/README.md Normal file
View File

@@ -0,0 +1 @@
baseimage-docker-nsenter is the nsenter tool taken from https://github.com/jpetazzo/nsenter, commit 10ce18a7a32. It has been stripped in order to make it smaller.

BIN
tools/baseimage-docker-nsenter Executable file

Binary file not shown.

29
tools/docker-bash Executable file
View File

@@ -0,0 +1,29 @@
#!/bin/sh
set -e
SELFDIR=`dirname "$0"`
SELFDIR=`cd "$SELFDIR" && pwd`
usage()
{
echo "Usage: docker-bash <CONTAINER_ID> [COMMAND...]"
echo "Login to a Baseimage-based Docker container using nsenter." \
"If COMMAND is not given, opens an interactive shell." \
"Otherwise, runs COMMAND inside the container."
}
if test $# = 0; then
usage
exit
fi
CONTAINER_ID="$1"
shift
PID=`docker inspect -f "{{ .State.Pid }}" "$CONTAINER_ID"`
if test $# = 0; then
exec "$SELFDIR/baseimage-docker-nsenter" --target "$PID" --mount --uts --ipc --net --pid -- /bin/bash -l
else
exec "$SELFDIR/baseimage-docker-nsenter" --target "$PID" --mount --uts --ipc --net --pid -- "$@"
fi

81
tools/docker-ssh Executable file
View File

@@ -0,0 +1,81 @@
#!/bin/sh
set -e
KNOWN_HOSTS_FILE=
IP=
usage()
{
echo "Usage: docker-ssh <CONTAINER_ID> [COMMAND...]"
echo "Login to a Baseimage-based Docker container using SSH." \
"If COMMAND is not given, opens an interactive shell." \
"Otherwise, runs COMMAND inside the container."
}
cleanup()
{
local pids=`jobs -p`
if test "$pids" != ""; then
kill $pids
fi
if test "$KNOWN_HOSTS_FILE" != ""; then
rm -f "$KNOWN_HOSTS_FILE"
fi
}
if test $# = 0; then
usage
exit
fi
CONTAINER_ID="$1"
shift
trap cleanup EXIT
if ! test -e ~/.baseimage_docker_insecure_key; then
if test -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 test -e "$dir/image/services/sshd/keys/insecure_key"; then
cp "$dir/image/services/sshd/keys/insecure_key" ~/.baseimage_docker_insecure_key
else
echo "*** ERROR ***: Baseimage-docker insecure key not found." >&2
echo "You probably didn't install docker-ssh 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-ssh.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 test $# = 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-ssh 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