From ef92f588053bcc41d27d4f6873d33213f0975610 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Thu, 26 Oct 2017 13:12:27 +0100 Subject: [PATCH 01/18] Fix warning during build --- install-mq.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/install-mq.sh b/install-mq.sh index 745b5863..82973fa9 100644 --- a/install-mq.sh +++ b/install-mq.sh @@ -34,7 +34,6 @@ apt-get install -y --no-install-recommends \ gawk \ grep \ libc-bin \ - lsb-release \ mount \ passwd \ procps \ @@ -48,6 +47,14 @@ cd /tmp/mq curl -LO $MQ_URL tar -zxvf ./*.tar.gz +# Remove packages only needed by this script +apt-get purge -y \ + ca-certificates \ + curl + +# Remove any orphaned packages +apt-get autoremove -y + # Recommended: Create the mqm user ID with a fixed UID and group, so that the file permissions work between different images groupadd --system --gid 999 mqm useradd --system --uid 999 --gid mqm mqm @@ -81,6 +88,8 @@ apt-get upgrade -y libkrb5-26-heimdal apt-get upgrade -y libexpat1 # End of bug fixes + +# Clean up cached apt files rm -rf /var/lib/apt/lists/* # Optional: Update the command prompt with the MQ version From 72228f31191facd0cc304e4ff13822a3a8ca2164 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Thu, 26 Oct 2017 13:15:20 +0100 Subject: [PATCH 02/18] Build using Docker client in a container --- Makefile | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index a977b811..d5dfedff 100644 --- a/Makefile +++ b/Makefile @@ -13,9 +13,12 @@ # limitations under the License. BUILD_SERVER_CONTAINER=build-server +# Set architecture for Go code. Don't set GOOS globally, so that tests can be run locally export GOARCH ?= amd64 -# Don't set GOOS globally, so that tests can be run locally DOCKER_TAG_ARCH ?= x86_64 +# By default, all Docker client commands are run inside a Docker container. +# This means that newer features of the client can be used, even with an older daemon. +DOCKER ?= docker run --tty --interactive --rm --volume /var/run/docker.sock:/var/run/docker.sock --volume "$(CURDIR)":/var/src --workdir /var/src docker:stable docker DOCKER_TAG ?= latest-$(DOCKER_TAG_ARCH) DOCKER_REPO_DEVSERVER ?= mq-devserver DOCKER_REPO_ADVANCEDSERVER ?= mq-advancedserver @@ -106,9 +109,9 @@ endef define docker-build-mq # Create a temporary network to use for the build - docker network create build + $(DOCKER) network create build # Start a web server to host the MQ downloadable (tar.gz) file - docker run \ + $(DOCKER) run \ --rm \ --name $(BUILD_SERVER_CONTAINER) \ --network build \ @@ -117,7 +120,7 @@ define docker-build-mq --detach \ nginx:alpine # Build the new image - docker build \ + $(DOCKER) build \ --tag $1 \ --file $2 \ --network build \ @@ -127,31 +130,31 @@ define docker-build-mq --build-arg IBM_PRODUCT_VERSION=$6 \ . # Stop the web server (will also remove the container) - docker kill $(BUILD_SERVER_CONTAINER) + $(DOCKER) kill $(BUILD_SERVER_CONTAINER) # Delete the temporary network - docker network rm build + $(DOCKER) network rm build endef .PHONY: build-advancedserver build-advancedserver: build downloads/CNJR7ML.tar.gz $(info $(SPACER)$(shell printf $(TITLE)"Build $(DOCKER_FULL_ADVANCEDSERVER)"$(END))) $(call docker-build-mq,$(DOCKER_FULL_ADVANCEDSERVER),Dockerfile-server,CNJR7ML.tar.gz,"4486e8c4cc9146fd9b3ce1f14a2dfc5b","IBM MQ Advanced","9.0.3") - docker tag $(DOCKER_FULL_ADVANCEDSERVER) $(DOCKER_REPO_ADVANCEDSERVER):9.0.3-$(DOCKER_TAG_ARCH) + $(DOCKER) tag $(DOCKER_FULL_ADVANCEDSERVER) $(DOCKER_REPO_ADVANCEDSERVER):9.0.3-$(DOCKER_TAG_ARCH) .PHONY: build-devserver build-devserver: build downloads/mqadv_dev903_ubuntu_x86-64.tar.gz $(info $(shell printf $(TITLE)"Build $(DOCKER_FULL_DEVSERVER)"$(END))) $(call docker-build-mq,$(DOCKER_FULL_DEVSERVER),Dockerfile-server,mqadv_dev903_ubuntu_x86-64.tar.gz,"98102d16795c4263ad9ca075190a2d4d","IBM MQ Advanced for Developers (Non-Warranted)","9.0.3") - docker tag $(DOCKER_FULL_DEVSERVER) $(DOCKER_REPO_DEVSERVER):9.0.3-$(DOCKER_TAG_ARCH) + $(DOCKER) tag $(DOCKER_FULL_DEVSERVER) $(DOCKER_REPO_DEVSERVER):9.0.3-$(DOCKER_TAG_ARCH) # .PHONY: build-server # build-server: build downloads/CNJR7ML.tar.gz # $(call docker-build-mq,mq-server:latest-$(DOCKER_TAG_ARCH),Dockerfile-server,"79afd716d55b4f149a87bec52c9dc1aa","IBM MQ","9.0.3") -# docker tag mq-server:latest-$(DOCKER_TAG_ARCH) mq-server:9.0.3-$(DOCKER_TAG_ARCH) +# $(DOCKER) tag mq-server:latest-$(DOCKER_TAG_ARCH) mq-server:9.0.3-$(DOCKER_TAG_ARCH) .PHONY: build-advancedserver-cover build-advancedserver-cover: build-advanced-server build-cov - docker build -t mq-advancedserver:cover -f Dockerfile-server.cover . + $(DOCKER) build -t mq-advancedserver:cover -f Dockerfile-server.cover . # .PHONY: build-web # build-web: build downloads/CNJR7ML.tar.gz From 774cf26ac670a584626d5b46f296f65c5082a6a1 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Thu, 26 Oct 2017 13:16:23 +0100 Subject: [PATCH 03/18] Always pull latest base image --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index d5dfedff..621efe28 100644 --- a/Makefile +++ b/Makefile @@ -121,6 +121,8 @@ define docker-build-mq nginx:alpine # Build the new image $(DOCKER) build \ + # Always ensure that we have the latest base image + --pull \ --tag $1 \ --file $2 \ --network build \ From ab12ded7278cde0844009c115f936fda6f64ce91 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Thu, 26 Oct 2017 13:19:48 +0100 Subject: [PATCH 04/18] Remove unused Dockerfile --- Dockerfile-devserver | 50 -------------------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 Dockerfile-devserver diff --git a/Dockerfile-devserver b/Dockerfile-devserver deleted file mode 100644 index 904e48d9..00000000 --- a/Dockerfile-devserver +++ /dev/null @@ -1,50 +0,0 @@ -# © Copyright IBM Corporation 2015, 2017 -# -# 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. - -FROM ubuntu:16.04 - -LABEL "ProductID"="4486e8c4cc9146fd9b3ce1f14a2dfc5b" \ - "ProductName"="IBM MQ Advanced for Developers" \ - "ProductVersion"="9.0.3" - -# The URL to download the MQ installer from in tar.gz format -# This assumes an archive containing the MQ Debian (.deb) install packages -ARG MQ_URL=https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/mqadv_dev903_ubuntu_x86-64.tar.gz - -# The MQ packages to install -ARG MQ_PACKAGES="ibmmq-server ibmmq-java ibmmq-jre ibmmq-gskit ibmmq-msg-.* ibmmq-samples ibmmq-ams" - -COPY install-mq.sh /usr/local/bin/ -RUN chmod u+x /usr/local/bin/install-mq.sh \ -# To avoid a "text file busy" error here we sleep before installing. - && sleep 1 && install-mq.sh - -COPY build/runmqserver /usr/local/bin/ -COPY build/chkmq* /usr/local/bin/ -COPY NOTICES.txt /opt/mqm/licenses/notices-container.txt - -# MQ default developer config -COPY dev/mq-dev-config /etc/mqm/mq-dev-config -COPY dev/mq-dev-config.sh /usr/local/bin/ -COPY dev/admin.json /etc/mqm/ - -RUN chmod +x /usr/local/bin/runmqserver \ - && chmod +x /usr/local/bin/chk* - -# Always use port 1414 -EXPOSE 1414 - -ENV LANG=en_US.UTF-8 AMQ_DIAGNOSTIC_MSG_SEVERITY=1 - -ENTRYPOINT ["runmqserver"] From 9a05a1d5d1ae81217a605b1f43f5928940f5f5ab Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Thu, 26 Oct 2017 13:21:33 +0100 Subject: [PATCH 05/18] Remove comment --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 621efe28..edb1e771 100644 --- a/Makefile +++ b/Makefile @@ -121,7 +121,6 @@ define docker-build-mq nginx:alpine # Build the new image $(DOCKER) build \ - # Always ensure that we have the latest base image --pull \ --tag $1 \ --file $2 \ From 721c2e616ecaa68fc3e698ae470040f13feb6adf Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Thu, 26 Oct 2017 13:27:26 +0100 Subject: [PATCH 06/18] Add image labels dynamically --- Dockerfile-server | 14 ++++---------- Makefile | 6 +++--- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/Dockerfile-server b/Dockerfile-server index 985a8901..43fccd97 100644 --- a/Dockerfile-server +++ b/Dockerfile-server @@ -14,10 +14,6 @@ FROM ubuntu:16.04 -ARG IBM_PRODUCT_ID -ARG IBM_PRODUCT_NAME -ARG IBM_PRODUCT_VERSION - # The URL to download the MQ installer from in tar.gz format # This assumes an archive containing the MQ Debian (.deb) install packages ARG MQ_URL @@ -25,14 +21,12 @@ ARG MQ_URL # The MQ packages to install ARG MQ_PACKAGES="ibmmq-server ibmmq-java ibmmq-jre ibmmq-gskit ibmmq-msg-.* ibmmq-samples ibmmq-ams" -LABEL "ProductID"=$IBM_PRODUCT_ID \ - "ProductName"=$IBM_PRODUCT_NAME \ - "ProductVersion"=$IBM_PRODUCT_VERSION - COPY install-mq.sh /usr/local/bin/ + +# Install MQ. To avoid a "text file busy" error here, we sleep before installing. RUN chmod u+x /usr/local/bin/install-mq.sh \ -# To avoid a "text file busy" error here we sleep before installing. - && sleep 1 && install-mq.sh + && sleep 1 \ + && install-mq.sh COPY build/runmqserver /usr/local/bin/ COPY build/chkmq* /usr/local/bin/ diff --git a/Makefile b/Makefile index edb1e771..8111f47a 100644 --- a/Makefile +++ b/Makefile @@ -126,9 +126,9 @@ define docker-build-mq --file $2 \ --network build \ --build-arg MQ_URL=http://build:80/$3 \ - --build-arg IBM_PRODUCT_ID=$4 \ - --build-arg IBM_PRODUCT_NAME=$5 \ - --build-arg IBM_PRODUCT_VERSION=$6 \ + --label IBM_PRODUCT_ID=$4 \ + --label IBM_PRODUCT_NAME=$5 \ + --label IBM_PRODUCT_VERSION=$6 \ . # Stop the web server (will also remove the container) $(DOCKER) kill $(BUILD_SERVER_CONTAINER) From a8bb8084b34d26bd84aa14af2cb959156dc1942a Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Mon, 30 Oct 2017 15:46:47 +0000 Subject: [PATCH 07/18] Build Go code in Docker --- .dockerignore | 3 --- Dockerfile-server | 20 ++++++++++++++++++-- Makefile | 23 ++++------------------- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/.dockerignore b/.dockerignore index 8a5bdc2e..8a11d62b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,3 @@ charts -cmd downloads -pkg test -vendor diff --git a/Dockerfile-server b/Dockerfile-server index 43fccd97..d21e5a06 100644 --- a/Dockerfile-server +++ b/Dockerfile-server @@ -12,6 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. +# Build stage to build Go code +FROM golang:1.9 as builder +WORKDIR /go/src/github.com/ibm-messaging/mq-container/ +COPY cmd/ ./cmd +COPY pkg/ ./pkg +COPY vendor/ ./vendor +RUN GOOS=linux go build ./cmd/runmqserver/ +RUN GOOS=linux go build ./cmd/chkmqready/ +RUN GOOS=linux go build ./cmd/chkmqhealthy/ + +# Build stage to run Go unit tests +FROM golang:1.9 as tester +COPY pkg/ ./pkg +RUN cd pkg/name && GOOS=linux go test + +# Main build stage, to build MQ image FROM ubuntu:16.04 # The URL to download the MQ installer from in tar.gz format @@ -28,8 +44,8 @@ RUN chmod u+x /usr/local/bin/install-mq.sh \ && sleep 1 \ && install-mq.sh -COPY build/runmqserver /usr/local/bin/ -COPY build/chkmq* /usr/local/bin/ +COPY --from=builder /go/src/github.com/ibm-messaging/mq-container/runmqserver /usr/local/bin/ +COPY --from=builder /go/src/github.com/ibm-messaging/mq-container/chkmq* /usr/local/bin/ COPY NOTICES.txt /opt/mqm/licenses/notices-container.txt RUN chmod +x /usr/local/bin/runmqserver \ diff --git a/Makefile b/Makefile index 8111f47a..abd4551a 100644 --- a/Makefile +++ b/Makefile @@ -63,43 +63,28 @@ deps: cd test/docker && dep ensure -vendor-only cd test/kubernetes && dep ensure -vendor-only -build/runmqserver: - mkdir -p build - cd build; GOOS=linux go build ../cmd/runmqserver/ - -build/chkmqready: - mkdir -p build - cd build; GOOS=linux go build ../cmd/chkmqready/ - -build/chkmqhealthy: - mkdir -p build - cd build; GOOS=linux go build ../cmd/chkmqhealthy/ - -.PHONY: build -build: build/runmqserver build/chkmqready build/chkmqhealthy - .PHONY: build-cov build-cov: mkdir -p build cd build; go test -c -covermode=count ../cmd/runmqserver .PHONY: test-advancedserver -test-advancedserver: build +test-advancedserver: cd pkg/name && go test cd test/docker && TEST_IMAGE=$(DOCKER_FULL_ADVANCEDSERVER) go test $(TEST_OPTS_DOCKER) .PHONY: test-devserver -test-devserver: build +test-devserver: $(info $(SPACER)$(shell printf $(TITLE)"Test $(DOCKER_FULL_DEVSERVER)"$(END))) cd pkg/name && go test cd test/docker && TEST_IMAGE=$(DOCKER_FULL_DEVSERVER) go test .PHONY: test-kubernetes-devserver -test-kubernetes-devserver: build +test-kubernetes-devserver: $(call test-kubernetes,$(DOCKER_REPO_DEVSERVER),$(DOCKER_TAG),"../../charts/ibm-mqadvanced-server-dev") .PHONY: test-kubernetes-advancedserver -test-kubernetes-advancedserver: build +test-kubernetes-advancedserver: $(call test-kubernetes,$(DOCKER_REPO_ADVANCEDSERVER),$(DOCKER_TAG),"../../charts/ibm-mqadvanced-server-prod") define test-kubernetes From 6195ff892ead13328dacbb4ba6fdfcfef14ae5f2 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Mon, 30 Oct 2017 15:48:58 +0000 Subject: [PATCH 08/18] Core changes to prepare for MQ V9.0.4 --- Makefile | 17 +++++++++++++---- install-mq.sh | 17 +++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index abd4551a..7b715cad 100644 --- a/Makefile +++ b/Makefile @@ -121,11 +121,20 @@ define docker-build-mq $(DOCKER) network rm build endef -.PHONY: build-advancedserver -build-advancedserver: build downloads/CNJR7ML.tar.gz +# .PHONY: build-advancedserver-903 +# build-advancedserver-903: build downloads/CNJR7ML.tar.gz +# $(info $(SPACER)$(shell printf $(TITLE)"Build $(DOCKER_FULL_ADVANCEDSERVER)"$(END))) +# $(call docker-build-mq,$(DOCKER_FULL_ADVANCEDSERVER),Dockerfile-server,CNJR7ML.tar.gz,"4486e8c4cc9146fd9b3ce1f14a2dfc5b","IBM MQ Advanced","9.0.3") +# $(DOCKER) tag $(DOCKER_FULL_ADVANCEDSERVER) $(DOCKER_REPO_ADVANCEDSERVER):9.0.3-$(DOCKER_TAG_ARCH) + +.PHONY: build-advancedserver-904 +build-advancedserver-904: build downloads/CNLE4ML.tar.gz $(info $(SPACER)$(shell printf $(TITLE)"Build $(DOCKER_FULL_ADVANCEDSERVER)"$(END))) - $(call docker-build-mq,$(DOCKER_FULL_ADVANCEDSERVER),Dockerfile-server,CNJR7ML.tar.gz,"4486e8c4cc9146fd9b3ce1f14a2dfc5b","IBM MQ Advanced","9.0.3") - $(DOCKER) tag $(DOCKER_FULL_ADVANCEDSERVER) $(DOCKER_REPO_ADVANCEDSERVER):9.0.3-$(DOCKER_TAG_ARCH) + $(call docker-build-mq,$(DOCKER_FULL_ADVANCEDSERVER),Dockerfile-server,CNLE4ML.tar.gz,"4486e8c4cc9146fd9b3ce1f14a2dfc5b","IBM MQ Advanced","9.0.4") + $(DOCKER) tag $(DOCKER_FULL_ADVANCEDSERVER) $(DOCKER_REPO_ADVANCEDSERVER):9.0.4-$(DOCKER_TAG_ARCH) + +.PHONY: build-advancedserver +build-advancedserver: build-advancedserver-904 .PHONY: build-devserver build-devserver: build downloads/mqadv_dev903_ubuntu_x86-64.tar.gz diff --git a/install-mq.sh b/install-mq.sh index 82973fa9..47c7fc69 100644 --- a/install-mq.sh +++ b/install-mq.sh @@ -42,8 +42,9 @@ apt-get install -y --no-install-recommends \ util-linux # Download and extract the MQ installation files -mkdir -p /tmp/mq -cd /tmp/mq +DIR_EXTRACT=/tmp/mq +mkdir -p ${DIR_EXTRACT} +cd ${DIR_EXTRACT} curl -LO $MQ_URL tar -zxvf ./*.tar.gz @@ -59,11 +60,15 @@ apt-get autoremove -y groupadd --system --gid 999 mqm useradd --system --uid 999 --gid mqm mqm usermod -G mqm root -cd /tmp/mq/DebianMQServer + +# Find directory containing .deb files +DIR_DEB=$(find ${DIR_EXTRACT} -name "*.deb" -printf "%h\n" | sort -u | head -1) +# Find location of mqlicense.sh +MQLICENSE=$(find ${DIR_EXTRACT} -name "mqlicense.sh") # Accept the MQ license -./mqlicense.sh -text_only -accept -echo "deb [trusted=yes] file:/tmp/mq/DebianMQServer ./" > /etc/apt/sources.list.d/IBM_MQ.list +${MQLICENSE} -text_only -accept +echo "deb [trusted=yes] file:${DIR_DEB} ./" > /etc/apt/sources.list.d/IBM_MQ.list # Install MQ using the DEB packages apt-get update @@ -80,7 +85,7 @@ find /opt/mqm -name '*.tar.gz' -delete # Clean up all the downloaded files rm -f /etc/apt/sources.list.d/IBM_MQ.list -rm -rf /tmp/mq +rm -rf ${DIR_EXTRACT} # Apply any bug fixes not included in base Ubuntu or MQ image. # Don't upgrade everything based on Docker best practices https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#run From c7c1db9b1a1ec189954977420fe56ee5eacad62a Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Mon, 30 Oct 2017 16:04:15 +0000 Subject: [PATCH 09/18] Log when qmgr started --- cmd/runmqserver/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/runmqserver/main.go b/cmd/runmqserver/main.go index 8448f4a1..c0a8fce5 100644 --- a/cmd/runmqserver/main.go +++ b/cmd/runmqserver/main.go @@ -191,6 +191,7 @@ func startQueueManager() { if err != nil { log.Fatalf("Error %v starting queue manager: %v", rc, string(out)) } + log.Println("Started queue manager") } func configureQueueManager() { From 7efcef67e0cca5ab93532d739e368a0516974442 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Mon, 30 Oct 2017 16:04:26 +0000 Subject: [PATCH 10/18] Log user --- cmd/runmqserver/mqconfig.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/cmd/runmqserver/mqconfig.go b/cmd/runmqserver/mqconfig.go index a60f8df3..c66fc555 100644 --- a/cmd/runmqserver/mqconfig.go +++ b/cmd/runmqserver/mqconfig.go @@ -18,6 +18,7 @@ package main import ( "io/ioutil" "log" + "os/user" "runtime" "strings" @@ -54,6 +55,13 @@ func logBaseImage() error { return nil } +func logUser() { + u, err := user.Current() + if err == nil { + log.Printf("Running as user ID %v (%v) with primary group %v", u.Uid, u.Name, u.Gid) + } +} + func readProc(filename string) (value string, err error) { buf, err := ioutil.ReadFile(filename) if err != nil { @@ -106,13 +114,6 @@ func checkFS(path string) { func logConfig() { log.Printf("CPU architecture: %v", runtime.GOARCH) - // TODO: You can't use os.user if you're cross-compiling - // u, err := user.Current() - // if err != nil { - // log.Println(err) - // } else { - // log.Printf("Running as user ID %v (%v) with primary group %v", u.Uid, u.Name, u.Gid) - // } if runtime.GOOS == "linux" { var err error osr, err := readProc("/proc/sys/kernel/osrelease") @@ -128,6 +129,7 @@ func logConfig() { } else { log.Printf("Maximum file handles: %v", fileMax) } + logUser() readMounts() } else { log.Fatalf("Unsupported platform: %v", runtime.GOOS) From 0ffa87be31d2eb3ad7dc3b273ccea20a6b8ae4a3 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Mon, 30 Oct 2017 16:40:29 +0000 Subject: [PATCH 11/18] Remove unused commented code --- cmd/runmqserver/crtmqvol.go | 29 ---------------------------- cmd/runmqserver/main.go | 38 +------------------------------------ 2 files changed, 1 insertion(+), 66 deletions(-) diff --git a/cmd/runmqserver/crtmqvol.go b/cmd/runmqserver/crtmqvol.go index c7eca4c0..9997ebaa 100644 --- a/cmd/runmqserver/crtmqvol.go +++ b/cmd/runmqserver/crtmqvol.go @@ -23,22 +23,10 @@ import ( "syscall" ) -//const mainDir string := "/mnt/mqm" const mqmUID uint32 = 999 const mqmGID uint32 = 999 func createVolume(path string) error { - // fi, err := os.Stat(path) - // if err != nil { - // if os.IsNotExist(err) { - // // TODO: Should this be fatal? - // //log.Warnf("No volume found under %v", path) - // return nil - // } else { - // return err - // } - // } - //log.Printf("%v details: %v", path, fi.Sys()) dataPath := filepath.Join(path, "data") fi, err := os.Stat(dataPath) if err != nil { @@ -57,8 +45,6 @@ func createVolume(path string) error { } sys := fi.Sys() if sys != nil && runtime.GOOS == "linux" { - // log.Printf("Checking UID/GID for %v", dataPath) - //log.Debugf("Checking UID/GID for %v", dataPath) stat := sys.(*syscall.Stat_t) if stat.Uid != mqmUID || stat.Gid != mqmGID { err = os.Chown(dataPath, int(mqmUID), int(mqmGID)) @@ -70,18 +56,3 @@ func createVolume(path string) error { } return nil } - -// If /mnt/mqm exists -// If /mnt/mqm contains a "data" directory AND data is owned by mqm:mqm AND data is writeable by mqm:mqm then -// Create Symlink from /var/mqm to /mnt/mqm/data -// Else -// // Try to sort it out -// Create directory /mnt/mqm/data -// If directory not already owned by mqm:mqm -// chown mqm:mqm -// if error -// delete directory again if empty -// if directory not already 0755 -// chmod 0755 -// if error -// delete directory again if empty diff --git a/cmd/runmqserver/main.go b/cmd/runmqserver/main.go index c0a8fce5..06e0714a 100644 --- a/cmd/runmqserver/main.go +++ b/cmd/runmqserver/main.go @@ -125,7 +125,6 @@ func getQueueManagerName() (string, error) { // runCommand runs an OS command. On Linux it waits for the command to // complete and returns the exit status (return code). func runCommand(name string, arg ...string) (string, int, error) { - // log.Debugf("Running command %v %v", name, arg) cmd := exec.Command(name, arg...) // Run the command and wait for completion out, err := cmd.CombinedOutput() @@ -133,12 +132,8 @@ func runCommand(name string, arg ...string) (string, int, error) { var rc int // Only works on Linux if runtime.GOOS == "linux" { - // func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) var ws unix.WaitStatus - //var rusage syscall.Rusage unix.Wait4(cmd.Process.Pid, &ws, 0, nil) - //ee := err.(*os.SyscallError) - //ws := ee.Sys().(syscall.WaitStatus) rc = ws.ExitStatus() } else { rc = -1 @@ -274,40 +269,9 @@ func createReaper() { }() } -// mirrorLog tails the specified file, and logs each line. -// This is useful for usability, as the container console log can show -// messages from the MQ log. -// func mirrorLog(path string) error { -// tail, err := tail.TailFile(path, tail.Config{ -// ReOpen: true, -// Follow: true, -// Poll: true, -// Location: &tail.SeekInfo{ -// Offset: 0, -// // End of file -// Whence: 2, -// }, -// Logger: tail.DiscardingLogger, -// }) -// if err != nil { -// return err -// } -// go func() { -// for line := range tail.Lines { -// // TODO: Unless we parse the message, the timestamp will be (slightly) wrong -// if strings.HasPrefix(line.Text, "AMQ") { -// // TODO: Extended characters don't print correctly -// log.Println(line.Text) -// } -// } -// }() -// return nil -// } - func main() { createReaper() checkLicense() - // Start SIGTERM handler channel done := createTerminateChannel() @@ -316,13 +280,13 @@ func main() { log.Fatalln(err) } log.Printf("Using queue manager name: %v", name) + logConfig() err = createVolume("/mnt/mqm") if err != nil { log.Fatal(err) } createDirStructure() - //mirrorLog("/var/mqm/qmgrs/" + name + "/errors/AMQERR01.LOG") createQueueManager(name) updateCommandLevel() startQueueManager() From e6c4a21726e867377451d440ee4d86394551bdd4 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Tue, 31 Oct 2017 10:57:20 +0000 Subject: [PATCH 12/18] Fix compatibility with Kube 1.6 --- charts/ibm-mqadvanced-server-dev/Chart.yaml | 2 +- charts/ibm-mqadvanced-server-dev/README.md | 2 +- .../templates/stateful-set.yaml | 2 ++ charts/ibm-mqadvanced-server-prod/Chart.yaml | 2 +- charts/ibm-mqadvanced-server-prod/README.md | 2 +- .../templates/stateful-set.yaml | 2 ++ test/kubernetes/helm_test.go | 1 + test/kubernetes/helm_test_util.go | 20 +++++++++++++++++++ 8 files changed, 29 insertions(+), 4 deletions(-) diff --git a/charts/ibm-mqadvanced-server-dev/Chart.yaml b/charts/ibm-mqadvanced-server-dev/Chart.yaml index 7888dafa..dcfb3849 100644 --- a/charts/ibm-mqadvanced-server-dev/Chart.yaml +++ b/charts/ibm-mqadvanced-server-dev/Chart.yaml @@ -15,6 +15,6 @@ apiVersion: v1 description: IBM MQ queue manager name: ibm-mqadvanced-server-dev -version: 1.0.1 +version: 1.0.2 icon: https://developer.ibm.com/messaging/wp-content/uploads/sites/18/2017/07/IBM-MQ-Square-200.png tillerVersion: ">=2.4.0" diff --git a/charts/ibm-mqadvanced-server-dev/README.md b/charts/ibm-mqadvanced-server-dev/README.md index 98818c98..4ad04051 100644 --- a/charts/ibm-mqadvanced-server-dev/README.md +++ b/charts/ibm-mqadvanced-server-dev/README.md @@ -10,7 +10,7 @@ This chart deploys a single IBM MQ Advanced for Developers server (queue manager ## Prerequisites -- Kubernetes 1.7 or greater, with beta APIs enabled +- Kubernetes 1.6 or greater, with beta APIs enabled - If persistence is enabled (see [configuration](#configuration)), then you either need to create a PersistentVolume, or specify a Storage Class if classes are defined in your cluster. ## Installing the Chart diff --git a/charts/ibm-mqadvanced-server-dev/templates/stateful-set.yaml b/charts/ibm-mqadvanced-server-dev/templates/stateful-set.yaml index 4f9736fc..1d567aa9 100644 --- a/charts/ibm-mqadvanced-server-dev/templates/stateful-set.yaml +++ b/charts/ibm-mqadvanced-server-dev/templates/stateful-set.yaml @@ -24,8 +24,10 @@ metadata: spec: serviceName: {{ .Values.service.name }} replicas: 1 + {{- if and (ge (.Capabilities.KubeVersion.Major | int) 1) (ge (.Capabilities.KubeVersion.Minor | int) 7) }} updateStrategy: type: RollingUpdate + {{- end }} template: metadata: labels: diff --git a/charts/ibm-mqadvanced-server-prod/Chart.yaml b/charts/ibm-mqadvanced-server-prod/Chart.yaml index 4f8a054f..f6a303ec 100644 --- a/charts/ibm-mqadvanced-server-prod/Chart.yaml +++ b/charts/ibm-mqadvanced-server-prod/Chart.yaml @@ -15,6 +15,6 @@ apiVersion: v1 description: IBM MQ queue manager name: ibm-mqadvanced-server-prod -version: 1.0.1 +version: 1.0.2 icon: https://developer.ibm.com/messaging/wp-content/uploads/sites/18/2017/07/IBM-MQ-Square-200.png tillerVersion: ">=2.4.0" diff --git a/charts/ibm-mqadvanced-server-prod/README.md b/charts/ibm-mqadvanced-server-prod/README.md index 401acd14..ee506c07 100644 --- a/charts/ibm-mqadvanced-server-prod/README.md +++ b/charts/ibm-mqadvanced-server-prod/README.md @@ -10,7 +10,7 @@ This chart deploys a single IBM MQ Advanced server (queue manager) into an IBM C ## Prerequisites -- Kubernetes 1.7 or greater, with beta APIs enabled +- Kubernetes 1.6 or greater, with beta APIs enabled - If persistence is enabled (see [configuration](#configuration)), then you either need to create a PersistentVolume, or specify a Storage Class if classes are defined in your cluster. ## Installing the Chart diff --git a/charts/ibm-mqadvanced-server-prod/templates/stateful-set.yaml b/charts/ibm-mqadvanced-server-prod/templates/stateful-set.yaml index bfcd3b33..fd658532 100644 --- a/charts/ibm-mqadvanced-server-prod/templates/stateful-set.yaml +++ b/charts/ibm-mqadvanced-server-prod/templates/stateful-set.yaml @@ -24,8 +24,10 @@ metadata: spec: serviceName: {{ .Values.service.name }} replicas: 1 + {{- if and (ge (.Capabilities.KubeVersion.Major | int) 1) (ge (.Capabilities.KubeVersion.Minor | int) 7) }} updateStrategy: type: RollingUpdate + {{- end }} template: metadata: labels: diff --git a/test/kubernetes/helm_test.go b/test/kubernetes/helm_test.go index 6e33c4e2..af8e41e5 100644 --- a/test/kubernetes/helm_test.go +++ b/test/kubernetes/helm_test.go @@ -40,6 +40,7 @@ func TestHelmPredefinedVolume(t *testing.T) { func TestHelmStorageClass(t *testing.T) { cs := kubeLogin(t) release := strings.ToLower(t.Name()) + assertKubeVersion(t, cs, 1, 6) if !storageClassesDefined(t, cs) { t.Skipf("Skipping test because no storage classes were found") } diff --git a/test/kubernetes/helm_test_util.go b/test/kubernetes/helm_test_util.go index 9e72dd73..2b5a118f 100644 --- a/test/kubernetes/helm_test_util.go +++ b/test/kubernetes/helm_test_util.go @@ -21,6 +21,7 @@ import ( "os" "os/exec" "runtime" + "strconv" "strings" "testing" "time" @@ -257,4 +258,23 @@ func volumesAvailable(t *testing.T, cs *kubernetes.Clientset) bool { return false } +// assertKubeVersion is used to assert that a test requires a specific version of Kubernetes +func assertKubeVersion(t *testing.T, cs *kubernetes.Clientset, major int, minor int) { + v, err := cs.Discovery().ServerVersion() + if err != nil { + t.Fatal(err) + } + maj, err := strconv.Atoi(v.Major) + if err != nil { + t.Fatal(err) + } + min, err := strconv.Atoi(v.Minor) + if err != nil { + t.Fatal(err) + } + if maj <= major && min < minor { + t.Skipf("Skipping test because it's not suitable for Kubernetes %v.%v", v.Major, v.Minor) + } +} + // TODO: On Minikube, need to make sure Helm is initialized first From 9c9a2e1e911c6fa3850b84e572977c84212f2b0d Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Tue, 31 Oct 2017 16:18:01 +0000 Subject: [PATCH 13/18] Log Linux capabilities --- Dockerfile-server | 9 +- cmd/runmqserver/mqconfig.go | 14 ++ pkg/linux/capabilities/capabilities.go | 158 ++++++++++++++++++++ pkg/linux/capabilities/capabilities_test.go | 39 +++++ 4 files changed, 216 insertions(+), 4 deletions(-) create mode 100644 pkg/linux/capabilities/capabilities.go create mode 100644 pkg/linux/capabilities/capabilities_test.go diff --git a/Dockerfile-server b/Dockerfile-server index d21e5a06..7222dcd5 100644 --- a/Dockerfile-server +++ b/Dockerfile-server @@ -18,14 +18,15 @@ WORKDIR /go/src/github.com/ibm-messaging/mq-container/ COPY cmd/ ./cmd COPY pkg/ ./pkg COPY vendor/ ./vendor -RUN GOOS=linux go build ./cmd/runmqserver/ -RUN GOOS=linux go build ./cmd/chkmqready/ -RUN GOOS=linux go build ./cmd/chkmqhealthy/ +RUN go build ./cmd/runmqserver/ +RUN go build ./cmd/chkmqready/ +RUN go build ./cmd/chkmqhealthy/ # Build stage to run Go unit tests FROM golang:1.9 as tester COPY pkg/ ./pkg -RUN cd pkg/name && GOOS=linux go test +RUN cd pkg/name && go test +RUN cd pkg/linux/capabilities && go test # Main build stage, to build MQ image FROM ubuntu:16.04 diff --git a/cmd/runmqserver/mqconfig.go b/cmd/runmqserver/mqconfig.go index c66fc555..7a90fd2f 100644 --- a/cmd/runmqserver/mqconfig.go +++ b/cmd/runmqserver/mqconfig.go @@ -22,6 +22,7 @@ import ( "runtime" "strings" + "github.com/ibm-messaging/mq-container/pkg/linux/capabilities" "golang.org/x/sys/unix" ) @@ -62,6 +63,18 @@ func logUser() { } } +func logCapabilities() { + status, err := readProc("/proc/1/status") + if err != nil { + // Ignore + return + } + caps, err := capabilities.DetectCapabilities(status) + if err == nil { + log.Printf("Detected capabilities: %v", strings.Join(caps, ",")) + } +} + func readProc(filename string) (value string, err error) { buf, err := ioutil.ReadFile(filename) if err != nil { @@ -130,6 +143,7 @@ func logConfig() { log.Printf("Maximum file handles: %v", fileMax) } logUser() + logCapabilities() readMounts() } else { log.Fatalf("Unsupported platform: %v", runtime.GOOS) diff --git a/pkg/linux/capabilities/capabilities.go b/pkg/linux/capabilities/capabilities.go new file mode 100644 index 00000000..2cdbc3aa --- /dev/null +++ b/pkg/linux/capabilities/capabilities.go @@ -0,0 +1,158 @@ +/* +© Copyright IBM Corporation 2017 + +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. +*/ + +// capabilities allows querying of information on Linux capabilities +package capabilities + +import ( + "errors" + "strconv" + "strings" +) + +// DetectCapabilities determines Linux capabilities, based on the contents of a Linux "status" file. +// For example, the contents of file `/proc/1/status` +func DetectCapabilities(status string) ([]string, error) { + lines := strings.Split(status, "\n") + for _, line := range lines { + if strings.HasPrefix(strings.TrimSpace(line), "CapPrm:") { + words := strings.Fields(line) + cap, err := strconv.ParseUint(words[1], 16, 64) + if err != nil { + return nil, err + } + return getCapabilities(cap), nil + } + } + return nil, errors.New("Unable to detect capabilities") +} + +// getCapabilities converts an encoded uint64 into a slice of string names of Linux capabilities +func getCapabilities(cap uint64) []string { + caps := make([]string, 0, 37) + if cap&0x0000000040000000 == 0x0000000040000000 { + caps = append(caps, "AUDIT_CONTROL") + } + if cap&0x0000000020000000 == 0x0000000020000000 { + caps = append(caps, "AUDIT_WRITE") + } + if cap&0x0000001000000000 == 0x0000001000000000 { + caps = append(caps, "BLOCK_SUSPEND") + } + if cap&0x0000000000000001 == 0x0000000000000001 { + caps = append(caps, "CHOWN") + } + if cap&0x0000000000000002 == 0x0000000000000002 { + caps = append(caps, "DAC_OVERRIDE") + } + if cap&0x0000000000000004 == 0x0000000000000004 { + caps = append(caps, "DAC_READ_SEARCH") + } + if cap&0x0000000000000008 == 0x0000000000000008 { + caps = append(caps, "FOWNER") + } + if cap&0x0000000000000010 == 0x0000000000000010 { + caps = append(caps, "FSETID") + } + if cap&0x0000000000004000 == 0x0000000000004000 { + caps = append(caps, "IPC_LOCK") + } + if cap&0x0000000000008000 == 0x0000000000008000 { + caps = append(caps, "IPC_OWNER") + } + if cap&0x0000000000000020 == 0x0000000000000020 { + caps = append(caps, "KILL") + } + if cap&0x0000000010000000 == 0x0000000010000000 { + caps = append(caps, "LEASE") + } + if cap&0x0000000000000200 == 0x0000000000000200 { + caps = append(caps, "LINUX_IMMUTABLE") + } + if cap&0x0000000200000000 == 0x0000000200000000 { + caps = append(caps, "MAC_ADMIN") + } + if cap&0x0000000100000000 == 0x0000000100000000 { + caps = append(caps, "MAC_OVERRIDE") + } + if cap&0x0000000008000000 == 0x0000000008000000 { + caps = append(caps, "MKNOD") + } + if cap&0x0000000000001000 == 0x0000000000001000 { + caps = append(caps, "NET_ADMIN") + } + if cap&0x0000000000000400 == 0x0000000000000400 { + caps = append(caps, "NET_BIND_SERVICE") + } + if cap&0x0000000000000800 == 0x0000000000000800 { + caps = append(caps, "NET_BROADCAST") + } + if cap&0x0000000000002000 == 0x0000000000002000 { + caps = append(caps, "NET_RAW") + } + if cap&0x0000000080000000 == 0x0000000080000000 { + caps = append(caps, "SETFCAP") + } + if cap&0x0000000000000040 == 0x0000000000000040 { + caps = append(caps, "SETGID") + } + if cap&0x0000000000000100 == 0x0000000000000100 { + caps = append(caps, "SETPCAP") + } + if cap&0x0000000000000080 == 0x0000000000000080 { + caps = append(caps, "SETUID") + } + if cap&0x0000000400000000 == 0x0000000400000000 { + caps = append(caps, "SYSLOG") + } + if cap&0x0000000000200000 == 0x0000000000200000 { + caps = append(caps, "SYS_ADMIN") + } + if cap&0x0000000000400000 == 0x0000000000400000 { + caps = append(caps, "SYS_BOOT") + } + if cap&0x0000000000040000 == 0x0000000000040000 { + caps = append(caps, "SYS_CHROOT") + } + if cap&0x0000000000010000 == 0x0000000000010000 { + caps = append(caps, "SYS_MODULE") + } + if cap&0x0000000000800000 == 0x0000000000800000 { + caps = append(caps, "SYS_NICE") + } + if cap&0x0000000000100000 == 0x0000000000100000 { + caps = append(caps, "SYS_PACCT") + } + if cap&0x0000000000080000 == 0x0000000000080000 { + caps = append(caps, "SYS_PTRACE") + } + if cap&0x0000000000020000 == 0x0000000000020000 { + caps = append(caps, "SYS_RAWIO") + } + if cap&0x0000000001000000 == 0x0000000001000000 { + caps = append(caps, "SYS_RESOURCE") + } + if cap&0x0000000002000000 == 0x0000000002000000 { + caps = append(caps, "SYS_TIME") + } + if cap&0x0000000004000000 == 0x0000000004000000 { + caps = append(caps, "SYS_TTY_CONFIG") + } + if cap&0x0000000800000000 == 0x0000000800000000 { + caps = append(caps, "WAKE_ALARM") + } + return caps +} diff --git a/pkg/linux/capabilities/capabilities_test.go b/pkg/linux/capabilities/capabilities_test.go new file mode 100644 index 00000000..dae2973a --- /dev/null +++ b/pkg/linux/capabilities/capabilities_test.go @@ -0,0 +1,39 @@ +/* +© Copyright IBM Corporation 2017 + +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. +*/ +package capabilities + +import ( + "reflect" + "testing" +) + +var capTests = []struct { + in uint64 + out []string +}{ + {0x0000000040000000, []string{"AUDIT_CONTROL"}}, + // Default values when you run a Docker container without changing capabilities: + {0x00000000a80425fb, []string{"AUDIT_WRITE", "CHOWN", "DAC_OVERRIDE", "FOWNER", "FSETID", "KILL", "MKNOD", "NET_BIND_SERVICE", "NET_RAW", "SETFCAP", "SETGID", "SETPCAP", "SETUID", "SYS_CHROOT"}}, +} + +func TestGetCapabilities(t *testing.T) { + for _, table := range capTests { + caps := getCapabilities(table.in) + if !reflect.DeepEqual(caps, table.out) { + t.Errorf("getCapabilities(%v) - expected %v, got %v", table.in, table.out, caps) + } + } +} From 8c4daa955407c639a1efffeb413c1665845c132d Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Tue, 31 Oct 2017 16:18:36 +0000 Subject: [PATCH 14/18] Default values for MQ repo and tag --- charts/ibm-mqadvanced-server-prod/values.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/ibm-mqadvanced-server-prod/values.yaml b/charts/ibm-mqadvanced-server-prod/values.yaml index c818d9a7..c28eb41c 100644 --- a/charts/ibm-mqadvanced-server-prod/values.yaml +++ b/charts/ibm-mqadvanced-server-prod/values.yaml @@ -17,9 +17,9 @@ license: "not accepted" image: # repository is the container repository to use, which must contain IBM MQ Advanced - repository: + repository: ibm-mqadvanced-server # tag is the tag to use for the container repository - tag: + tag: 9.0.4.0 # pullSecret is the secret to use when pulling the image from a private registry pullSecret: # pullPolicy is either IfNotPresent or Always (https://kubernetes.io/docs/concepts/containers/images/) From de28a7030a6c2cd0ba2521d09935bcd03a589f70 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Tue, 31 Oct 2017 16:20:03 +0000 Subject: [PATCH 15/18] Add changelog --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..daa48e44 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Change log + +## 9.0.4 (2017-11-01) +* Updated to MQ version 9.0.4.0 +* Updated to Go version 9 +* Removed packages `curl`, `ca-certificates`, and their dependencies, which were only used at build time +* Improved logging +* Helm charts now work on Kubernetes V1.6 +* Production Helm chart now includes a default image repository and tag +* Updated to use multi-stage Docker build, so that Go code is built inside a container + +## 9.0.3 (2017-10-17) +* Initial version \ No newline at end of file From f720eb2338fb144971481bfb7adbcfb24c9e1830 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Tue, 31 Oct 2017 16:25:19 +0000 Subject: [PATCH 16/18] Fix default image tag --- charts/ibm-mqadvanced-server-prod/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/ibm-mqadvanced-server-prod/values.yaml b/charts/ibm-mqadvanced-server-prod/values.yaml index c28eb41c..d55bd22f 100644 --- a/charts/ibm-mqadvanced-server-prod/values.yaml +++ b/charts/ibm-mqadvanced-server-prod/values.yaml @@ -19,7 +19,7 @@ image: # repository is the container repository to use, which must contain IBM MQ Advanced repository: ibm-mqadvanced-server # tag is the tag to use for the container repository - tag: 9.0.4.0 + tag: 9.0.4.0-x86_64 # pullSecret is the secret to use when pulling the image from a private registry pullSecret: # pullPolicy is either IfNotPresent or Always (https://kubernetes.io/docs/concepts/containers/images/) From 3cc1a09d48de3f90433826737d693c66f54b5637 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Tue, 31 Oct 2017 16:30:43 +0000 Subject: [PATCH 17/18] Fix for devserver build --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 7b715cad..764b8ec2 100644 --- a/Makefile +++ b/Makefile @@ -128,7 +128,7 @@ endef # $(DOCKER) tag $(DOCKER_FULL_ADVANCEDSERVER) $(DOCKER_REPO_ADVANCEDSERVER):9.0.3-$(DOCKER_TAG_ARCH) .PHONY: build-advancedserver-904 -build-advancedserver-904: build downloads/CNLE4ML.tar.gz +build-advancedserver-904: downloads/CNLE4ML.tar.gz $(info $(SPACER)$(shell printf $(TITLE)"Build $(DOCKER_FULL_ADVANCEDSERVER)"$(END))) $(call docker-build-mq,$(DOCKER_FULL_ADVANCEDSERVER),Dockerfile-server,CNLE4ML.tar.gz,"4486e8c4cc9146fd9b3ce1f14a2dfc5b","IBM MQ Advanced","9.0.4") $(DOCKER) tag $(DOCKER_FULL_ADVANCEDSERVER) $(DOCKER_REPO_ADVANCEDSERVER):9.0.4-$(DOCKER_TAG_ARCH) @@ -137,7 +137,7 @@ build-advancedserver-904: build downloads/CNLE4ML.tar.gz build-advancedserver: build-advancedserver-904 .PHONY: build-devserver -build-devserver: build downloads/mqadv_dev903_ubuntu_x86-64.tar.gz +build-devserver: downloads/mqadv_dev903_ubuntu_x86-64.tar.gz $(info $(shell printf $(TITLE)"Build $(DOCKER_FULL_DEVSERVER)"$(END))) $(call docker-build-mq,$(DOCKER_FULL_DEVSERVER),Dockerfile-server,mqadv_dev903_ubuntu_x86-64.tar.gz,"98102d16795c4263ad9ca075190a2d4d","IBM MQ Advanced for Developers (Non-Warranted)","9.0.3") $(DOCKER) tag $(DOCKER_FULL_DEVSERVER) $(DOCKER_REPO_DEVSERVER):9.0.3-$(DOCKER_TAG_ARCH) @@ -156,7 +156,7 @@ build-advancedserver-cover: build-advanced-server build-cov # $(call docker-build-mq,mq-web:latest-$(DOCKER_TAG_ARCH),Dockerfile-mq-web) .PHONY: build-explorer -build-explorer: build downloads/mqadv_dev903_ubuntu_x86-64.tar.gz +build-explorer: downloads/mqadv_dev903_ubuntu_x86-64.tar.gz $(call docker-build-mq,mq-explorer:latest-$(DOCKER_TAG_ARCH),incubating/mq-explorer/Dockerfile-mq-explorer,mqadv_dev903_ubuntu_x86-64.tar.gz,"98102d16795c4263ad9ca075190a2d4d","IBM MQ Advanced for Developers (Non-Warranted)","9.0.3") include formatting.mk From 7c91187ce34489ac0e1150da6dda9a2bcaf35707 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Tue, 31 Oct 2017 16:45:22 +0000 Subject: [PATCH 18/18] Update Docker version in Travis --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index ee5ef445..2973abed 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,10 @@ services: - docker before_install: + - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + - sudo apt-get update + - sudo apt-get -y install docker-ce - curl https://glide.sh/get | sh - curl -LO https://github.com/golang/dep/releases/download/v0.3.0/dep-linux-amd64.zip - unzip dep-linux-amd64.zip