| #!/usr/bin/env bash |
| # |
| # Solaris 12 base image build script. |
| # |
| set -e |
| |
| # TODO add optional package publisher origin |
| |
| rootfsDir="$1" |
| shift |
| |
| # base install |
| ( |
| set -x |
| |
| pkg image-create --full --zone \ |
| --facet facet.locale.*=false \ |
| --facet facet.locale.POSIX=true \ |
| --facet facet.doc=false \ |
| --facet facet.doc.*=false \ |
| "$rootfsDir" |
| |
| pkg -R "$rootfsDir" set-property use-system-repo true |
| |
| pkg -R "$rootfsDir" set-property flush-content-cache-on-success true |
| |
| pkg -R "$rootfsDir" install core-os |
| ) |
| |
| # Lay in stock configuration, set up milestone |
| # XXX This all may become optional in a base image |
| ( |
| # faster to build repository database on tmpfs |
| REPO_DB=/system/volatile/repository.$$ |
| export SVCCFG_REPOSITORY=${REPO_DB} |
| export SVCCFG_DOOR_PATH=$rootfsDir/system/volatile/tmp_repo_door |
| |
| # Import base manifests. NOTE These are a combination of basic requirement |
| # and gleaned from container milestone manifest. They may change. |
| for m in $rootfsDir/lib/svc/manifest/system/environment.xml \ |
| $rootfsDir/lib/svc/manifest/system/svc/global.xml \ |
| $rootfsDir/lib/svc/manifest/system/svc/restarter.xml \ |
| $rootfsDir/lib/svc/manifest/network/dns/client.xml \ |
| $rootfsDir/lib/svc/manifest/system/name-service/switch.xml \ |
| $rootfsDir/lib/svc/manifest/system/name-service/cache.xml \ |
| $rootfsDir/lib/svc/manifest/milestone/container.xml ; do |
| svccfg import $m |
| done |
| |
| # Apply system layer profile, deleting unnecessary dependencies |
| svccfg apply $rootfsDir/etc/svc/profile/generic_container.xml |
| |
| # XXX Even if we keep a repo in the base image, this is definitely optional |
| svccfg apply $rootfsDir/etc/svc/profile/sysconfig/container_sc.xml |
| |
| for s in svc:/system/svc/restarter \ |
| svc:/system/environment \ |
| svc:/network/dns/client \ |
| svc:/system/name-service/switch \ |
| svc:/system/name-service/cache \ |
| svc:/system/svc/global \ |
| svc:/milestone/container ;do |
| svccfg -s $s refresh |
| done |
| |
| # now copy the built up repository into the base rootfs |
| mv $REPO_DB $rootfsDir/etc/svc/repository.db |
| ) |
| |
| # pkg(1) needs the zoneproxy-client running in the container. |
| # use a simple wrapper to run it as needed. |
| # XXX maybe we go back to running this in SMF? |
| mv "$rootfsDir/usr/bin/pkg" "$rootfsDir/usr/bin/wrapped_pkg" |
| cat > "$rootfsDir/usr/bin/pkg" <<-'EOF' |
| #!/bin/sh |
| # |
| # THIS FILE CREATED DURING DOCKER BASE IMAGE CREATION |
| # |
| # The Solaris base image uses the sysrepo proxy mechanism. The |
| # IPS client pkg(1) requires the zoneproxy-client to reach the |
| # remote publisher origins through the host. This wrapper script |
| # enables and disables the proxy client as needed. This is a |
| # temporary solution. |
| |
| /usr/lib/zones/zoneproxy-client -s localhost:1008 |
| PKG_SYSREPO_URL=http://localhost:1008 /usr/bin/wrapped_pkg "$@" |
| pkill -9 zoneproxy-client |
| EOF |
| chmod +x "$rootfsDir/usr/bin/pkg" |