Repository: calcite-avatica Updated Branches: refs/heads/master c42a01716 -> c43aec544
[CALCITE-1364] Docker images for an avatica server * Includes a base Docker image for an Avatica server with alpine * Includes "implementations" for hsqldb, postgresql, mysql * Includes docker-compose files for postgresl/mysql + avatica * Includes a base Docker image suitable for auto-promotion to Dockerhub * Includes verification of versions in the Dockerhub Dockerfile * An assembly built containing all docker files * Site update to describe what is present Closes apache/calcite-avatica#3 Project: http://git-wip-us.apache.org/repos/asf/calcite-avatica/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite-avatica/commit/c43aec54 Tree: http://git-wip-us.apache.org/repos/asf/calcite-avatica/tree/c43aec54 Diff: http://git-wip-us.apache.org/repos/asf/calcite-avatica/diff/c43aec54 Branch: refs/heads/master Commit: c43aec5449653d08dc4c183742aa28528ee280a9 Parents: c42a017 Author: Josh Elser <[email protected]> Authored: Sun Mar 26 14:50:29 2017 -0400 Committer: Josh Elser <[email protected]> Committed: Thu Apr 6 13:33:03 2017 -0400 ---------------------------------------------------------------------- docker/README.md | 46 ++++++ docker/pom.xml | 124 +++++++++++++++ docker/src/assembly/docker-files.xml | 35 +++++ docker/src/main/docker/Dockerfile | 36 +++++ docker/src/main/docker/hypersql/Dockerfile | 26 ++++ docker/src/main/docker/hypersql/build.sh | 20 +++ docker/src/main/docker/mysql/Dockerfile | 25 +++ docker/src/main/docker/mysql/build.sh | 20 +++ docker/src/main/docker/mysql/docker-compose.yml | 34 +++++ docker/src/main/docker/postgresql/Dockerfile | 25 +++ docker/src/main/docker/postgresql/build.sh | 20 +++ .../main/docker/postgresql/docker-compose.yml | 34 +++++ docker/src/main/dockerhub/Dockerfile | 38 +++++ .../verify-dockerhub-dockerfile-version.groovy | 53 +++++++ pom.xml | 16 ++ site/_data/docs.yml | 1 + site/_docs/docker_images.md | 151 +++++++++++++++++++ standalone-server/pom.xml | 4 +- .../avatica/standalone/StandaloneServer.java | 14 +- 19 files changed, 718 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/README.md ---------------------------------------------------------------------- diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..2633a9c --- /dev/null +++ b/docker/README.md @@ -0,0 +1,46 @@ +<!-- +{% comment %} +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to you 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. +{% endcomment %} +--> + +This module contains a number of Dockerfiles to ease testing of +Avatica clients against a known-server. + +## Docker + +`src/main/docker` contains a number of Dockerfiles and Docker-compose +configuration files to launch a standalone-Avatica server. Maven automation +exists for the base Docker image "avatica-server" which can be invoked with +the "-Pdocker" Maven profile. + +The other Dockerfiles must be built by hand. + +### Provided Images + +A number of Dockerfiles for different databases are provided. Presently, they include: + +* [HyperSQL](https://github.com/apache/calcite-avatica/tree/master/docker/src/main/docker/hypersql) +* [MySQL](https://github.com/apache/calcite-avatica/tree/master/docker/src/main/docker/mysql) +* [PostgreSQL](https://github.com/apache/calcite-avatica/tree/master/docker/src/main/docker/postgresql) + +## Dockerhub + +`src/main/dockerhub` contains a copy of the same `avatica-server` Dockerfile +that is present in `src/main/docker` that is designed to be used with the +automation around publishing Docker images to the Apache Dockerhub account. + +It is not expected that users would interact with this Dockerfile. http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/pom.xml ---------------------------------------------------------------------- diff --git a/docker/pom.xml b/docker/pom.xml new file mode 100644 index 0000000..f555ab9 --- /dev/null +++ b/docker/pom.xml @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to you 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.calcite.avatica</groupId> + <artifactId>avatica-parent</artifactId> + <version>1.10.0-SNAPSHOT</version> + </parent> + + <artifactId>avatica-docker</artifactId> + <packaging>pom</packaging> + <name>Apache Calcite Avatica Docker images</name> + <description>Docker images for the Avatica server</description> + + <properties> + <top.dir>${project.basedir}/..</top.dir> + </properties> + + <dependencies> + <dependency> + <groupId>org.apache.calcite.avatica</groupId> + <artifactId>avatica-standalone-server</artifactId> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <!-- Use the execution instead of configuration to bind it to package --> + <executions> + <execution> + <id>binary-assembly</id> + <goals> + <goal>single</goal> + </goals> + <phase>package</phase> + <configuration> + <descriptors> + <descriptor>src/assembly/docker-files.xml</descriptor> + </descriptors> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + <profiles> + <!-- Profile for building official Docker images. Not bound to build phases since that would require anyone build to have the Docker engine installed on their machine --> + <profile> + <id>docker</id> + <build> + <plugins> + <plugin> + <groupId>com.spotify</groupId> + <artifactId>docker-maven-plugin</artifactId> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>build</goal> + </goals> + </execution> + </executions> + <configuration> + <imageName>avatica-server</imageName> + <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory> + <imageTags> + <imageTag>${project.version}</imageTag> + <imageTag>latest</imageTag> + </imageTags> + <resources> + <resource> + <targetPath>/</targetPath> + <directory>${top.dir}/standalone-server/target</directory> + <include>avatica-standalone-server-${project.version}-shaded.jar</include> + </resource> + </resources> + </configuration> + </plugin> + </plugins> + </build> + </profile> + <profile> + <!-- Need to verify that the URL we're pulling from in the Dockerfile is correct for this release --> + <id>apache-release</id> + <build> + <plugins> + <plugin> + <groupId>org.codehaus.gmaven</groupId> + <artifactId>groovy-maven-plugin</artifactId> + <executions> + <execution> + <id>check-dockerhub-dockerfile-version</id> + <phase>validate</phase> + <goals> + <goal>execute</goal> + </goals> + <configuration> + <source>${project.basedir}/src/test/scripts/verify-dockerhub-dockerfile-version.groovy</source> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + </profiles> +</project> http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/assembly/docker-files.xml ---------------------------------------------------------------------- diff --git a/docker/src/assembly/docker-files.xml b/docker/src/assembly/docker-files.xml new file mode 100644 index 0000000..5bfcce5 --- /dev/null +++ b/docker/src/assembly/docker-files.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to you 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. +--> +<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> + <id>docker-files</id> + <formats> + <format>tar.gz</format> + <format>zip</format> + </formats> + <fileSets> + <fileSet> + <directory>src/main/docker</directory> + <outputDirectory></outputDirectory> + <includes> + <include>**</include> + </includes> + </fileSet> + </fileSets> +</assembly> http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/main/docker/Dockerfile ---------------------------------------------------------------------- diff --git a/docker/src/main/docker/Dockerfile b/docker/src/main/docker/Dockerfile new file mode 100644 index 0000000..e5b48de --- /dev/null +++ b/docker/src/main/docker/Dockerfile @@ -0,0 +1,36 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you 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 openjdk:8-jre-alpine +MAINTAINER Apache Avatica <[email protected]> + +# Create an avatica user +RUN addgroup -S avatica && adduser -S -G avatica avatica +RUN mkdir -p /home/avatica/classpath + +# Dependencies +ADD avatica-standalone-server-*-shaded.jar /home/avatica/classpath + +# Make sure avatica owns its files +RUN chown -R avatica: /home/avatica + +# Expose the default port as a convenience +EXPOSE 8765 + +# Switch off of the root user +# TODO Would like to do this, but screws up downstream due to https://github.com/docker/docker/issues/6119 +# USER avatica + +ENTRYPOINT ["/usr/bin/java", "-cp", "/home/avatica/classpath/*", "org.apache.calcite.avatica.standalone.StandaloneServer", "-p", "8765"] http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/main/docker/hypersql/Dockerfile ---------------------------------------------------------------------- diff --git a/docker/src/main/docker/hypersql/Dockerfile b/docker/src/main/docker/hypersql/Dockerfile new file mode 100644 index 0000000..a79dfa2 --- /dev/null +++ b/docker/src/main/docker/hypersql/Dockerfile @@ -0,0 +1,26 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you 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 avatica-server:latest +MAINTAINER Apache Avatica <[email protected]> + +ARG HSQLDB_VERSION="2.3.1" + +# Dependencies +ADD https://repo1.maven.org/maven2/net/hydromatic/scott-data-hsqldb/0.1/scott-data-hsqldb-0.1.jar /home/avatica/classpath/ +ADD https://repo1.maven.org/maven2/org/hsqldb/hsqldb/${HSQLDB_VERSION}/hsqldb-${HSQLDB_VERSION}.jar /home/avatica/classpath/ + +# Add on to avatica-server's entrypoint +CMD ["-u", "jdbc:hsqldb:res:scott"] http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/main/docker/hypersql/build.sh ---------------------------------------------------------------------- diff --git a/docker/src/main/docker/hypersql/build.sh b/docker/src/main/docker/hypersql/build.sh new file mode 100755 index 0000000..1360807 --- /dev/null +++ b/docker/src/main/docker/hypersql/build.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you 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. + +cd "$(dirname "$0")" + +docker build . -t avatica-hsqldb-server http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/main/docker/mysql/Dockerfile ---------------------------------------------------------------------- diff --git a/docker/src/main/docker/mysql/Dockerfile b/docker/src/main/docker/mysql/Dockerfile new file mode 100644 index 0000000..c8a5d5b --- /dev/null +++ b/docker/src/main/docker/mysql/Dockerfile @@ -0,0 +1,25 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you 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 avatica-server:latest +MAINTAINER Apache Avatica <[email protected]> + +ARG MYSQL_VERSION="5.1.41" + +# Dependencies +ADD https://repo1.maven.org/maven2/mysql/mysql-connector-java/${MYSQL_VERSION}/mysql-connector-java-${MYSQL_VERSION}.jar /home/avatica/classpath/ +RUN chown -R avatica: /home/avatica + +USER avatica http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/main/docker/mysql/build.sh ---------------------------------------------------------------------- diff --git a/docker/src/main/docker/mysql/build.sh b/docker/src/main/docker/mysql/build.sh new file mode 100755 index 0000000..9aca34d --- /dev/null +++ b/docker/src/main/docker/mysql/build.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you 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. + +cd "$(dirname "$0")" + +docker build . -t avatica-mysql-server http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/main/docker/mysql/docker-compose.yml ---------------------------------------------------------------------- diff --git a/docker/src/main/docker/mysql/docker-compose.yml b/docker/src/main/docker/mysql/docker-compose.yml new file mode 100644 index 0000000..c20eaf5 --- /dev/null +++ b/docker/src/main/docker/mysql/docker-compose.yml @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you 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. + +version: '2' +services: + avatica: + ports: + - "8765:8765" + links: + - mysql + build: ./ + image: avatica-mysql-server + command: "-u 'jdbc:mysql://mysql:3306/avatica'" + depends_on: + - mysql + mysql: + image: mysql:5.7 + environment: + MYSQL_ROOT_PASSWORD: avatica + MYSQL_DATABASE: avatica + MYSQL_USER: user + MYSQL_PASSWORD: password http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/main/docker/postgresql/Dockerfile ---------------------------------------------------------------------- diff --git a/docker/src/main/docker/postgresql/Dockerfile b/docker/src/main/docker/postgresql/Dockerfile new file mode 100644 index 0000000..501f15d --- /dev/null +++ b/docker/src/main/docker/postgresql/Dockerfile @@ -0,0 +1,25 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you 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 avatica-server:latest +MAINTAINER Apache Avatica <[email protected]> + +ARG POSTGRESQL_VERSION="42.0.0" + +# Dependencies +ADD https://repo1.maven.org/maven2/org/postgresql/postgresql/${POSTGRESQL_VERSION}/postgresql-${POSTGRESQL_VERSION}.jar /home/avatica/classpath/ +RUN chown -R avatica: /home/avatica + +USER avatica http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/main/docker/postgresql/build.sh ---------------------------------------------------------------------- diff --git a/docker/src/main/docker/postgresql/build.sh b/docker/src/main/docker/postgresql/build.sh new file mode 100755 index 0000000..e98efed --- /dev/null +++ b/docker/src/main/docker/postgresql/build.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you 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. + +cd "$(dirname "$0")" + +docker build . -t avatica-postgresql-server http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/main/docker/postgresql/docker-compose.yml ---------------------------------------------------------------------- diff --git a/docker/src/main/docker/postgresql/docker-compose.yml b/docker/src/main/docker/postgresql/docker-compose.yml new file mode 100644 index 0000000..a4f1c8b --- /dev/null +++ b/docker/src/main/docker/postgresql/docker-compose.yml @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you 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. + +version: '2' +services: + avatica: + ports: + - "8765:8765" + links: + - postgresql + build: ./ + image: avatica-postgresql-server + # Default port for the docker image + command: "-u 'jdbc:postgresql://postgresql:5432/avatica'" + depends_on: + - postgresql + postgresql: + image: postgres:9.6 + environment: + POSTGRES_DB: avatica + POSTGRES_USER: user + POSTGRES_PASSWORD: password http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/main/dockerhub/Dockerfile ---------------------------------------------------------------------- diff --git a/docker/src/main/dockerhub/Dockerfile b/docker/src/main/dockerhub/Dockerfile new file mode 100644 index 0000000..4617a4e --- /dev/null +++ b/docker/src/main/dockerhub/Dockerfile @@ -0,0 +1,38 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you 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 openjdk:8-jre-alpine +MAINTAINER Apache Avatica <[email protected]> + +# Create an avatica user +RUN addgroup -S avatica && adduser -S -G avatica avatica +RUN mkdir -p /home/avatica/classpath + +# This line must be preserved. The Maven build will verify this version matches its version +ARG AVATICA_VERSION="1.10.0" + +# Dependencies +ADD https://repository.apache.org/content/groups/public/org/apache/calcite/avatica/avatica-standalone-server/${AVATICA_VERSION}/avatica-standalone-server-${AVATICA_VERSION}-shaded.jar /home/avatica/classpath + +# Make sure avatica owns its files +RUN chown -R avatica: /home/avatica + +# Expose the default port as a convenience +EXPOSE 8765 + +# TODO Would like to do this, but screws up downstream due to https://github.com/docker/docker/issues/6119 +# USER avatica + +ENTRYPOINT ["/usr/bin/java", "-cp", "/home/avatica/classpath/*", "org.apache.calcite.avatica.standalone.StandaloneServer", "-p", "8765"] http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/docker/src/test/scripts/verify-dockerhub-dockerfile-version.groovy ---------------------------------------------------------------------- diff --git a/docker/src/test/scripts/verify-dockerhub-dockerfile-version.groovy b/docker/src/test/scripts/verify-dockerhub-dockerfile-version.groovy new file mode 100644 index 0000000..2908be2 --- /dev/null +++ b/docker/src/test/scripts/verify-dockerhub-dockerfile-version.groovy @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +import java.io.File; +import java.nio.file.Files; + +System.out.println("Verifying the included version in the Dockerhub Dockerfile"); + +String expectedPrefix = "ARG AVATICA_VERSION="; +String expectedVersion = project.getVersion(); + +if (null == expectedVersion) { + throw new IllegalArgumentException("Did not find Maven project version"); +} + +String dockerfilePath = "src/main/dockerhub/Dockerfile"; +File dockerfile = new File(basedir, dockerfilePath); +if (!dockerfile.isFile()) { + throw new FileNotFoundException("Could not file dockerhub Dockerfile at " + dockerfilePath); +} + +List<String> lines = Files.readAllLines(dockerfile.toPath()); +for (String line : lines) { + line = line.trim(); + if (line.startsWith(expectedPrefix)) { + String value = line.substring(expectedPrefix.length()); + // Trim leading and trailing quotation marks + value = value.substring(1, value.length() - 1); + if (expectedVersion.equals(value)) { + System.out.println("Found expected version in DockerHub dockerfile of " + value); + return true; + } else { + throw new IllegalArgumentException("Expected Avatica version of " + expectedVersion + " but got " + value); + } + } +} + +throw new IllegalArgumentException("Could not extract Avatica version from " + dockerfile); http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 0104fb0..5286c5b 100644 --- a/pom.xml +++ b/pom.xml @@ -103,6 +103,7 @@ limitations under the License. <modules> <module>core</module> + <module>docker</module> <module>metrics</module> <module>metrics-dropwizardmetrics3</module> <module>noop-driver</module> @@ -152,6 +153,11 @@ limitations under the License. </dependency> <dependency> <groupId>org.apache.calcite.avatica</groupId> + <artifactId>avatica-standalone-server</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.calcite.avatica</groupId> <artifactId>avatica-core</artifactId> <version>${project.version}</version> <type>test-jar</type> @@ -520,6 +526,11 @@ limitations under the License. </dependencies> </plugin> <plugin> + <groupId>com.spotify</groupId> + <artifactId>docker-maven-plugin</artifactId> + <version>0.4.13</version> + </plugin> + <plugin> <groupId>de.thetaphi</groupId> <artifactId>forbiddenapis</artifactId> <version>${forbiddenapis.version}</version> @@ -591,6 +602,11 @@ limitations under the License. <version>${build-helper-maven-plugin.version}</version> </plugin> <plugin> + <groupId>org.codehaus.gmaven</groupId> + <artifactId>groovy-maven-plugin</artifactId> + <version>2.0</version> + </plugin> + <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>javacc-maven-plugin</artifactId> <version>${javacc-maven-plugin.version}</version> http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/site/_data/docs.yml ---------------------------------------------------------------------- diff --git a/site/_data/docs.yml b/site/_data/docs.yml index 276edad..7c0a0ff 100644 --- a/site/_data/docs.yml +++ b/site/_data/docs.yml @@ -29,6 +29,7 @@ - security - compatibility - custom_client_artifacts + - docker - title: Meta docs: http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/site/_docs/docker_images.md ---------------------------------------------------------------------- diff --git a/site/_docs/docker_images.md b/site/_docs/docker_images.md new file mode 100644 index 0000000..46976f7 --- /dev/null +++ b/site/_docs/docker_images.md @@ -0,0 +1,151 @@ +--- +layout: docs +title: Docker Images +sidebar_title: Docker Images +permalink: /docs/docker.html +--- + +<!-- +{% comment %} +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to you 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. +{% endcomment %} +--> + +## Docker Images for Avatica + +[Docker](https://en.wikipedia.org/wiki/Docker_(software)) is a popular piece of +software that enables other software to run "anywhere". In the context of Avatica, +we can use Docker to enable a run-anywhere Avatica server. These Docker containers +can be used to easily create a server for the development of custom Avatica clients +or encapsulating database access for testing software that uses Avatica. + +### Base "avatica-server" Docker Image + +Starting with the Avatica 1.10.0 release, Avatica is providing a number of Docker +containers. Each of these images is based on a "parent" "avatica-server" Docker image. + +This Docker image has no bindings to a specific database (it has not database-specific +JDBC driver included). It only contains a Java runtime and the Avatica Standalone Server +jar (which contains all the necessary dependencies of the Avatica server). This docker +image is not directly useful for end users; it is useful for those who want to use Avatica +with a database of their choosing. + +This Docker image will be deployed to the [Apache Dockerhub account](https://hub.docker.com/r/apache/) after the release +of 1.10.0 and will be updated for future releases of Avatica. + +### Database-specific Docker Images + +To make the lives of end-users who want to use a specific database easier, some Docker +images are provided for some common databases. The current databases include: + +* [HyperSQL](http://hsqldb.org) (2.3.1) +* [MySQL](https://www.mysql.com/) (Client 5.1.41, supports MySQL server 4.1, 5.0, 5.1, 5.5, 5.6, 5.7) +* [PostgreSQL](https://www.postgresql.org/) (Client 42.0.0, supports PostgreSQL servers >=8.3) + +These images are not deployed as the licensing on each database driver is varied. Please +understand and accept the license of each before using in any software project. + +Each of these images include a `build.sh` script which will build the docker image using +the latest `avatica-server` Docker image. The resulting Docker image will be named according +to the following format: `avatica-<database>-server`. For example, `avatica-hsqldb-server`, +`avatica-mysql-server`, and `avatica-postgresql-server`. + +Additionally, [Docker Compose](https://github.com/docker/compose) configuration files for the above +databases (sans HyperSQL) are provided which configure the database's standard Docker image +and then connect Avatica to that Docker container. For example, the PostgreSQL docker-compose configuration +file will start an instance of PostgreSQL and an instance of the Avatica server, each in their own container, +exposing an Avatica server configured against a "real" PostgreSQL database. + +All of the `Dockerfile` and `docker-compose.yml` files are conveniently provided in an archive for +each release, starting with 1.10.0. + +``` +avatica-docker-1.10.0-SNAPSHOT/ +avatica-docker-1.10.0-SNAPSHOT/hypersql/ +avatica-docker-1.10.0-SNAPSHOT/mysql/ +avatica-docker-1.10.0-SNAPSHOT/postgresql/ +avatica-docker-1.10.0-SNAPSHOT/Dockerfile +avatica-docker-1.10.0-SNAPSHOT/hypersql/build.sh +avatica-docker-1.10.0-SNAPSHOT/hypersql/Dockerfile +avatica-docker-1.10.0-SNAPSHOT/mysql/build.sh +avatica-docker-1.10.0-SNAPSHOT/mysql/docker-compose.yml +avatica-docker-1.10.0-SNAPSHOT/mysql/Dockerfile +avatica-docker-1.10.0-SNAPSHOT/postgresql/build.sh +avatica-docker-1.10.0-SNAPSHOT/postgresql/docker-compose.yml +avatica-docker-1.10.0-SNAPSHOT/postgresql/Dockerfile +``` + +#### Running + +Each of the provided database-specific Docker images set an `ENTRYPOINT` which +encapsulate most of the Java command. The following options are available to specify: + +``` +Usage: <main class> [options] + Options: + -h, -help, --help + Print the help message + Default: false + -p, --port + Port the server should bind + Default: 0 + -s, --serialization + Serialization method to use + Default: PROTOBUF + Possible Values: [JSON, PROTOBUF] + * -u, --url + JDBC driver url for the server +``` + +For example, to connect to a MySQL server, the following could be used: + +``` +$ ./avatica-docker-*/mysql/build.sh +$ docker run --rm -it avatica-mysql-server \ + -u jdbc:mysql://<fqdn>:3306/my_database +``` + +To debug these docker images, the `ENTRYPOINT` can be overriden to launch a shell + +``` +$ docker run --rm --entrypoint='' -it avatica-mysql-server /bin/sh +``` + +### Running Docker containers for custom databases + +The provided `avatica-server` Docker image is designed to be generally reusable +for developers that want to expose a database of their choosing. A custom Dockerfile +can be created by copying what the `avatica-mysql-server` or `avatica-postgresql-server` +do, but this is also achievable via the Docker volumes. + +For example, consider we have a JAR with a JDBC driver for our database on our local +machine `/home/user/my-database-jars/my-database-jdbc-1.0.jar`. We can run the following command to +launch a custom Avatica server against our database with this JDBC driver. + +``` +$ docker run --rm -p 8765:8765 \ + -v /home/user/my-database-jars/:/my-database-jars --entrypoint="" -it avatica-server \ + /usr/bin/java -cp "/home/avatica/classpath/*:/my-database-jars/*" \ + org.apache.calcite.avatica.standalone.StandaloneServer -p 8765 \ + -u "jdbc:my_jdbc_url" +``` + +This command does the following: + +* Exposes the internal port 8765 on the local machine as 8765 +* Maps the local directory "home/user/my-database-jars" to the Docker container at "/my-database-jars" using the Docker volumes feature +* Adds that mapped directory to the Java classpath +* Sets the correct JDBC URL for the database http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/standalone-server/pom.xml ---------------------------------------------------------------------- diff --git a/standalone-server/pom.xml b/standalone-server/pom.xml index e8c7f43..9f14964 100644 --- a/standalone-server/pom.xml +++ b/standalone-server/pom.xml @@ -23,8 +23,8 @@ limitations under the License. <version>1.10.0-SNAPSHOT</version> </parent> <artifactId>avatica-standalone-server</artifactId> - <name>Avatica Standalone Server</name> - <description>A Stadnalone Avatica Server Implementation</description> + <name>Apache Calcite Avatica Standalone Server</name> + <description>A Standalone Avatica Server Implementation</description> <properties> <top.dir>${project.basedir}/..</top.dir> http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/c43aec54/standalone-server/src/main/java/org/apache/calcite/avatica/standalone/StandaloneServer.java ---------------------------------------------------------------------- diff --git a/standalone-server/src/main/java/org/apache/calcite/avatica/standalone/StandaloneServer.java b/standalone-server/src/main/java/org/apache/calcite/avatica/standalone/StandaloneServer.java index f658f5e..0481f19 100644 --- a/standalone-server/src/main/java/org/apache/calcite/avatica/standalone/StandaloneServer.java +++ b/standalone-server/src/main/java/org/apache/calcite/avatica/standalone/StandaloneServer.java @@ -49,6 +49,10 @@ public class StandaloneServer { description = "Serialization method to use", converter = SerializationConverter.class) private Serialization serialization = Serialization.PROTOBUF; + @Parameter(names = { "-h", "-help", "--help" }, required = false, help = true, + description = "Print the help message") + private boolean help = false; + private HttpServer server; public void start() { @@ -92,7 +96,12 @@ public class StandaloneServer { public static void main(String[] args) { final StandaloneServer server = new StandaloneServer(); - new JCommander(server, args); + JCommander jc = new JCommander(server, args); + if (server.help) { + jc.usage(); + Unsafe.systemExit(ExitCodes.USAGE.ordinal()); + return; + } server.start(); @@ -131,7 +140,8 @@ public class StandaloneServer { private enum ExitCodes { NORMAL, ALREADY_STARTED, // 1 - START_FAILED; // 2 + START_FAILED, // 2 + USAGE; // 3 } }
