mirror of
https://github.com/phusion/baseimage-docker.git
synced 2026-03-26 12:29:07 +00:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd23614b27 | ||
|
|
914f0967b0 | ||
|
|
068b4534d4 | ||
|
|
2a8c9ebe38 | ||
|
|
7f77348a6b | ||
|
|
9f998e1a09 | ||
|
|
59d209cbe8 | ||
|
|
7022d31858 | ||
|
|
263b582139 | ||
|
|
f7dfb05850 | ||
|
|
8f7fcfec33 | ||
|
|
b2c329af51 | ||
|
|
f012793a75 | ||
|
|
d3af157387 | ||
|
|
9c934771ad | ||
|
|
7f7b164d20 | ||
|
|
06b065782d | ||
|
|
287e96c811 | ||
|
|
a6fd9f8b56 | ||
|
|
ce6a9e0dfc |
5
Makefile
5
Makefile
@@ -1,5 +1,5 @@
|
|||||||
NAME = phusion/baseimage
|
NAME = phusion/baseimage
|
||||||
VERSION = 0.9.21
|
VERSION = 0.9.22
|
||||||
|
|
||||||
.PHONY: all build test tag_latest release ssh
|
.PHONY: all build test tag_latest release ssh
|
||||||
|
|
||||||
@@ -16,9 +16,8 @@ tag_latest:
|
|||||||
|
|
||||||
release: test tag_latest
|
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
|
@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
|
||||||
@if ! head -n 1 Changelog.md | grep -q 'release date'; then echo 'Please note the release date in Changelog.md.' && false; fi
|
|
||||||
docker push $(NAME)
|
docker push $(NAME)
|
||||||
@echo "*** Don't forget to create a tag. git tag $(VERSION) && git push origin $(VERSION)"
|
@echo "*** Don't forget to create a tag by creating an official GitHub release."
|
||||||
|
|
||||||
ssh:
|
ssh:
|
||||||
chmod 600 image/services/sshd/keys/insecure_key
|
chmod 600 image/services/sshd/keys/insecure_key
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ RUN /bd_build/prepare.sh && \
|
|||||||
/bd_build/fix_pam_bug.sh && \
|
/bd_build/fix_pam_bug.sh && \
|
||||||
/bd_build/cleanup.sh
|
/bd_build/cleanup.sh
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND teletype
|
||||||
|
|
||||||
ENV LANG en_US.UTF-8
|
ENV LANG en_US.UTF-8
|
||||||
ENV LANGUAGE en_US:en
|
ENV LANGUAGE en_US:en
|
||||||
ENV LC_ALL en_US.UTF-8
|
ENV LC_ALL en_US.UTF-8
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
#!/usr/bin/python3 -u
|
#!/usr/bin/python3 -u
|
||||||
import os, os.path, sys, stat, signal, errno, argparse, time, json, re
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import errno
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import re
|
||||||
|
import signal
|
||||||
|
import stat
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
KILL_PROCESS_TIMEOUT = int(os.environ.get('KILL_PROCESS_TIMEOUT', 5))
|
KILL_PROCESS_TIMEOUT = int(os.environ.get('KILL_PROCESS_TIMEOUT', 5))
|
||||||
KILL_ALL_PROCESSES_TIMEOUT = int(os.environ.get('KILL_ALL_PROCESSES_TIMEOUT', 5))
|
KILL_ALL_PROCESSES_TIMEOUT = int(os.environ.get('KILL_ALL_PROCESSES_TIMEOUT', 5))
|
||||||
@@ -15,33 +26,43 @@ log_level = None
|
|||||||
|
|
||||||
terminated_child_processes = {}
|
terminated_child_processes = {}
|
||||||
|
|
||||||
|
_find_unsafe = re.compile(r'[^\w@%+=:,./-]').search
|
||||||
|
|
||||||
|
|
||||||
class AlarmException(Exception):
|
class AlarmException(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def error(message):
|
def error(message):
|
||||||
if log_level >= LOG_LEVEL_ERROR:
|
if log_level >= LOG_LEVEL_ERROR:
|
||||||
sys.stderr.write("*** %s\n" % message)
|
sys.stderr.write("*** %s\n" % message)
|
||||||
|
|
||||||
|
|
||||||
def warn(message):
|
def warn(message):
|
||||||
if log_level >= LOG_LEVEL_WARN:
|
if log_level >= LOG_LEVEL_WARN:
|
||||||
sys.stderr.write("*** %s\n" % message)
|
sys.stderr.write("*** %s\n" % message)
|
||||||
|
|
||||||
|
|
||||||
def info(message):
|
def info(message):
|
||||||
if log_level >= LOG_LEVEL_INFO:
|
if log_level >= LOG_LEVEL_INFO:
|
||||||
sys.stderr.write("*** %s\n" % message)
|
sys.stderr.write("*** %s\n" % message)
|
||||||
|
|
||||||
|
|
||||||
def debug(message):
|
def debug(message):
|
||||||
if log_level >= LOG_LEVEL_DEBUG:
|
if log_level >= LOG_LEVEL_DEBUG:
|
||||||
sys.stderr.write("*** %s\n" % message)
|
sys.stderr.write("*** %s\n" % message)
|
||||||
|
|
||||||
|
|
||||||
def ignore_signals_and_raise_keyboard_interrupt(signame):
|
def ignore_signals_and_raise_keyboard_interrupt(signame):
|
||||||
signal.signal(signal.SIGTERM, signal.SIG_IGN)
|
signal.signal(signal.SIGTERM, signal.SIG_IGN)
|
||||||
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
||||||
raise KeyboardInterrupt(signame)
|
raise KeyboardInterrupt(signame)
|
||||||
|
|
||||||
|
|
||||||
def raise_alarm_exception():
|
def raise_alarm_exception():
|
||||||
raise AlarmException('Alarm')
|
raise AlarmException('Alarm')
|
||||||
|
|
||||||
|
|
||||||
def listdir(path):
|
def listdir(path):
|
||||||
try:
|
try:
|
||||||
result = os.stat(path)
|
result = os.stat(path)
|
||||||
@@ -52,13 +73,15 @@ def listdir(path):
|
|||||||
else:
|
else:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
def is_exe(path):
|
def is_exe(path):
|
||||||
try:
|
try:
|
||||||
return os.path.isfile(path) and os.access(path, os.X_OK)
|
return os.path.isfile(path) and os.access(path, os.X_OK)
|
||||||
except OSError:
|
except OSError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def import_envvars(clear_existing_environment = True, override_existing_environment = True):
|
|
||||||
|
def import_envvars(clear_existing_environment=True, override_existing_environment=True):
|
||||||
if not os.path.exists("/etc/container_environment"):
|
if not os.path.exists("/etc/container_environment"):
|
||||||
return
|
return
|
||||||
new_env = {}
|
new_env = {}
|
||||||
@@ -73,10 +96,11 @@ def import_envvars(clear_existing_environment = True, override_existing_environm
|
|||||||
if clear_existing_environment:
|
if clear_existing_environment:
|
||||||
os.environ.clear()
|
os.environ.clear()
|
||||||
for name, value in new_env.items():
|
for name, value in new_env.items():
|
||||||
if override_existing_environment or not name in os.environ:
|
if override_existing_environment or name not in os.environ:
|
||||||
os.environ[name] = value
|
os.environ[name] = value
|
||||||
|
|
||||||
def export_envvars(to_dir = True):
|
|
||||||
|
def export_envvars(to_dir=True):
|
||||||
if not os.path.exists("/etc/container_environment"):
|
if not os.path.exists("/etc/container_environment"):
|
||||||
return
|
return
|
||||||
shell_dump = ""
|
shell_dump = ""
|
||||||
@@ -92,7 +116,6 @@ def export_envvars(to_dir = True):
|
|||||||
with open("/etc/container_environment.json", "w") as f:
|
with open("/etc/container_environment.json", "w") as f:
|
||||||
f.write(json.dumps(dict(os.environ)))
|
f.write(json.dumps(dict(os.environ)))
|
||||||
|
|
||||||
_find_unsafe = re.compile(r'[^\w@%+=:,./-]').search
|
|
||||||
|
|
||||||
def shquote(s):
|
def shquote(s):
|
||||||
"""Return a shell-escaped version of the string *s*."""
|
"""Return a shell-escaped version of the string *s*."""
|
||||||
@@ -105,12 +128,15 @@ def shquote(s):
|
|||||||
# the string $'b is then quoted as '$'"'"'b'
|
# the string $'b is then quoted as '$'"'"'b'
|
||||||
return "'" + s.replace("'", "'\"'\"'") + "'"
|
return "'" + s.replace("'", "'\"'\"'") + "'"
|
||||||
|
|
||||||
|
|
||||||
def sanitize_shenvname(s):
|
def sanitize_shenvname(s):
|
||||||
return re.sub(SHENV_NAME_WHITELIST_REGEX, "_", s)
|
return re.sub(SHENV_NAME_WHITELIST_REGEX, "_", s)
|
||||||
|
|
||||||
|
|
||||||
# Waits for the child process with the given PID, while at the same time
|
# 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
|
# reaping any other child processes that have exited (e.g. adopted child
|
||||||
# processes that have terminated).
|
# processes that have terminated).
|
||||||
|
|
||||||
def waitpid_reap_other_children(pid):
|
def waitpid_reap_other_children(pid):
|
||||||
global terminated_child_processes
|
global terminated_child_processes
|
||||||
|
|
||||||
@@ -143,7 +169,8 @@ def waitpid_reap_other_children(pid):
|
|||||||
raise
|
raise
|
||||||
return status
|
return status
|
||||||
|
|
||||||
def stop_child_process(name, pid, signo = signal.SIGTERM, time_limit = KILL_PROCESS_TIMEOUT):
|
|
||||||
|
def stop_child_process(name, pid, signo=signal.SIGTERM, time_limit=KILL_PROCESS_TIMEOUT):
|
||||||
info("Shutting down %s (PID %d)..." % (name, pid))
|
info("Shutting down %s (PID %d)..." % (name, pid))
|
||||||
try:
|
try:
|
||||||
os.kill(pid, signo)
|
os.kill(pid, signo)
|
||||||
@@ -168,13 +195,14 @@ def stop_child_process(name, pid, signo = signal.SIGTERM, time_limit = KILL_PROC
|
|||||||
finally:
|
finally:
|
||||||
signal.alarm(0)
|
signal.alarm(0)
|
||||||
|
|
||||||
|
|
||||||
def run_command_killable(*argv):
|
def run_command_killable(*argv):
|
||||||
filename = argv[0]
|
filename = argv[0]
|
||||||
status = None
|
status = None
|
||||||
pid = os.spawnvp(os.P_NOWAIT, filename, argv)
|
pid = os.spawnvp(os.P_NOWAIT, filename, argv)
|
||||||
try:
|
try:
|
||||||
status = waitpid_reap_other_children(pid)
|
status = waitpid_reap_other_children(pid)
|
||||||
except BaseException as s:
|
except BaseException:
|
||||||
warn("An error occurred. Aborting.")
|
warn("An error occurred. Aborting.")
|
||||||
stop_child_process(filename, pid)
|
stop_child_process(filename, pid)
|
||||||
raise
|
raise
|
||||||
@@ -185,11 +213,13 @@ def run_command_killable(*argv):
|
|||||||
error("%s failed with status %d\n" % (filename, os.WEXITSTATUS(status)))
|
error("%s failed with status %d\n" % (filename, os.WEXITSTATUS(status)))
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
def run_command_killable_and_import_envvars(*argv):
|
def run_command_killable_and_import_envvars(*argv):
|
||||||
run_command_killable(*argv)
|
run_command_killable(*argv)
|
||||||
import_envvars()
|
import_envvars()
|
||||||
export_envvars(False)
|
export_envvars(False)
|
||||||
|
|
||||||
|
|
||||||
def kill_all_processes(time_limit):
|
def kill_all_processes(time_limit):
|
||||||
info("Killing all processes...")
|
info("Killing all processes...")
|
||||||
try:
|
try:
|
||||||
@@ -217,6 +247,7 @@ def kill_all_processes(time_limit):
|
|||||||
finally:
|
finally:
|
||||||
signal.alarm(0)
|
signal.alarm(0)
|
||||||
|
|
||||||
|
|
||||||
def run_startup_files():
|
def run_startup_files():
|
||||||
# Run /etc/my_init.d/*
|
# Run /etc/my_init.d/*
|
||||||
for name in listdir("/etc/my_init.d"):
|
for name in listdir("/etc/my_init.d"):
|
||||||
@@ -230,6 +261,29 @@ def run_startup_files():
|
|||||||
info("Running /etc/rc.local...")
|
info("Running /etc/rc.local...")
|
||||||
run_command_killable_and_import_envvars("/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():
|
def start_runit():
|
||||||
info("Booting runit daemon...")
|
info("Booting runit daemon...")
|
||||||
pid = os.spawnl(os.P_NOWAIT, "/usr/bin/runsvdir", "/usr/bin/runsvdir",
|
pid = os.spawnl(os.P_NOWAIT, "/usr/bin/runsvdir", "/usr/bin/runsvdir",
|
||||||
@@ -237,6 +291,7 @@ def start_runit():
|
|||||||
info("Runit started as PID %d" % pid)
|
info("Runit started as PID %d" % pid)
|
||||||
return pid
|
return pid
|
||||||
|
|
||||||
|
|
||||||
def wait_for_runit_or_interrupt(pid):
|
def wait_for_runit_or_interrupt(pid):
|
||||||
try:
|
try:
|
||||||
status = waitpid_reap_other_children(pid)
|
status = waitpid_reap_other_children(pid)
|
||||||
@@ -244,10 +299,12 @@ def wait_for_runit_or_interrupt(pid):
|
|||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
return (False, None)
|
return (False, None)
|
||||||
|
|
||||||
def shutdown_runit_services(quiet = False):
|
|
||||||
|
def shutdown_runit_services(quiet=False):
|
||||||
if not quiet:
|
if not quiet:
|
||||||
debug("Begin shutting down runit services...")
|
debug("Begin shutting down runit services...")
|
||||||
os.system("/usr/bin/sv -w %d down /etc/service/*", KILL_PROCESS_TIMEOUT)
|
os.system("/usr/bin/sv -w %d down /etc/service/* > /dev/null" % KILL_PROCESS_TIMEOUT)
|
||||||
|
|
||||||
|
|
||||||
def wait_for_runit_services():
|
def wait_for_runit_services():
|
||||||
debug("Waiting for runit services to exit...")
|
debug("Waiting for runit services to exit...")
|
||||||
@@ -263,10 +320,12 @@ def wait_for_runit_services():
|
|||||||
# services.
|
# services.
|
||||||
shutdown_runit_services(True)
|
shutdown_runit_services(True)
|
||||||
|
|
||||||
|
|
||||||
def install_insecure_key():
|
def install_insecure_key():
|
||||||
info("Installing insecure SSH key for user root")
|
info("Installing insecure SSH key for user root")
|
||||||
run_command_killable("/usr/sbin/enable_insecure_key")
|
run_command_killable("/usr/sbin/enable_insecure_key")
|
||||||
|
|
||||||
|
|
||||||
def main(args):
|
def main(args):
|
||||||
import_envvars(False, False)
|
import_envvars(False, False)
|
||||||
export_envvars()
|
export_envvars()
|
||||||
@@ -307,37 +366,39 @@ def main(args):
|
|||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
stop_child_process(args.main_command[0], pid)
|
stop_child_process(args.main_command[0], pid)
|
||||||
raise
|
raise
|
||||||
except BaseException as s:
|
except BaseException:
|
||||||
warn("An error occurred. Aborting.")
|
warn("An error occurred. Aborting.")
|
||||||
stop_child_process(args.main_command[0], pid)
|
stop_child_process(args.main_command[0], pid)
|
||||||
raise
|
raise
|
||||||
sys.exit(exit_status)
|
sys.exit(exit_status)
|
||||||
finally:
|
finally:
|
||||||
if not args.skip_runit:
|
if not args.skip_runit:
|
||||||
|
run_pre_shutdown_scripts()
|
||||||
shutdown_runit_services()
|
shutdown_runit_services()
|
||||||
if not runit_exited:
|
if not runit_exited:
|
||||||
stop_child_process("runit daemon", runit_pid)
|
stop_child_process("runit daemon", runit_pid)
|
||||||
wait_for_runit_services()
|
wait_for_runit_services()
|
||||||
|
run_post_shutdown_scripts()
|
||||||
|
|
||||||
# Parse options.
|
# Parse options.
|
||||||
parser = argparse.ArgumentParser(description = 'Initialize the system.')
|
parser = argparse.ArgumentParser(description='Initialize the system.')
|
||||||
parser.add_argument('main_command', metavar = 'MAIN_COMMAND', type = str, nargs = '*',
|
parser.add_argument('main_command', metavar='MAIN_COMMAND', type=str, nargs='*',
|
||||||
help = 'The main command to run. (default: runit)')
|
help='The main command to run. (default: runit)')
|
||||||
parser.add_argument('--enable-insecure-key', dest = 'enable_insecure_key',
|
parser.add_argument('--enable-insecure-key', dest='enable_insecure_key',
|
||||||
action = 'store_const', const = True, default = False,
|
action='store_const', const=True, default=False,
|
||||||
help = 'Install the insecure SSH key')
|
help='Install the insecure SSH key')
|
||||||
parser.add_argument('--skip-startup-files', dest = 'skip_startup_files',
|
parser.add_argument('--skip-startup-files', dest='skip_startup_files',
|
||||||
action = 'store_const', const = True, default = False,
|
action='store_const', const=True, default=False,
|
||||||
help = 'Skip running /etc/my_init.d/* and /etc/rc.local')
|
help='Skip running /etc/my_init.d/* and /etc/rc.local')
|
||||||
parser.add_argument('--skip-runit', dest = 'skip_runit',
|
parser.add_argument('--skip-runit', dest='skip_runit',
|
||||||
action = 'store_const', const = True, default = False,
|
action='store_const', const=True, default=False,
|
||||||
help = 'Do not run runit services')
|
help='Do not run runit services')
|
||||||
parser.add_argument('--no-kill-all-on-exit', dest = 'kill_all_on_exit',
|
parser.add_argument('--no-kill-all-on-exit', dest='kill_all_on_exit',
|
||||||
action = 'store_const', const = False, default = True,
|
action='store_const', const=False, default=True,
|
||||||
help = 'Don\'t kill all processes on the system upon exiting')
|
help='Don\'t kill all processes on the system upon exiting')
|
||||||
parser.add_argument('--quiet', dest = 'log_level',
|
parser.add_argument('--quiet', dest='log_level',
|
||||||
action = 'store_const', const = LOG_LEVEL_WARN, default = LOG_LEVEL_INFO,
|
action='store_const', const=LOG_LEVEL_WARN, default=LOG_LEVEL_INFO,
|
||||||
help = 'Only print warnings and errors')
|
help='Only print warnings and errors')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
log_level = args.log_level
|
log_level = args.log_level
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Copyright (c) 2013-2015 Phusion Holding B.V.
|
Copyright (c) 2013-2015 Phusion Holding B.V.
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ export INITRD=no
|
|||||||
mkdir -p /etc/container_environment
|
mkdir -p /etc/container_environment
|
||||||
echo -n no > /etc/container_environment/INITRD
|
echo -n no > /etc/container_environment/INITRD
|
||||||
|
|
||||||
## Enable Ubuntu Universe and Multiverse.
|
## Enable Ubuntu Universe, 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.*universe\)$/\1/g' /etc/apt/sources.list
|
||||||
sed -i 's/^#\s*\(deb.*multiverse\)$/\1/g' /etc/apt/sources.list
|
sed -i 's/^#\s*\(deb.*multiverse\)$/\1/g' /etc/apt/sources.list
|
||||||
apt-get update
|
apt-get update
|
||||||
@@ -27,6 +28,9 @@ ln -sf /bin/true /sbin/initctl
|
|||||||
dpkg-divert --local --rename --add /usr/bin/ischroot
|
dpkg-divert --local --rename --add /usr/bin/ischroot
|
||||||
ln -sf /bin/true /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.
|
## Install HTTPS support for APT.
|
||||||
$minimal_apt_get_install apt-transport-https ca-certificates
|
$minimal_apt_get_install apt-transport-https ca-certificates
|
||||||
|
|
||||||
@@ -34,7 +38,7 @@ $minimal_apt_get_install apt-transport-https ca-certificates
|
|||||||
$minimal_apt_get_install software-properties-common
|
$minimal_apt_get_install software-properties-common
|
||||||
|
|
||||||
## Upgrade all packages.
|
## Upgrade all packages.
|
||||||
apt-get dist-upgrade -y --no-install-recommends
|
apt-get dist-upgrade -y --no-install-recommends -o Dpkg::Options::="--force-confold"
|
||||||
|
|
||||||
## Fix locale.
|
## Fix locale.
|
||||||
$minimal_apt_get_install language-pack-en
|
$minimal_apt_get_install language-pack-en
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ set -x
|
|||||||
## Install init process.
|
## Install init process.
|
||||||
cp /bd_build/bin/my_init /sbin/
|
cp /bd_build/bin/my_init /sbin/
|
||||||
mkdir -p /etc/my_init.d
|
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
|
mkdir -p /etc/container_environment
|
||||||
touch /etc/container_environment.sh
|
touch /etc/container_environment.sh
|
||||||
touch /etc/container_environment.json
|
touch /etc/container_environment.json
|
||||||
|
|||||||
Reference in New Issue
Block a user