From 006bb047aa3ccba3aff6f7db83e04a357f916d41 Mon Sep 17 00:00:00 2001 From: Manjunath A Kumatagi Date: Tue, 11 Apr 2017 19:19:15 +0530 Subject: [PATCH] Multi arch nginx-slim docker image Signed-off-by: Manjunath A Kumatagi --- images/nginx-slim/Dockerfile | 2 +- images/nginx-slim/Makefile | 38 +++++++++++++++++++++++--- images/nginx-slim/build.sh | 29 +++++++++++++++++--- images/ubuntu-slim/.gitignore | 1 + images/ubuntu-slim/Dockerfile.build | 2 +- images/ubuntu-slim/Makefile | 42 +++++++++++++++++++++++++---- 6 files changed, 100 insertions(+), 14 deletions(-) create mode 100644 images/ubuntu-slim/.gitignore diff --git a/images/nginx-slim/Dockerfile b/images/nginx-slim/Dockerfile index 06003cfd1..6858e275e 100644 --- a/images/nginx-slim/Dockerfile +++ b/images/nginx-slim/Dockerfile @@ -13,7 +13,7 @@ # limitations under the License. -FROM gcr.io/google_containers/ubuntu-slim:0.8 +FROM BASEIMAGE COPY build.sh /tmp diff --git a/images/nginx-slim/Makefile b/images/nginx-slim/Makefile index cb12e5307..38d16bda8 100644 --- a/images/nginx-slim/Makefile +++ b/images/nginx-slim/Makefile @@ -1,14 +1,44 @@ +# Copyright 2017 The Kubernetes Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + all: push # 0.0.0 shouldn't clobber any released builds -TAG = 0.15 -PREFIX = gcr.io/google_containers/nginx-slim +TAG = 0.16 +REGISTRY = gcr.io/google_containers +ARCH ?= $(shell go env GOARCH) + +IMGNAME = nginx-slim +IMAGE = $(REGISTRY)/${IMGNAME}-$(ARCH) + +# Set default base image dynamically for each arch +ifeq ($(ARCH),amd64) + BASEIMAGE?=gcr.io/google_containers/ubuntu-slim-amd64:0.9 +endif +ifeq ($(ARCH),ppc64le) + BASEIMAGE?=gcr.io/google_containers/ubuntu-slim-ppc64le:0.9 +endif + +TEMP_DIR := $(shell mktemp -d) container: - docker build --pull -t $(PREFIX):$(TAG) . + cp ./* $(TEMP_DIR) + cd $(TEMP_DIR) && sed -i.bak 's|BASEIMAGE|$(BASEIMAGE)|g' Dockerfile + docker build -t $(IMAGE):$(TAG) $(TEMP_DIR) push: container - gcloud docker -- push $(PREFIX):$(TAG) + gcloud docker -- push $(IMAGE):$(TAG) clean: docker rmi -f $(PREFIX):$(TAG) || true diff --git a/images/nginx-slim/build.sh b/images/nginx-slim/build.sh index 5a022839d..c8c1fa037 100755 --- a/images/nginx-slim/build.sh +++ b/images/nginx-slim/build.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # Copyright 2015 The Kubernetes Authors. # @@ -32,6 +32,8 @@ export NGINX_SUBSTITUTIONS=bc58cb11844bc42735bbaef7085ea86ace46d05b export BUILD_PATH=/tmp/build +ARCH=$(uname -p) + get_src() { hash="$1" @@ -47,6 +49,12 @@ get_src() mkdir "$BUILD_PATH" cd "$BUILD_PATH" +if [[ ${ARCH} == "ppc64le" ]]; then + apt-get update && apt-get install -y software-properties-common && \ + add-apt-repository -y ppa:ibmpackages/luajit + apt-get update && apt-get install -y lua5.1 lua5.1-dev +fi + # install required packages to build apt-get update && apt-get install --no-install-recommends -y \ bash \ @@ -120,6 +128,11 @@ cd "$BUILD_PATH/nginx-$NGINX_VERSION" echo "Applying tls nginx patches..." patch -p1 < $BUILD_PATH/nginx__dynamic_tls_records.patch +CC_OPT='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64' +if [[ ${ARCH} == "x86_64" ]]; then + CC_OPT+=' -mtune=generic' +fi + ./configure \ --prefix=/usr/share/nginx \ --conf-path=/etc/nginx/nginx.conf \ @@ -154,7 +167,7 @@ patch -p1 < $BUILD_PATH/nginx__dynamic_tls_records.patch --without-mail_imap_module \ --without-http_uwsgi_module \ --without-http_scgi_module \ - --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' \ + --with-cc-opt="${CC_OPT}" \ --add-module="$BUILD_PATH/ngx_devel_kit-$NDK_VERSION" \ --add-module="$BUILD_PATH/set-misc-nginx-module-$SETMISC_VERSION" \ --add-module="$BUILD_PATH/nginx-module-vts-$VTS_VERSION" \ @@ -169,7 +182,13 @@ patch -p1 < $BUILD_PATH/nginx__dynamic_tls_records.patch echo "Installing CJSON module" cd "$BUILD_PATH/lua-cjson-$LUA_CJSON_VERSION" -make LUA_INCLUDE_DIR=/usr/include/luajit-2.0 && make install + +if [[ ${ARCH} == "ppc64le" ]];then + LUA_DIR=/usr/include/luajit-2.1 +else + LUA_DIR=/usr/include/luajit-2.0 +fi +make LUA_INCLUDE_DIR=${LUA_DIR} && make install echo "Installing lua-resty-http module" # copy lua module @@ -195,6 +214,10 @@ apt-mark unmarkauto \ geoip-bin \ openssl +if [[ ${ARCH} == "ppc64le" ]]; then + apt-mark unmarkauto liblua5.1-0 +fi + apt-get remove -y --purge \ build-essential \ gcc-5 \ diff --git a/images/ubuntu-slim/.gitignore b/images/ubuntu-slim/.gitignore new file mode 100644 index 000000000..ebe3a543b --- /dev/null +++ b/images/ubuntu-slim/.gitignore @@ -0,0 +1 @@ +rootfs.tar \ No newline at end of file diff --git a/images/ubuntu-slim/Dockerfile.build b/images/ubuntu-slim/Dockerfile.build index 20949f7d6..1b0c1a007 100644 --- a/images/ubuntu-slim/Dockerfile.build +++ b/images/ubuntu-slim/Dockerfile.build @@ -1,4 +1,4 @@ -FROM ubuntu:16.04 +FROM BASEIMAGE ENV DEBIAN_FRONTEND=noninteractive diff --git a/images/ubuntu-slim/Makefile b/images/ubuntu-slim/Makefile index eef422e7a..ae1f65697 100755 --- a/images/ubuntu-slim/Makefile +++ b/images/ubuntu-slim/Makefile @@ -1,22 +1,54 @@ +# Copyright 2017 The Kubernetes Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + all: push -TAG ?= 0.8 -PREFIX ?= gcr.io/google-containers/ubuntu-slim +TAG ?= 0.9 +REGISTRY = gcr.io/google_containers +ARCH ?= $(shell go env GOARCH) + +IMGNAME = ubuntu-slim +IMAGE = $(REGISTRY)/${IMGNAME}-$(ARCH) + BUILD_IMAGE ?= ubuntu-build TAR_FILE ?= rootfs.tar PUSH_TOOL ?= gcloud +# Set default base image dynamically for each arch +ifeq ($(ARCH),amd64) + BASEIMAGE?=ubuntu:16.04 +endif +ifeq ($(ARCH),ppc64le) + BASEIMAGE?=ppc64le/ubuntu:16.04 +endif + +TEMP_DIR := $(shell mktemp -d) + container: clean - docker build --pull -t $(BUILD_IMAGE) -f Dockerfile.build . + cp ./* $(TEMP_DIR) + cd $(TEMP_DIR) && sed -i.bak 's|BASEIMAGE|$(BASEIMAGE)|g' Dockerfile.build + docker build --pull -t $(BUILD_IMAGE) -f $(TEMP_DIR)/Dockerfile.build $(TEMP_DIR) docker create --name $(BUILD_IMAGE) $(BUILD_IMAGE) docker export $(BUILD_IMAGE) > $(TAR_FILE) - docker build --pull -t $(PREFIX):$(TAG) . + cp rootfs.tar $(TEMP_DIR) + docker build --pull -t $(IMAGE):$(TAG) $(TEMP_DIR) push: container $(PUSH_TOOL) docker -- push $(PREFIX):$(TAG) clean: - docker rmi -f $(PREFIX):$(TAG) || true + docker rmi -f $(IMAGE):$(TAG) || true docker rmi -f $(BUILD_IMAGE) || true docker rm -f $(BUILD_IMAGE) || true rm -f $(TAR_FILE)