├── COPYRIGHT ├── src ├── test │ ├── resources │ │ ├── confs │ │ │ ├── ReadConf.conf │ │ │ ├── ConfsReplaced.conf │ │ │ ├── before50 │ │ │ │ ├── ReadConf.conf │ │ │ │ ├── ConfsReplaced.conf │ │ │ │ ├── EnvVarsOverride.conf │ │ │ │ ├── ConfsNotOverridden.conf │ │ │ │ ├── ExtendedConf.conf │ │ │ │ ├── EnterpriseOnlyNotOverwritten.conf │ │ │ │ ├── NoNewline.conf │ │ │ │ ├── JvmAdditionalNotOverridden.conf │ │ │ │ └── InvalidExtendedConf.conf │ │ │ ├── ConfsNotOverridden.conf │ │ │ ├── EnvVarsOverride.conf │ │ │ ├── ExtendedConf.conf │ │ │ ├── EnterpriseOnlyNotOverwritten.conf │ │ │ ├── NoNewline.conf │ │ │ ├── JvmAdditionalNotOverridden.conf │ │ │ └── InvalidExtendedConf.conf │ │ ├── stubplugin │ │ │ └── myPlugin.jar │ │ ├── dockersecrets │ │ │ ├── simple-container-compose.yml │ │ │ ├── simple-container-compose-with-external-file-var.yml │ │ │ ├── container-compose-with-secrets.yml │ │ │ ├── container-compose-with-incorrect-secrets.yml │ │ │ └── container-compose-with-secrets-override.yml │ │ ├── ha-cluster-compose.yml │ │ └── causal-cluster-compose.yml │ └── java │ │ └── com │ │ └── neo4j │ │ └── docker │ │ ├── utils │ │ ├── Network.java │ │ ├── HostFileHttpHandler.java │ │ ├── SetContainerUser.java │ │ ├── HttpServerTestExtension.java │ │ ├── WaitStrategies.java │ │ ├── TestSettings.java │ │ └── Neo4jVersion.java │ │ ├── coredb │ │ ├── plugins │ │ │ └── Neo4jPluginEnv.java │ │ ├── configurations │ │ │ ├── Setting.java │ │ │ └── Configuration.java │ │ └── TestCausalCluster.java │ │ └── neo4jadmin │ │ ├── TestReport.java │ │ ├── TestAdminBasic.java │ │ └── TestDumpLoad.java └── main │ └── resources │ └── log4j.properties ├── devenv.local.template ├── .gitignore ├── generate-stub-plugin ├── settings.gradle.kts ├── Dockerfile ├── build.gradle.kts ├── Makefile ├── README.md └── ExampleNeo4jPlugin.java ├── docker-image-src ├── 5 │ ├── neo4j-admin │ │ ├── Dockerfile-ubi8 │ │ ├── Dockerfile-ubi9 │ │ ├── Dockerfile-bullseye │ │ └── docker-entrypoint.sh │ └── coredb │ │ ├── neo4j-admin-report.sh │ │ ├── neo4j-plugins.json │ │ ├── Dockerfile-bullseye │ │ ├── Dockerfile-ubi8 │ │ └── Dockerfile-ubi9 ├── 3.0 │ ├── Dockerfile │ └── docker-entrypoint.sh ├── 2.3 │ ├── Dockerfile │ └── docker-entrypoint.sh ├── common │ ├── semver.jq │ └── utilities.sh ├── 3.1 │ └── Dockerfile ├── 3.2 │ └── Dockerfile ├── 4.0 │ ├── neo4j-admin │ │ ├── Dockerfile │ │ └── docker-entrypoint.sh │ └── coredb │ │ └── Dockerfile ├── 4.1 │ ├── neo4j-admin │ │ ├── Dockerfile │ │ └── docker-entrypoint.sh │ └── coredb │ │ └── Dockerfile ├── 4.4 │ ├── neo4j-admin │ │ ├── Dockerfile-ubi9 │ │ ├── Dockerfile-bullseye │ │ └── docker-entrypoint.sh │ └── coredb │ │ ├── neo4j-admin-report.sh │ │ ├── Dockerfile-bullseye │ │ ├── neo4j-plugins.json │ │ └── Dockerfile-ubi9 ├── calver │ ├── neo4j-admin │ │ ├── Dockerfile-ubi9 │ │ ├── Dockerfile-bullseye │ │ └── docker-entrypoint.sh │ └── coredb │ │ ├── neo4j-plugins.json │ │ ├── neo4j-admin-report.sh │ │ ├── Dockerfile-bullseye │ │ └── Dockerfile-ubi9 ├── 3.5 │ ├── neo4j-admin │ │ ├── Dockerfile │ │ └── docker-entrypoint.sh │ └── coredb │ │ ├── Dockerfile │ │ └── neo4j-plugins.json ├── 4.2 │ ├── neo4j-admin │ │ ├── Dockerfile │ │ └── docker-entrypoint.sh │ └── coredb │ │ ├── Dockerfile │ │ └── neo4j-plugins.json ├── 4.3 │ ├── neo4j-admin │ │ ├── Dockerfile │ │ └── docker-entrypoint.sh │ └── coredb │ │ ├── Dockerfile │ │ └── neo4j-plugins.json ├── 3.3 │ └── Dockerfile └── 3.4 │ └── Dockerfile ├── .github └── ISSUE_TEMPLATE │ └── bug_report.md ├── README.md ├── devenv ├── publish-neo4j-admin-images.sh ├── publish-neo4j-admin-image.sh ├── pom.xml └── Makefile /COPYRIGHT: -------------------------------------------------------------------------------- 1 | Copyright 2015 Neo Technology, Inc. 2 | -------------------------------------------------------------------------------- /src/test/resources/confs/ReadConf.conf: -------------------------------------------------------------------------------- 1 | server.memory.heap.max_size=512m -------------------------------------------------------------------------------- /src/test/resources/confs/ConfsReplaced.conf: -------------------------------------------------------------------------------- 1 | #server.memory.pagecache.size=1g -------------------------------------------------------------------------------- /src/test/resources/confs/before50/ReadConf.conf: -------------------------------------------------------------------------------- 1 | dbms.memory.heap.max_size=512m -------------------------------------------------------------------------------- /src/test/resources/confs/ConfsNotOverridden.conf: -------------------------------------------------------------------------------- 1 | server.memory.pagecache.size=1024M -------------------------------------------------------------------------------- /src/test/resources/confs/EnvVarsOverride.conf: -------------------------------------------------------------------------------- 1 | server.memory.pagecache.size=1000m -------------------------------------------------------------------------------- /src/test/resources/confs/before50/ConfsReplaced.conf: -------------------------------------------------------------------------------- 1 | #dbms.memory.pagecache.size=1g -------------------------------------------------------------------------------- /src/test/resources/confs/before50/EnvVarsOverride.conf: -------------------------------------------------------------------------------- 1 | dbms.memory.pagecache.size=1000m -------------------------------------------------------------------------------- /src/test/resources/confs/ExtendedConf.conf: -------------------------------------------------------------------------------- 1 | server.logs.gc.rotation.keep_number=$(expr 2 * 10) -------------------------------------------------------------------------------- /src/test/resources/confs/before50/ConfsNotOverridden.conf: -------------------------------------------------------------------------------- 1 | dbms.memory.pagecache.size=1024M -------------------------------------------------------------------------------- /src/test/resources/confs/before50/ExtendedConf.conf: -------------------------------------------------------------------------------- 1 | dbms.logs.gc.rotation.keep_number=$(expr 2 * 10) -------------------------------------------------------------------------------- /devenv.local.template: -------------------------------------------------------------------------------- 1 | # -*- mode: shell-script -*- 2 | 3 | NEO4JVERSION= -------------------------------------------------------------------------------- /src/test/resources/confs/EnterpriseOnlyNotOverwritten.conf: -------------------------------------------------------------------------------- 1 | server.cluster.advertised_address=localhost:6060 2 | -------------------------------------------------------------------------------- /src/test/resources/confs/NoNewline.conf: -------------------------------------------------------------------------------- 1 | # a configuration file without a trailing newline 2 | server.memory.pagecache.size=1000.00MiB -------------------------------------------------------------------------------- /src/test/resources/confs/before50/EnterpriseOnlyNotOverwritten.conf: -------------------------------------------------------------------------------- 1 | causal_clustering.transaction_advertised_address=localhost:6060 -------------------------------------------------------------------------------- /src/test/resources/stubplugin/myPlugin.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neo4j/docker-neo4j/HEAD/src/test/resources/stubplugin/myPlugin.jar -------------------------------------------------------------------------------- /src/test/resources/confs/before50/NoNewline.conf: -------------------------------------------------------------------------------- 1 | # a configuration file without a trailing newline 2 | dbms.memory.pagecache.size=1000.00MiB -------------------------------------------------------------------------------- /src/test/resources/confs/JvmAdditionalNotOverridden.conf: -------------------------------------------------------------------------------- 1 | server.jvm.additional=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -------------------------------------------------------------------------------- /src/test/resources/confs/before50/JvmAdditionalNotOverridden.conf: -------------------------------------------------------------------------------- 1 | dbms.jvm.additional=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -------------------------------------------------------------------------------- /src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=INFO, console 2 | log4j.appender.console=org.apache.log4j.ConsoleAppender 3 | log4j.appender.console.layout=org.apache.log4j.PatternLayout -------------------------------------------------------------------------------- /src/test/resources/confs/InvalidExtendedConf.conf: -------------------------------------------------------------------------------- 1 | server.logs.gc.rotation.keep_number=$(bash -c '>&2 echo "this is an error message from inside neo4j config command expansion" && exit 1') 2 | -------------------------------------------------------------------------------- /src/test/resources/confs/before50/InvalidExtendedConf.conf: -------------------------------------------------------------------------------- 1 | dbms.logs.gc.rotation.keep_number=$(bash -c '>&2 echo "this is an error message from inside neo4j config command expansion" && exit 1') 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .java-version 3 | *.iml 4 | /tmp/ 5 | /out/ 6 | /in/ 7 | /devenv.local 8 | /local-mounts/ 9 | /target/ 10 | /build/ 11 | .DS_Store 12 | # simlinks to dev scripts in https://github.com/neo-technology/teamcity-witchcraft 13 | download_tool.py 14 | docker_tests_get_installers.py 15 | __pycache__/ 16 | -------------------------------------------------------------------------------- /src/test/resources/dockersecrets/simple-container-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | simplecontainer: 3 | image: ${NEO4J_IMAGE} 4 | environment: 5 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 6 | - NEO4J_AUTH=neo4j/simplecontainerpassword 7 | - NEO4J_DEBUG=true 8 | volumes: 9 | - ${HOST_ROOT}/neo4j/data:/data 10 | - ${HOST_ROOT}/neo4j/logs:/logs -------------------------------------------------------------------------------- /generate-stub-plugin/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/7.6/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = "myPlugin" 11 | -------------------------------------------------------------------------------- /src/test/resources/dockersecrets/simple-container-compose-with-external-file-var.yml: -------------------------------------------------------------------------------- 1 | services: 2 | simplecontainer: 3 | image: ${NEO4J_IMAGE} 4 | environment: 5 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 6 | - NEO4J_AUTH=neo4j/simplecontainerpassword 7 | - NEO4J_DEBUG=true 8 | - CERTIFICATE_FILE="CERTIFICATE CONTENTS" 9 | volumes: 10 | - ${HOST_ROOT}/neo4j/data:/data 11 | - ${HOST_ROOT}/neo4j/logs:/logs -------------------------------------------------------------------------------- /src/test/resources/dockersecrets/container-compose-with-secrets.yml: -------------------------------------------------------------------------------- 1 | services: 2 | secretscontainer: 3 | image: ${NEO4J_IMAGE} 4 | environment: 5 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 6 | - NEO4J_AUTH_FILE=/run/secrets/neo4j_auth_file 7 | - NEO4J_DEBUG=true 8 | volumes: 9 | - ${HOST_ROOT}/neo4j/data:/data 10 | - ${HOST_ROOT}/neo4j/logs:/logs 11 | secrets: 12 | - neo4j_auth_file 13 | secrets: 14 | neo4j_auth_file: 15 | file: ./neo4j_auth.txt -------------------------------------------------------------------------------- /generate-stub-plugin/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM gradle:7-jdk11 2 | WORKDIR /testplugin 3 | COPY ./*.kts ./ExampleNeo4jPlugin.java /testplugin/ 4 | RUN mkdir -p /testplugin/src/main/java/testplugins/ && \ 5 | mkdir -p /testplugin/build && \ 6 | ln -s -T /output /testplugin/build/libs && \ 7 | mv /testplugin/ExampleNeo4jPlugin.java /testplugin/src/main/java/testplugins/ && \ 8 | chmod a+rw -R /testplugin 9 | ENV NEO4JVERSION=4.4.38 10 | 11 | VOLUME /output 12 | CMD gradle jar -Pversion=$NEO4JVERSION 13 | -------------------------------------------------------------------------------- /src/test/resources/dockersecrets/container-compose-with-incorrect-secrets.yml: -------------------------------------------------------------------------------- 1 | services: 2 | secretscontainer: 3 | image: ${NEO4J_IMAGE} 4 | environment: 5 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 6 | - NEO4J_AUTH_FILE="File contents instead of a file path" 7 | - NEO4J_DEBUG=true 8 | volumes: 9 | - ${HOST_ROOT}/neo4j/data:/data 10 | - ${HOST_ROOT}/neo4j/logs:/logs 11 | secrets: 12 | - neo4j_auth_file 13 | secrets: 14 | neo4j_auth_file: 15 | file: ./neo4j_auth.txt -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/utils/Network.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.utils; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | 6 | import static java.lang.String.format; 7 | 8 | public class Network 9 | { 10 | public static int getUniqueHostPort() throws IOException 11 | { 12 | try ( ServerSocket socket = new ServerSocket( 0 ) ) 13 | { 14 | socket.setReuseAddress( true ); 15 | socket.close(); 16 | return socket.getLocalPort(); 17 | } 18 | catch ( IOException e ) 19 | { 20 | throw new IOException( format( "Could not get a unique port : ", e.getMessage() ) ); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/test/resources/dockersecrets/container-compose-with-secrets-override.yml: -------------------------------------------------------------------------------- 1 | services: 2 | secretsoverridecontainer: 3 | image: ${NEO4J_IMAGE} 4 | environment: 5 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 6 | - NEO4J_dbms_memory_pagecache_size_FILE=/run/secrets/neo4j_dbms_memory_pagecache_size_file 7 | - NEO4J_dbms_memory_pagecache_size=10M 8 | - NEO4J_DEBUG=true 9 | - NEO4J_AUTH=neo4j/secretsoverridecontainerpassword 10 | volumes: 11 | - ${HOST_ROOT}/neo4j/data:/data 12 | - ${HOST_ROOT}/neo4j/logs:/logs 13 | secrets: 14 | - neo4j_dbms_memory_pagecache_size_file 15 | secrets: 16 | neo4j_dbms_memory_pagecache_size_file: 17 | file: ./neo4j_pagecache.txt -------------------------------------------------------------------------------- /generate-stub-plugin/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * This generated file contains a sample Java library project to get you started. 5 | * For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle 6 | * User Manual available at https://docs.gradle.org/7.6/userguide/building_java_projects.html 7 | */ 8 | 9 | //version = "4.3.0" 10 | 11 | plugins { 12 | // Apply the java-library plugin for API and implementation separation. 13 | `java-library` 14 | } 15 | 16 | repositories { 17 | // Use Maven Central for resolving dependencies. 18 | mavenCentral() 19 | } 20 | 21 | dependencies { 22 | api("org.neo4j:neo4j:$version") 23 | } 24 | -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/coredb/plugins/Neo4jPluginEnv.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.coredb.plugins; 2 | 3 | import com.neo4j.docker.utils.Neo4jVersion; 4 | import com.neo4j.docker.utils.TestSettings; 5 | 6 | public class Neo4jPluginEnv 7 | { 8 | public static final String PLUGIN_ENV_4X = "NEO4JLABS_PLUGINS"; 9 | public static final String PLUGIN_ENV_5X = "NEO4J_PLUGINS"; 10 | 11 | public static String get( ) 12 | { 13 | return get(TestSettings.NEO4J_VERSION); 14 | } 15 | 16 | public static String get( Neo4jVersion version ) 17 | { 18 | if( version.isAtLeastVersion( Neo4jVersion.NEO4J_VERSION_500 ) ) 19 | { 20 | return PLUGIN_ENV_5X; 21 | } 22 | else return PLUGIN_ENV_4X; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/coredb/configurations/Setting.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.coredb.configurations; 2 | 3 | public enum Setting 4 | { 5 | APOC_EXPORT_FILE_ENABLED, 6 | BACKUP_ENABLED, 7 | BACKUP_LISTEN_ADDRESS, 8 | BROWSER_ALLOW_OUTGOING_CONNECTIONS, 9 | CLUSTER_DISCOVERY_ADDRESS, 10 | CLUSTER_RAFT_ADDRESS, 11 | CLUSTER_ROUTING_ADDRESS, 12 | CLUSTER_TRANSACTION_ADDRESS, 13 | DEFAULT_LISTEN_ADDRESS, 14 | DIRECTORIES_DATA, 15 | DIRECTORIES_LOGS, 16 | DIRECTORIES_METRICS, 17 | JVM_ADDITIONAL, 18 | LOGS_GC_ROTATION_KEEPNUMBER, 19 | MEMORY_HEAP_INITIALSIZE, 20 | MEMORY_HEAP_MAXSIZE, 21 | MEMORY_PAGECACHE_SIZE, 22 | MINIMUM_PASSWORD_LENGTH, 23 | SECURITY_PROCEDURES_UNRESTRICTED, 24 | TXLOG_RETENTION_POLICY 25 | } 26 | -------------------------------------------------------------------------------- /docker-image-src/3.0/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:8-jre 2 | 3 | ENV NEO4J_SHA256=%%NEO4J_SHA%% \ 4 | NEO4J_TARBALL=%%NEO4J_TARBALL%% 5 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 6 | 7 | COPY ./local-package/* /tmp/ 8 | 9 | RUN curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 10 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum --check --quiet - \ 11 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 12 | && mv /var/lib/neo4j-* /var/lib/neo4j \ 13 | && rm ${NEO4J_TARBALL} 14 | 15 | ENV PATH /var/lib/neo4j/bin:$PATH 16 | 17 | WORKDIR /var/lib/neo4j 18 | 19 | RUN mv data /data \ 20 | && ln --symbolic /data 21 | 22 | VOLUME /data 23 | 24 | COPY docker-entrypoint.sh /docker-entrypoint.sh 25 | 26 | EXPOSE 7474 7473 7687 27 | 28 | ENTRYPOINT ["/docker-entrypoint.sh"] 29 | CMD ["neo4j"] 30 | -------------------------------------------------------------------------------- /docker-image-src/2.3/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:8-jre 2 | 3 | RUN apt-get update --quiet --quiet \ 4 | && apt-get install --quiet --quiet --no-install-recommends lsof \ 5 | && rm -rf /var/lib/apt/lists/* 6 | 7 | ENV NEO4J_SHA256=%%NEO4J_SHA%% \ 8 | NEO4J_TARBALL=%%NEO4J_TARBALL%% 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | COPY ./local-package/* /tmp/ 12 | 13 | RUN curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 14 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum --check --quiet - \ 15 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 16 | && mv /var/lib/neo4j-* /var/lib/neo4j \ 17 | && rm ${NEO4J_TARBALL} 18 | 19 | ENV PATH /var/lib/neo4j/bin:$PATH 20 | 21 | WORKDIR /var/lib/neo4j 22 | 23 | RUN mv data /data \ 24 | && ln --symbolic /data 25 | 26 | VOLUME /data 27 | 28 | COPY docker-entrypoint.sh /docker-entrypoint.sh 29 | 30 | EXPOSE 7474 7473 31 | 32 | ENTRYPOINT ["/docker-entrypoint.sh"] 33 | CMD ["neo4j"] 34 | -------------------------------------------------------------------------------- /generate-stub-plugin/Makefile: -------------------------------------------------------------------------------- 1 | SHELL := bash 2 | .ONESHELL: 3 | .SHELLFLAGS := -eu -o pipefail -c 4 | .DELETE_ON_ERROR: 5 | .SECONDEXPANSION: 6 | .SECONDARY: 7 | 8 | ifeq ($(origin .RECIPEPREFIX), undefined) 9 | $(error This Make does not support .RECIPEPREFIX. Please use GNU Make 4.0 or later) 10 | endif 11 | .RECIPEPREFIX = > 12 | 13 | ifndef NEO4JVERSION 14 | $(error NEO4JVERSION is not set) 15 | endif 16 | 17 | clean: ./Dockerfile 18 | > rm $( workdir=$(realpath $( docker build $${workdir} -t stubplugin:latest 24 | > docker run -it --rm \ 25 | -e NEO4JVERSION \ 26 | -v $${workdir}/../src/test/resources/stubplugin:/output \ 27 | --user="$$(id -u):$$(id -g)" \ 28 | stubplugin:latest 29 | > mv $${workdir}/../src/test/resources/stubplugin/myPlugin-$${NEO4JVERSION}.jar $${workdir}/../src/test/resources/stubplugin/myPlugin.jar 30 | .PHONY: plugin 31 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: jennyowen 7 | 8 | --- 9 | 10 | ## Guidelines 11 | 12 | Please note that GitHub issues are only meant for bug reports/feature requests. 13 | If you have questions on how to use Neo4j, please ask on [Neo4j Community](https://community.neo4j.com/) or [StackOverflow](http://stackoverflow.com/questions/tagged/neo4j) instead of creating an issue here. 14 | 15 | To help us understand your issue, please specify important details, primarily: 16 | 17 | - **Steps to reproduce**. *Not including reproduction steps will mean your bug will take considerably longer to investigate and fix. Please don't skip this*. 18 | - Expected behaviour 19 | - Actual behaviour 20 | - Neo4j image tag being used, eg `neo4j:latest`, `neo4j:enterprise-3.5` etc 21 | - The output of the `docker version` command 22 | - Operating system: (for example Windows 95/Ubuntu 16.04) 23 | 24 | Additionally, include (as appropriate) error messages, log-files, stacktraces, and other debug output. 25 | -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/utils/HostFileHttpHandler.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.utils; 2 | 3 | import com.sun.net.httpserver.HttpExchange; 4 | import com.sun.net.httpserver.HttpHandler; 5 | 6 | import java.io.File; 7 | import java.io.IOException; 8 | import java.net.HttpURLConnection; 9 | import java.nio.file.Files; 10 | 11 | /** 12 | * HttpHandler that responds to all http requests with the given file from the file system 13 | */ 14 | public class HostFileHttpHandler implements HttpHandler 15 | { 16 | private final File file; 17 | private final String contentType; 18 | 19 | public HostFileHttpHandler( File fileToDownload, String contentType ) 20 | { 21 | this.file = fileToDownload; 22 | this.contentType = contentType; 23 | } 24 | 25 | @Override 26 | public void handle( HttpExchange exchange ) throws IOException 27 | { 28 | exchange.getResponseHeaders().add( "Content-Type", contentType ); 29 | exchange.sendResponseHeaders( HttpURLConnection.HTTP_OK, file.length() ); 30 | Files.copy( this.file.toPath(), exchange.getResponseBody() ); 31 | exchange.close(); 32 | } 33 | } -------------------------------------------------------------------------------- /generate-stub-plugin/README.md: -------------------------------------------------------------------------------- 1 | # What is this? 2 | 3 | This code is purely for generating the [myPlugin.jar test artifact](../src/test/resources/testplugin/myPlugin.jar). 4 | It is a test artifact used for verifying that the `NEO4J_PLUGINS` feature works correctly. *It has nothing to do with Neo4j database or even the Neo4j docker image source code.* 5 | 6 | # Do I need to run this code at all? 7 | 8 | Short answer: **No.** 9 | 10 | A pre-generated `myPlugin.jar` is already included in the test resources. 11 | 12 | The only situation where you would need to even look at this is if you are actively developing the Neo4j docker image and for some reason the plugin tests are not loading `myPlugin.jar` any more. 13 | 14 | 15 | ## How to generate new test plugin 16 | 17 | The Makefile will do all the work for you, all you need to do is pick which version of Neo4j to use: 18 | 19 | ```shell 20 | NEO4JVERSION=4.4.11 make clean plugin 21 | ``` 22 | 23 | The Dockerfile is currently set to use java 11. If that needs to change then just change the base image that the Dockerfile uses. 24 | 25 | Don't forget to commit the newly generated `myPlugin.jar` back to git when you've finished. 26 | -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/utils/SetContainerUser.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.utils; 2 | 3 | import com.github.dockerjava.api.command.CreateContainerCmd; 4 | import com.sun.security.auth.module.UnixSystem; 5 | import org.testcontainers.containers.GenericContainer; 6 | import java.util.function.Consumer; 7 | 8 | public class SetContainerUser 9 | { 10 | 11 | public static void nonRootUser( GenericContainer container ) 12 | { 13 | container.withCreateContainerCmdModifier( (Consumer) cmd -> cmd.withUser( getNonRootUserString() ) ); 14 | } 15 | 16 | public static String getNonRootUserString() 17 | { 18 | // check if the non root user environment variable is set, if so use that. Otherwise use current user. 19 | String user = System.getenv( "NON_ROOT_USER_ID" ); 20 | if(user == null) 21 | { 22 | return getCurrentlyRunningUser(); 23 | } 24 | else 25 | { 26 | return user; 27 | } 28 | } 29 | 30 | private static String getCurrentlyRunningUser() 31 | { 32 | UnixSystem fs = new UnixSystem(); 33 | return fs.getUid() + ":" + fs.getGid(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /docker-image-src/common/semver.jq: -------------------------------------------------------------------------------- 1 | def _semver_obj2obj($req): 2 | if . == $req then true 3 | elif .major != $req.major and .major != "x" and .major != "*" then false 4 | elif .minor != $req.minor and .minor != "x" and .minor != "*" then false 5 | elif .patch != $req.patch and .patch != "x" and .patch != "*" then false 6 | elif $req.minor == null and ( .minor == "x" or .minor == "*" ) then false 7 | elif $req.patch == null and ( .patch == "x" or .patch == "*" ) then false 8 | elif $req.major == null and $req.minor == null and $req.patch == null then false 9 | else true end; 10 | 11 | def _ver2obj: 12 | if type == "object" then . 13 | elif type == "string" and test("(?[0-9x*]+)(\\.(?[0-9x*]+))?(\\.?(?[0-9x*]+))?") then capture("(?[0-9x*]+)(\\.(?[0-9x*]+))?(\\.?(?[0-9x*]+))?") 14 | elif type == "string" and . == "" then {major: null, minor:null, patch:null} 15 | elif type == "number" then {minor:floor,patch:(.-floor)} 16 | else {major: .} end; 17 | 18 | # Returns true if input version spec semantically matches the requested version 19 | def semver($req): 20 | if $req == null or $req == "" then false 21 | elif . == $req then true 22 | else _ver2obj|_semver_obj2obj($req|_ver2obj) end; 23 | -------------------------------------------------------------------------------- /docker-image-src/3.1/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM adoptopenjdk/openjdk8:alpine-jre 2 | 3 | RUN addgroup -S neo4j && adduser -S -H -h /var/lib/neo4j -G neo4j neo4j 4 | 5 | ENV NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_HOME="/var/lib/neo4j" 8 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 9 | 10 | COPY ./local-package/* /tmp/ 11 | 12 | RUN apk add --no-cache --quiet \ 13 | bash \ 14 | curl \ 15 | tini \ 16 | su-exec \ 17 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 18 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -csw - \ 19 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 20 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 21 | && rm ${NEO4J_TARBALL} \ 22 | && mv "${NEO4J_HOME}"/data /data \ 23 | && chown -R neo4j:neo4j /data \ 24 | && chmod -R 777 /data \ 25 | && mv "${NEO4J_HOME}"/logs /logs \ 26 | && chown -R neo4j:neo4j /logs \ 27 | && chmod -R 777 /logs \ 28 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 29 | && chmod -R 777 "${NEO4J_HOME}" \ 30 | && ln -s /data "${NEO4J_HOME}"/data \ 31 | && ln -s /logs "${NEO4J_HOME}"/logs \ 32 | && apk del curl 33 | 34 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 35 | 36 | WORKDIR "${NEO4J_HOME}" 37 | 38 | VOLUME /data /logs 39 | 40 | COPY docker-entrypoint.sh /docker-entrypoint.sh 41 | 42 | EXPOSE 7474 7473 7687 43 | 44 | ENTRYPOINT ["/sbin/tini", "-g", "--", "/docker-entrypoint.sh"] 45 | CMD ["neo4j"] 46 | -------------------------------------------------------------------------------- /docker-image-src/3.2/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM adoptopenjdk/openjdk8:alpine-jre 2 | 3 | RUN addgroup -S neo4j && adduser -S -H -h /var/lib/neo4j -G neo4j neo4j 4 | 5 | ENV NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_HOME="/var/lib/neo4j" 8 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 9 | 10 | COPY ./local-package/* /tmp/ 11 | 12 | RUN apk add --no-cache --quiet \ 13 | bash \ 14 | curl \ 15 | tini \ 16 | su-exec \ 17 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 18 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -csw - \ 19 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 20 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 21 | && rm ${NEO4J_TARBALL} \ 22 | && mv "${NEO4J_HOME}"/data /data \ 23 | && chown -R neo4j:neo4j /data \ 24 | && chmod -R 777 /data \ 25 | && mv "${NEO4J_HOME}"/logs /logs \ 26 | && chown -R neo4j:neo4j /logs \ 27 | && chmod -R 777 /logs \ 28 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 29 | && chmod -R 777 "${NEO4J_HOME}" \ 30 | && ln -s /data "${NEO4J_HOME}"/data \ 31 | && ln -s /logs "${NEO4J_HOME}"/logs \ 32 | && apk del curl 33 | 34 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 35 | 36 | WORKDIR "${NEO4J_HOME}" 37 | 38 | VOLUME /data /logs 39 | 40 | COPY docker-entrypoint.sh /docker-entrypoint.sh 41 | 42 | EXPOSE 7474 7473 7687 43 | 44 | ENTRYPOINT ["/sbin/tini", "-g", "--", "/docker-entrypoint.sh"] 45 | CMD ["neo4j"] 46 | -------------------------------------------------------------------------------- /docker-image-src/common/utilities.sh: -------------------------------------------------------------------------------- 1 | 2 | function running_as_root 3 | { 4 | test "$(id -u)" = "0" 5 | } 6 | 7 | function secure_mode_enabled 8 | { 9 | test "${SECURE_FILE_PERMISSIONS:=no}" = "yes" 10 | } 11 | 12 | function debugging_enabled 13 | { 14 | test "${NEO4J_DEBUG+yes}" = "yes" 15 | } 16 | 17 | function debug_msg 18 | { 19 | if debugging_enabled; then 20 | echo "$@" 21 | fi 22 | } 23 | 24 | function containsElement 25 | { 26 | local e match="$1" 27 | shift 28 | for e; do [[ "$e" == "$match" ]] && return 0; done 29 | return 1 30 | } 31 | 32 | function is_writable 33 | { 34 | ${exec_cmd} test -w "${1}" 35 | } 36 | 37 | function print_permissions_advice_and_fail 38 | { 39 | local _directory=${1} 40 | local _userid=${2} 41 | local _groupid=${3} 42 | echo >&2 " 43 | Folder ${_directory} is not accessible for user: ${_userid} or group ${_groupid}. This is commonly a file permissions issue on the mounted folder. 44 | 45 | Hints to solve the issue: 46 | 1) Make sure the folder exists before mounting it. Docker will create the folder using root permissions before starting the Neo4j container. The root permissions disallow Neo4j from writing to the mounted folder. 47 | 2) Pass the folder owner's user ID and group ID to docker run, so that docker runs as that user. 48 | If the folder is owned by the current user, this can be done by adding this flag to your docker run command: 49 | --user=\$(id -u):\$(id -g) 50 | " 51 | exit 1 52 | } 53 | 54 | 55 | -------------------------------------------------------------------------------- /docker-image-src/4.0/neo4j-admin/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM %%NEO4J_BASE_IMAGE%% 2 | 3 | ENV NEO4J_SHA256=%%NEO4J_SHA%% \ 4 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 5 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 6 | NEO4J_HOME="/var/lib/neo4j" 7 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 8 | 9 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 10 | 11 | COPY ./local-package/* /tmp/ 12 | 13 | RUN apt update \ 14 | && apt install -y curl gosu procps \ 15 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 16 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 17 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 18 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 19 | && rm ${NEO4J_TARBALL} \ 20 | && mv "${NEO4J_HOME}"/data /data \ 21 | && chown -R neo4j:neo4j /data \ 22 | && chmod -R 777 /data \ 23 | && mkdir -p /backups \ 24 | && chown -R neo4j:neo4j /backups \ 25 | && chmod -R 777 /backups \ 26 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 27 | && chmod -R 777 "${NEO4J_HOME}" \ 28 | && ln -s /data "${NEO4J_HOME}"/data \ 29 | && rm -rf /tmp/* \ 30 | && rm -rf /var/lib/apt/lists/* \ 31 | && apt-get -y purge --auto-remove curl 32 | 33 | 34 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 35 | VOLUME /data /backups 36 | WORKDIR "${NEO4J_HOME}" 37 | 38 | COPY docker-entrypoint.sh /docker-entrypoint.sh 39 | 40 | ENTRYPOINT ["/docker-entrypoint.sh"] 41 | 42 | CMD ["neo4j-admin"] 43 | -------------------------------------------------------------------------------- /docker-image-src/4.1/neo4j-admin/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM %%NEO4J_BASE_IMAGE%% 2 | 3 | ENV NEO4J_SHA256=%%NEO4J_SHA%% \ 4 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 5 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 6 | NEO4J_HOME="/var/lib/neo4j" 7 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 8 | 9 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 10 | 11 | COPY ./local-package/* /startup/ 12 | 13 | RUN apt update \ 14 | && apt install -y curl gosu procps \ 15 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 16 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 17 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 18 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 19 | && rm ${NEO4J_TARBALL} \ 20 | && mv "${NEO4J_HOME}"/data /data \ 21 | && chown -R neo4j:neo4j /data \ 22 | && chmod -R 777 /data \ 23 | && mkdir -p /backups \ 24 | && chown -R neo4j:neo4j /backups \ 25 | && chmod -R 777 /backups \ 26 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 27 | && chmod -R 777 "${NEO4J_HOME}" \ 28 | && ln -s /data "${NEO4J_HOME}"/data \ 29 | && rm -rf /tmp/* \ 30 | && rm -rf /var/lib/apt/lists/* \ 31 | && apt-get -y purge --auto-remove curl 32 | 33 | 34 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 35 | VOLUME /data /backups 36 | WORKDIR "${NEO4J_HOME}" 37 | 38 | COPY docker-entrypoint.sh /docker-entrypoint.sh 39 | 40 | ENTRYPOINT ["/docker-entrypoint.sh"] 41 | 42 | CMD ["neo4j-admin"] 43 | -------------------------------------------------------------------------------- /docker-image-src/5/neo4j-admin/Dockerfile-ubi8: -------------------------------------------------------------------------------- 1 | FROM redhat/ubi8-minimal:latest 2 | ENV JAVA_HOME=/usr 3 | 4 | # gather pre-requisite packages 5 | RUN microdnf install -y gzip java-17 procps shadow-utils tar util-linux && \ 6 | microdnf clean all 7 | 8 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 9 | NEO4J_SHA256=%%NEO4J_SHA%% \ 10 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 11 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 12 | NEO4J_HOME="/var/lib/neo4j" 13 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 14 | 15 | COPY ./local-package/* /startup/ 16 | 17 | RUN set -eux; \ 18 | groupadd --gid 7474 --system neo4j; \ 19 | useradd --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --gid neo4j neo4j; \ 20 | curl --fail --silent --show-error --location --remote-name ${NEO4J_URI}; \ 21 | echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet; \ 22 | tar --extract --file ${NEO4J_TARBALL} --directory /var/lib; \ 23 | mv /var/lib/neo4j-* "${NEO4J_HOME}"; \ 24 | rm ${NEO4J_TARBALL}; \ 25 | rm ${NEO4J_HOME}/bin/neo4j; \ 26 | mv "${NEO4J_HOME}"/data /data; \ 27 | chown -R neo4j:neo4j /data; \ 28 | chmod -R 777 /data; \ 29 | mkdir -p /backups; \ 30 | chown -R neo4j:neo4j /backups; \ 31 | chmod -R 777 /backups; \ 32 | chown -R neo4j:neo4j "${NEO4J_HOME}"; \ 33 | chmod -R 777 "${NEO4J_HOME}"; \ 34 | ln -s /data "${NEO4J_HOME}"/data; \ 35 | ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh 36 | 37 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 38 | VOLUME /data /backups 39 | WORKDIR "${NEO4J_HOME}" 40 | 41 | ENTRYPOINT ["/startup/docker-entrypoint.sh"] 42 | CMD ["neo4j-admin"] 43 | -------------------------------------------------------------------------------- /docker-image-src/4.4/neo4j-admin/Dockerfile-ubi9: -------------------------------------------------------------------------------- 1 | FROM redhat/ubi9-minimal:latest 2 | ENV JAVA_HOME=/usr 3 | 4 | # gather pre-requisite packages 5 | RUN microdnf install -y gzip java-11 procps shadow-utils tar util-linux && \ 6 | microdnf clean all 7 | 8 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 9 | NEO4J_SHA256=%%NEO4J_SHA%% \ 10 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 11 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 12 | NEO4J_HOME="/var/lib/neo4j" \ 13 | LANG=C.UTF-8 14 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 15 | 16 | COPY ./local-package/* /startup/ 17 | 18 | RUN set -eux; \ 19 | groupadd --gid 7474 --system neo4j; \ 20 | useradd --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --gid neo4j neo4j; \ 21 | curl --fail --silent --show-error --location --remote-name ${NEO4J_URI}; \ 22 | echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet; \ 23 | tar --extract --file ${NEO4J_TARBALL} --directory /var/lib; \ 24 | mv /var/lib/neo4j-* "${NEO4J_HOME}"; \ 25 | rm ${NEO4J_TARBALL}; \ 26 | rm ${NEO4J_HOME}/bin/neo4j; \ 27 | mv "${NEO4J_HOME}"/data /data; \ 28 | chown -R neo4j:neo4j /data; \ 29 | chmod -R 777 /data; \ 30 | mkdir -p /backups; \ 31 | chown -R neo4j:neo4j /backups; \ 32 | chmod -R 777 /backups; \ 33 | chown -R neo4j:neo4j "${NEO4J_HOME}"; \ 34 | chmod -R 777 "${NEO4J_HOME}"; \ 35 | chmod -R 755 "${NEO4J_HOME}/bin"; \ 36 | ln -s /data "${NEO4J_HOME}"/data; \ 37 | ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh 38 | 39 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 40 | VOLUME /data /backups 41 | WORKDIR "${NEO4J_HOME}" 42 | 43 | ENTRYPOINT ["/startup/docker-entrypoint.sh"] 44 | CMD ["neo4j-admin"] 45 | -------------------------------------------------------------------------------- /docker-image-src/5/neo4j-admin/Dockerfile-ubi9: -------------------------------------------------------------------------------- 1 | FROM redhat/ubi9-minimal:latest 2 | ENV JAVA_HOME=/usr 3 | 4 | # gather pre-requisite packages 5 | RUN microdnf install -y --nodocs gzip java-17 procps shadow-utils tar util-linux && \ 6 | microdnf clean all 7 | 8 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 9 | NEO4J_SHA256=%%NEO4J_SHA%% \ 10 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 11 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 12 | NEO4J_HOME="/var/lib/neo4j" \ 13 | LANG=C.UTF-8 14 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 15 | 16 | COPY ./local-package/* /startup/ 17 | 18 | RUN set -eux; \ 19 | groupadd --gid 7474 --system neo4j; \ 20 | useradd --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --gid neo4j neo4j; \ 21 | curl --fail --silent --show-error --location --remote-name ${NEO4J_URI}; \ 22 | echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet; \ 23 | tar --extract --file ${NEO4J_TARBALL} --directory /var/lib; \ 24 | mv /var/lib/neo4j-* "${NEO4J_HOME}"; \ 25 | rm ${NEO4J_TARBALL}; \ 26 | rm ${NEO4J_HOME}/bin/neo4j; \ 27 | mv "${NEO4J_HOME}"/data /data; \ 28 | chown -R neo4j:neo4j /data; \ 29 | chmod -R 777 /data; \ 30 | mkdir -p /backups; \ 31 | chown -R neo4j:neo4j /backups; \ 32 | chmod -R 777 /backups; \ 33 | chown -R neo4j:neo4j "${NEO4J_HOME}"; \ 34 | chmod -R 777 "${NEO4J_HOME}"; \ 35 | chmod -R 755 "${NEO4J_HOME}/bin"; \ 36 | ln -s /data "${NEO4J_HOME}"/data; \ 37 | ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh 38 | 39 | ENV PATH="${NEO4J_HOME}"/bin:$PATH 40 | VOLUME /data /backups 41 | WORKDIR "${NEO4J_HOME}" 42 | 43 | ENTRYPOINT ["/startup/docker-entrypoint.sh"] 44 | CMD ["neo4j-admin"] 45 | -------------------------------------------------------------------------------- /docker-image-src/calver/neo4j-admin/Dockerfile-ubi9: -------------------------------------------------------------------------------- 1 | FROM redhat/ubi9-minimal:latest 2 | ENV JAVA_HOME=/usr 3 | 4 | # gather pre-requisite packages 5 | RUN microdnf install -y --nodocs gzip java-21 procps shadow-utils tar util-linux && \ 6 | microdnf clean all 7 | 8 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 9 | NEO4J_SHA256=%%NEO4J_SHA%% \ 10 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 11 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 12 | NEO4J_HOME="/var/lib/neo4j" \ 13 | LANG=C.UTF-8 14 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 15 | 16 | COPY ./local-package/* /startup/ 17 | 18 | RUN set -eux; \ 19 | groupadd --gid 7474 --system neo4j; \ 20 | useradd --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --gid neo4j neo4j; \ 21 | curl --fail --silent --show-error --location --remote-name ${NEO4J_URI}; \ 22 | echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet; \ 23 | tar --extract --file ${NEO4J_TARBALL} --directory /var/lib; \ 24 | mv /var/lib/neo4j-* "${NEO4J_HOME}"; \ 25 | rm ${NEO4J_TARBALL}; \ 26 | rm ${NEO4J_HOME}/bin/neo4j; \ 27 | mv "${NEO4J_HOME}"/data /data; \ 28 | chown -R neo4j:neo4j /data; \ 29 | chmod -R 777 /data; \ 30 | mkdir -p /backups; \ 31 | chown -R neo4j:neo4j /backups; \ 32 | chmod -R 777 /backups; \ 33 | chown -R neo4j:neo4j "${NEO4J_HOME}"; \ 34 | chmod -R 777 "${NEO4J_HOME}"; \ 35 | chmod -R 755 "${NEO4J_HOME}/bin"; \ 36 | ln -s /data "${NEO4J_HOME}"/data; \ 37 | ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh 38 | 39 | ENV PATH="${NEO4J_HOME}"/bin:$PATH 40 | VOLUME /data /backups 41 | WORKDIR "${NEO4J_HOME}" 42 | 43 | ENTRYPOINT ["/startup/docker-entrypoint.sh"] 44 | CMD ["neo4j-admin"] 45 | -------------------------------------------------------------------------------- /docker-image-src/3.5/neo4j-admin/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:8 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 12 | 13 | COPY ./local-package/* /startup/ 14 | 15 | RUN apt update \ 16 | && apt install -y curl procps \ 17 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 18 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 19 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 20 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 21 | && rm ${NEO4J_TARBALL} \ 22 | && rm ${NEO4J_HOME}/bin/neo4j \ 23 | && mv "${NEO4J_HOME}"/data /data \ 24 | && chown -R neo4j:neo4j /data \ 25 | && chmod -R 777 /data \ 26 | && mkdir -p /backups \ 27 | && chown -R neo4j:neo4j /backups \ 28 | && chmod -R 777 /backups \ 29 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 30 | && chmod -R 777 "${NEO4J_HOME}" \ 31 | && ln -s /data "${NEO4J_HOME}"/data \ 32 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 33 | && rm -rf /tmp/* \ 34 | && rm -rf /var/lib/apt/lists/* \ 35 | && apt-get -y purge --auto-remove curl 36 | 37 | 38 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 39 | VOLUME /data /backups 40 | WORKDIR "${NEO4J_HOME}" 41 | 42 | ENTRYPOINT ["/startup/docker-entrypoint.sh"] 43 | 44 | CMD ["neo4j-admin"] 45 | -------------------------------------------------------------------------------- /docker-image-src/4.2/neo4j-admin/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:11 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 12 | 13 | COPY ./local-package/* /startup/ 14 | 15 | RUN apt update \ 16 | && apt install -y curl procps \ 17 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 18 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 19 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 20 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 21 | && rm ${NEO4J_TARBALL} \ 22 | && rm ${NEO4J_HOME}/bin/neo4j \ 23 | && mv "${NEO4J_HOME}"/data /data \ 24 | && chown -R neo4j:neo4j /data \ 25 | && chmod -R 777 /data \ 26 | && mkdir -p /backups \ 27 | && chown -R neo4j:neo4j /backups \ 28 | && chmod -R 777 /backups \ 29 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 30 | && chmod -R 777 "${NEO4J_HOME}" \ 31 | && ln -s /data "${NEO4J_HOME}"/data \ 32 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 33 | && rm -rf /tmp/* \ 34 | && rm -rf /var/lib/apt/lists/* \ 35 | && apt-get -y purge --auto-remove curl 36 | 37 | 38 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 39 | VOLUME /data /backups 40 | WORKDIR "${NEO4J_HOME}" 41 | 42 | ENTRYPOINT ["/startup/docker-entrypoint.sh"] 43 | 44 | CMD ["neo4j-admin"] 45 | -------------------------------------------------------------------------------- /docker-image-src/4.3/neo4j-admin/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:11 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 12 | 13 | COPY ./local-package/* /startup/ 14 | 15 | RUN apt update \ 16 | && apt install -y curl procps \ 17 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 18 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 19 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 20 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 21 | && rm ${NEO4J_TARBALL} \ 22 | && rm ${NEO4J_HOME}/bin/neo4j \ 23 | && mv "${NEO4J_HOME}"/data /data \ 24 | && chown -R neo4j:neo4j /data \ 25 | && chmod -R 777 /data \ 26 | && mkdir -p /backups \ 27 | && chown -R neo4j:neo4j /backups \ 28 | && chmod -R 777 /backups \ 29 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 30 | && chmod -R 777 "${NEO4J_HOME}" \ 31 | && ln -s /data "${NEO4J_HOME}"/data \ 32 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 33 | && rm -rf /tmp/* \ 34 | && rm -rf /var/lib/apt/lists/* \ 35 | && apt-get -y purge --auto-remove curl 36 | 37 | 38 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 39 | VOLUME /data /backups 40 | WORKDIR "${NEO4J_HOME}" 41 | 42 | ENTRYPOINT ["/startup/docker-entrypoint.sh"] 43 | 44 | CMD ["neo4j-admin"] 45 | -------------------------------------------------------------------------------- /docker-image-src/3.5/coredb/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:8 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | RUN addgroup --system neo4j && adduser --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 12 | 13 | COPY ./local-package/* /startup/ 14 | 15 | RUN apt update \ 16 | && apt install -y curl gosu jq tini wget \ 17 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 18 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 19 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 20 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 21 | && rm ${NEO4J_TARBALL} \ 22 | && mv "${NEO4J_HOME}"/data /data \ 23 | && mv "${NEO4J_HOME}"/logs /logs \ 24 | && chown -R neo4j:neo4j /data \ 25 | && chmod -R 777 /data \ 26 | && chown -R neo4j:neo4j /logs \ 27 | && chmod -R 777 /logs \ 28 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 29 | && chmod -R 777 "${NEO4J_HOME}" \ 30 | && ln -s /data "${NEO4J_HOME}"/data \ 31 | && ln -s /logs "${NEO4J_HOME}"/logs \ 32 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 33 | && apt-get -y purge --auto-remove curl \ 34 | && rm -rf /var/lib/apt/lists/* 35 | 36 | 37 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 38 | 39 | WORKDIR "${NEO4J_HOME}" 40 | 41 | VOLUME /data /logs 42 | 43 | EXPOSE 7474 7473 7687 44 | 45 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 46 | CMD ["neo4j"] 47 | -------------------------------------------------------------------------------- /docker-image-src/4.1/coredb/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:11 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 12 | 13 | COPY ./local-package/* /startup/ 14 | 15 | RUN apt update \ 16 | && apt install -y curl wget gosu jq tini \ 17 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 18 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 19 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 20 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 21 | && rm ${NEO4J_TARBALL} \ 22 | && mv "${NEO4J_HOME}"/data /data \ 23 | && mv "${NEO4J_HOME}"/logs /logs \ 24 | && chown -R neo4j:neo4j /data \ 25 | && chmod -R 777 /data \ 26 | && chown -R neo4j:neo4j /logs \ 27 | && chmod -R 777 /logs \ 28 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 29 | && chmod -R 777 "${NEO4J_HOME}" \ 30 | && ln -s /data "${NEO4J_HOME}"/data \ 31 | && ln -s /logs "${NEO4J_HOME}"/logs \ 32 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 33 | && apt-get -y purge --auto-remove curl \ 34 | && rm -rf /var/lib/apt/lists/* 35 | 36 | 37 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 38 | 39 | WORKDIR "${NEO4J_HOME}" 40 | 41 | VOLUME /data /logs 42 | 43 | EXPOSE 7474 7473 7687 44 | 45 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 46 | CMD ["neo4j"] 47 | -------------------------------------------------------------------------------- /docker-image-src/4.2/coredb/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:11 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 12 | 13 | COPY ./local-package/* /startup/ 14 | 15 | RUN apt update \ 16 | && apt install -y curl wget gosu jq tini \ 17 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 18 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 19 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 20 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 21 | && rm ${NEO4J_TARBALL} \ 22 | && mv "${NEO4J_HOME}"/data /data \ 23 | && mv "${NEO4J_HOME}"/logs /logs \ 24 | && chown -R neo4j:neo4j /data \ 25 | && chmod -R 777 /data \ 26 | && chown -R neo4j:neo4j /logs \ 27 | && chmod -R 777 /logs \ 28 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 29 | && chmod -R 777 "${NEO4J_HOME}" \ 30 | && ln -s /data "${NEO4J_HOME}"/data \ 31 | && ln -s /logs "${NEO4J_HOME}"/logs \ 32 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 33 | && apt-get -y purge --auto-remove curl \ 34 | && rm -rf /var/lib/apt/lists/* 35 | 36 | 37 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 38 | 39 | WORKDIR "${NEO4J_HOME}" 40 | 41 | VOLUME /data /logs 42 | 43 | EXPOSE 7474 7473 7687 44 | 45 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 46 | CMD ["neo4j"] 47 | -------------------------------------------------------------------------------- /docker-image-src/4.3/coredb/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:11 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 12 | 13 | COPY ./local-package/* /startup/ 14 | 15 | RUN apt update \ 16 | && apt install -y curl gosu jq procps tini wget \ 17 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 18 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 19 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 20 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 21 | && rm ${NEO4J_TARBALL} \ 22 | && mv "${NEO4J_HOME}"/data /data \ 23 | && mv "${NEO4J_HOME}"/logs /logs \ 24 | && chown -R neo4j:neo4j /data \ 25 | && chmod -R 777 /data \ 26 | && chown -R neo4j:neo4j /logs \ 27 | && chmod -R 777 /logs \ 28 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 29 | && chmod -R 777 "${NEO4J_HOME}" \ 30 | && ln -s /data "${NEO4J_HOME}"/data \ 31 | && ln -s /logs "${NEO4J_HOME}"/logs \ 32 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 33 | && apt-get -y purge --auto-remove curl \ 34 | && rm -rf /var/lib/apt/lists/* 35 | 36 | 37 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 38 | 39 | WORKDIR "${NEO4J_HOME}" 40 | 41 | VOLUME /data /logs 42 | 43 | EXPOSE 7474 7473 7687 44 | 45 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 46 | CMD ["neo4j"] 47 | -------------------------------------------------------------------------------- /docker-image-src/4.0/coredb/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:11 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 12 | 13 | COPY ./local-package/* /tmp/ 14 | 15 | RUN apt update \ 16 | && apt install -y curl wget gosu jq tini \ 17 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 18 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 19 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 20 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 21 | && rm ${NEO4J_TARBALL} \ 22 | && mv "${NEO4J_HOME}"/data /data \ 23 | && mv "${NEO4J_HOME}"/logs /logs \ 24 | && chown -R neo4j:neo4j /data \ 25 | && chmod -R 777 /data \ 26 | && chown -R neo4j:neo4j /logs \ 27 | && chmod -R 777 /logs \ 28 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 29 | && chmod -R 777 "${NEO4J_HOME}" \ 30 | && ln -s /data "${NEO4J_HOME}"/data \ 31 | && ln -s /logs "${NEO4J_HOME}"/logs \ 32 | && mv /tmp/neo4j-plugins.json /neo4j-plugins.json \ 33 | && rm -rf /tmp/* \ 34 | && rm -rf /var/lib/apt/lists/* \ 35 | && apt-get -y purge --auto-remove curl 36 | 37 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 38 | 39 | WORKDIR "${NEO4J_HOME}" 40 | 41 | VOLUME /data /logs 42 | 43 | COPY docker-entrypoint.sh /docker-entrypoint.sh 44 | 45 | EXPOSE 7474 7473 7687 46 | 47 | ENTRYPOINT ["tini", "-g", "--", "/docker-entrypoint.sh"] 48 | CMD ["neo4j"] 49 | -------------------------------------------------------------------------------- /docker-image-src/4.4/neo4j-admin/Dockerfile-bullseye: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:11 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" \ 9 | LANG=C.UTF-8 10 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 11 | 12 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 13 | 14 | COPY ./local-package/* /startup/ 15 | 16 | RUN apt-get update \ 17 | && apt-get install --no-install-recommends -o Acquire::Retries=10 -y \ 18 | curl ca-certificates procps \ 19 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 20 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 21 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 22 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 23 | && rm ${NEO4J_TARBALL} \ 24 | && rm ${NEO4J_HOME}/bin/neo4j \ 25 | && mv "${NEO4J_HOME}"/data /data \ 26 | && chown -R neo4j:neo4j /data \ 27 | && chmod -R 777 /data \ 28 | && mkdir -p /backups \ 29 | && chown -R neo4j:neo4j /backups \ 30 | && chmod -R 777 /backups \ 31 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 32 | && chmod -R 777 "${NEO4J_HOME}" \ 33 | && chmod -R 755 "${NEO4J_HOME}/bin" \ 34 | && ln -s /data "${NEO4J_HOME}"/data \ 35 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 36 | && rm -rf /tmp/* \ 37 | && rm -rf /var/lib/apt/lists/* \ 38 | && apt-get -y purge --auto-remove curl 39 | 40 | 41 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 42 | VOLUME /data /backups 43 | WORKDIR "${NEO4J_HOME}" 44 | 45 | ENTRYPOINT ["/startup/docker-entrypoint.sh"] 46 | 47 | CMD ["neo4j-admin"] 48 | -------------------------------------------------------------------------------- /docker-image-src/5/neo4j-admin/Dockerfile-bullseye: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:17 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" \ 9 | LANG=C.UTF-8 10 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 11 | 12 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 13 | 14 | COPY ./local-package/* /startup/ 15 | 16 | RUN apt-get update \ 17 | && apt-get install --no-install-recommends -o Acquire::Retries=10 -y \ 18 | curl ca-certificates procps \ 19 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 20 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 21 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 22 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 23 | && rm ${NEO4J_TARBALL} \ 24 | && rm ${NEO4J_HOME}/bin/neo4j \ 25 | && mv "${NEO4J_HOME}"/data /data \ 26 | && chown -R neo4j:neo4j /data \ 27 | && chmod -R 777 /data \ 28 | && mkdir -p /backups \ 29 | && chown -R neo4j:neo4j /backups \ 30 | && chmod -R 777 /backups \ 31 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 32 | && chmod -R 777 "${NEO4J_HOME}" \ 33 | && chmod -R 755 "${NEO4J_HOME}/bin" \ 34 | && ln -s /data "${NEO4J_HOME}"/data \ 35 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 36 | && rm -rf /tmp/* \ 37 | && rm -rf /var/lib/apt/lists/* \ 38 | && apt-get -y purge --auto-remove curl 39 | 40 | 41 | ENV PATH="${NEO4J_HOME}"/bin:$PATH 42 | VOLUME /data /backups 43 | WORKDIR "${NEO4J_HOME}" 44 | 45 | ENTRYPOINT ["/startup/docker-entrypoint.sh"] 46 | 47 | CMD ["neo4j-admin"] 48 | -------------------------------------------------------------------------------- /docker-image-src/calver/neo4j-admin/Dockerfile-bullseye: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:21 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" \ 9 | LANG=C.UTF-8 10 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 11 | 12 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 13 | 14 | COPY ./local-package/* /startup/ 15 | 16 | RUN apt-get update \ 17 | && apt-get install --no-install-recommends -o Acquire::Retries=10 -y \ 18 | curl ca-certificates procps \ 19 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 20 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 21 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 22 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 23 | && rm ${NEO4J_TARBALL} \ 24 | && rm ${NEO4J_HOME}/bin/neo4j \ 25 | && mv "${NEO4J_HOME}"/data /data \ 26 | && chown -R neo4j:neo4j /data \ 27 | && chmod -R 777 /data \ 28 | && mkdir -p /backups \ 29 | && chown -R neo4j:neo4j /backups \ 30 | && chmod -R 777 /backups \ 31 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 32 | && chmod -R 777 "${NEO4J_HOME}" \ 33 | && chmod -R 755 "${NEO4J_HOME}/bin" \ 34 | && ln -s /data "${NEO4J_HOME}"/data \ 35 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 36 | && rm -rf /tmp/* \ 37 | && rm -rf /var/lib/apt/lists/* \ 38 | && apt-get -y purge --auto-remove curl 39 | 40 | 41 | ENV PATH="${NEO4J_HOME}"/bin:$PATH 42 | VOLUME /data /backups 43 | WORKDIR "${NEO4J_HOME}" 44 | 45 | ENTRYPOINT ["/startup/docker-entrypoint.sh"] 46 | 47 | CMD ["neo4j-admin"] 48 | -------------------------------------------------------------------------------- /docker-image-src/calver/coredb/neo4j-plugins.json: -------------------------------------------------------------------------------- 1 | { 2 | "apoc-extended": { 3 | "versions": "https://neo4j-contrib.github.io/neo4j-apoc-procedures/versions.json", 4 | "properties": { 5 | "dbms.security.procedures.unrestricted": "apoc.*" 6 | } 7 | }, 8 | "apoc": { 9 | "location": "/var/lib/neo4j/labs/apoc-*-core.jar", 10 | "versions": "https://neo4j.github.io/apoc/versions.json", 11 | "properties": { 12 | "dbms.security.procedures.unrestricted": "apoc.*" 13 | } 14 | }, 15 | "bloom": { 16 | "location": "/var/lib/neo4j/products/bloom-plugin-*.jar", 17 | "versions": "https://bloom-plugins.s3.eu-west-2.amazonaws.com/versions.json", 18 | "properties": { 19 | "server.unmanaged_extension_classes": "com.neo4j.bloom.server=/browser/bloom", 20 | "dbms.security.procedures.unrestricted": "bloom.*", 21 | "dbms.bloom.license_file": "/licenses/bloom.license" 22 | } 23 | }, 24 | "graph-data-science": { 25 | "versions": "https://graphdatascience.ninja/versions.json", 26 | "location": "/var/lib/neo4j/products/neo4j-graph-data-science-*.jar", 27 | "properties": { 28 | "dbms.security.procedures.unrestricted": "gds.*" 29 | } 30 | }, 31 | "genai": { 32 | "location": "/var/lib/neo4j/products/neo4j-genai-plugin-*.jar", 33 | "properties": { 34 | "dbms.security.procedures.unrestricted": "genai.*" 35 | } 36 | }, 37 | "fleet-management": { 38 | "location": "/var/lib/neo4j/products/neo4j-fleet-management-*.jar", 39 | "properties": { 40 | "dbms.security.procedures.unrestricted": "fleetManagement.*", 41 | "dbms.security.procedures.allowlist": "fleetManagement.*" 42 | } 43 | }, 44 | "_testing": { 45 | "versions": "http://host.testcontainers.internal:3000/versions.json", 46 | "properties": { 47 | "dbms.security.procedures.unrestricted": "com.neo4j.docker.neo4jserver.plugins.*" 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /docker-image-src/3.3/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:8-jre-slim 2 | 3 | ENV NEO4J_SHA256=%%NEO4J_SHA%% \ 4 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 5 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 6 | NEO4J_HOME="/var/lib/neo4j" \ 7 | TINI_VERSION="v0.18.0" \ 8 | TINI_SHA256="12d20136605531b09a2c2dac02ccee85e1b874eb322ef6baf7561cd93f93c855" 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | RUN addgroup --system neo4j && adduser --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 12 | 13 | COPY ./local-package/* /tmp/ 14 | 15 | RUN apt update \ 16 | && apt install -y curl gosu jq \ 17 | && curl -L --fail --silent --show-error "https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini" > /sbin/tini \ 18 | && echo "${TINI_SHA256} /sbin/tini" | sha256sum -c --strict --quiet \ 19 | && chmod +x /sbin/tini \ 20 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 21 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 22 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 23 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 24 | && rm ${NEO4J_TARBALL} \ 25 | && mv "${NEO4J_HOME}"/data /data \ 26 | && mv "${NEO4J_HOME}"/logs /logs \ 27 | && chown -R neo4j:neo4j /data \ 28 | && chmod -R 777 /data \ 29 | && chown -R neo4j:neo4j /logs \ 30 | && chmod -R 777 /logs \ 31 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 32 | && chmod -R 777 "${NEO4J_HOME}" \ 33 | && ln -s /data "${NEO4J_HOME}"/data \ 34 | && ln -s /logs "${NEO4J_HOME}"/logs \ 35 | && mv /tmp/neo4j-plugins.json /neo4j-plugins.json \ 36 | && rm -rf /tmp/* \ 37 | && rm -rf /var/lib/apt/lists/* 38 | 39 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 40 | 41 | WORKDIR "${NEO4J_HOME}" 42 | 43 | VOLUME /data /logs 44 | 45 | COPY docker-entrypoint.sh /docker-entrypoint.sh 46 | 47 | EXPOSE 7474 7473 7687 48 | 49 | ENTRYPOINT ["/sbin/tini", "-g", "--", "/docker-entrypoint.sh"] 50 | CMD ["neo4j"] 51 | -------------------------------------------------------------------------------- /docker-image-src/4.4/coredb/neo4j-admin-report.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # load useful utility functions 4 | . /startup/utilities.sh 5 | 6 | function find_report_destination 7 | { 8 | local to_flag="--to" 9 | 10 | while [[ $# -gt 0 ]]; do 11 | case $1 in 12 | # for arg in "$@"; do 13 | # case $arg in 14 | "${to_flag}"=*) 15 | echo ${1#*=} 16 | return 17 | ;; 18 | "${to_flag}") 19 | echo ${2} 20 | return 21 | ;; 22 | *) 23 | shift 24 | ;; 25 | esac 26 | done 27 | mkdir -p /tmp/reports 28 | echo "/tmp/reports" 29 | } 30 | 31 | report_cmd=("neo4j-admin" "report") 32 | 33 | # note, these debug messages are unlikely to work in a docker exec, since environment isn't preserved. 34 | debug_msg "Called ${0}" 35 | debug_msg "neo4j-admin report command is:" "${report_cmd[@]}" "$@" 36 | 37 | # find report destination. This could be specified by argument to neo4j-admin or it could be the default location. 38 | report_destination=$(find_report_destination "$@") 39 | debug_msg "report_destination will be ${report_destination}" 40 | 41 | debug_msg "Determining which user to run neo4j-admin as." 42 | if running_as_root; then 43 | debug_msg "running neo4j-admin report as root" 44 | if [[ ! $(su-exec neo4j:neo4j test -w "${report_destination}") ]]; then 45 | debug_msg "reowning ${report_destination} to neo4j:neo4j" 46 | chown neo4j:neo4j "${report_destination}" 47 | fi 48 | debug_msg su-exec neo4j:neo4j "${report_cmd[@]}" "$@" 49 | su-exec neo4j:neo4j "${report_cmd[@]}" "$@" 50 | else 51 | debug_msg "running neo4j-admin report as user defined by --user flag" 52 | if [[ ! -w "${report_destination}" ]]; then 53 | print_permissions_advice_and_fail "${report_destination}" "$(id -u)" "$(id -g)" 54 | fi 55 | debug_msg "${report_cmd[@]}" "$@" 56 | "${report_cmd[@]}" "$@" 57 | fi -------------------------------------------------------------------------------- /docker-image-src/5/coredb/neo4j-admin-report.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # load useful utility functions 4 | . /startup/utilities.sh 5 | 6 | function find_report_destination 7 | { 8 | local to_flag="--to-path" 9 | 10 | while [[ $# -gt 0 ]]; do 11 | case $1 in 12 | # for arg in "$@"; do 13 | # case $arg in 14 | "${to_flag}"=*) 15 | echo ${1#*=} 16 | return 17 | ;; 18 | "${to_flag}") 19 | echo ${2} 20 | return 21 | ;; 22 | *) 23 | shift 24 | ;; 25 | esac 26 | done 27 | mkdir -p /tmp/reports 28 | echo "/tmp/reports" 29 | } 30 | 31 | report_cmd=("neo4j-admin" "server" "report") 32 | 33 | # note, these debug messages are unlikely to work in a docker exec, since environment isn't preserved. 34 | debug_msg "Called ${0}" 35 | debug_msg "neo4j-admin report command is:" "${report_cmd[@]}" "$@" 36 | 37 | # find report destination. This could be specified by argument to neo4j-admin or it could be the default location. 38 | report_destination=$(find_report_destination "$@") 39 | debug_msg "report_destination will be ${report_destination}" 40 | 41 | debug_msg "Determining which user to run neo4j-admin as." 42 | if running_as_root; then 43 | debug_msg "running neo4j-admin report as root" 44 | if [[ ! $(su-exec neo4j:neo4j test -w "${report_destination}") ]]; then 45 | debug_msg "reowning ${report_destination} to neo4j:neo4j" 46 | chown neo4j:neo4j "${report_destination}" 47 | fi 48 | debug_msg su-exec neo4j:neo4j "${report_cmd[@]}" "$@" 49 | su-exec neo4j:neo4j "${report_cmd[@]}" "$@" 50 | else 51 | debug_msg "running neo4j-admin report as user defined by --user flag" 52 | if [[ ! -w "${report_destination}" ]]; then 53 | print_permissions_advice_and_fail "${report_destination}" "$(id -u)" "$(id -g)" 54 | fi 55 | debug_msg "${report_cmd[@]}" "$@" 56 | "${report_cmd[@]}" "$@" 57 | fi -------------------------------------------------------------------------------- /docker-image-src/calver/coredb/neo4j-admin-report.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # load useful utility functions 4 | . /startup/utilities.sh 5 | 6 | function find_report_destination 7 | { 8 | local to_flag="--to-path" 9 | 10 | while [[ $# -gt 0 ]]; do 11 | case $1 in 12 | # for arg in "$@"; do 13 | # case $arg in 14 | "${to_flag}"=*) 15 | echo ${1#*=} 16 | return 17 | ;; 18 | "${to_flag}") 19 | echo ${2} 20 | return 21 | ;; 22 | *) 23 | shift 24 | ;; 25 | esac 26 | done 27 | mkdir -p /tmp/reports 28 | echo "/tmp/reports" 29 | } 30 | 31 | report_cmd=("neo4j-admin" "server" "report") 32 | 33 | # note, these debug messages are unlikely to work in a docker exec, since environment isn't preserved. 34 | debug_msg "Called ${0}" 35 | debug_msg "neo4j-admin report command is:" "${report_cmd[@]}" "$@" 36 | 37 | # find report destination. This could be specified by argument to neo4j-admin or it could be the default location. 38 | report_destination=$(find_report_destination "$@") 39 | debug_msg "report_destination will be ${report_destination}" 40 | 41 | debug_msg "Determining which user to run neo4j-admin as." 42 | if running_as_root; then 43 | debug_msg "running neo4j-admin report as root" 44 | if [[ ! $(su-exec neo4j:neo4j test -w "${report_destination}") ]]; then 45 | debug_msg "reowning ${report_destination} to neo4j:neo4j" 46 | chown neo4j:neo4j "${report_destination}" 47 | fi 48 | debug_msg su-exec neo4j:neo4j "${report_cmd[@]}" "$@" 49 | su-exec neo4j:neo4j "${report_cmd[@]}" "$@" 50 | else 51 | debug_msg "running neo4j-admin report as user defined by --user flag" 52 | if [[ ! -w "${report_destination}" ]]; then 53 | print_permissions_advice_and_fail "${report_destination}" "$(id -u)" "$(id -g)" 54 | fi 55 | debug_msg "${report_cmd[@]}" "$@" 56 | "${report_cmd[@]}" "$@" 57 | fi -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/utils/HttpServerTestExtension.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.utils; 2 | 3 | import com.sun.net.httpserver.HttpHandler; 4 | import com.sun.net.httpserver.HttpServer; 5 | import org.junit.jupiter.api.extension.AfterEachCallback; 6 | import org.junit.jupiter.api.extension.BeforeEachCallback; 7 | import org.junit.jupiter.api.extension.ExtensionContext; 8 | 9 | import java.net.InetSocketAddress; 10 | 11 | /** 12 | * Runs a HTTP Server with to allow integration testing 13 | */ 14 | public class HttpServerTestExtension implements AfterEachCallback, BeforeEachCallback 15 | { 16 | public final int PORT = 3000; 17 | private HttpServer server; 18 | 19 | @Override 20 | public void beforeEach(ExtensionContext extensionContext) throws Exception 21 | { 22 | server = HttpServer.create( new InetSocketAddress( PORT ), 0 ); 23 | server.setExecutor( null ); // creates a default executor 24 | server.start(); 25 | } 26 | 27 | @Override 28 | public void afterEach(ExtensionContext extensionContext) throws Exception 29 | { 30 | if ( server != null ) 31 | { 32 | server.stop( 5 ); // waits up to 5 seconds to stop serving http requests 33 | } 34 | } 35 | 36 | // Register a handler to provide desired behaviour on a specific uri path 37 | public void registerHandler( String uriToHandle, HttpHandler httpHandler ) 38 | { 39 | if (!uriToHandle.startsWith( "/" )){ 40 | uriToHandle = '/' + uriToHandle; 41 | } 42 | server.createContext( uriToHandle, httpHandler ); 43 | } 44 | 45 | public void unregisterEndpoint(String endpoint) 46 | { 47 | if (!endpoint.startsWith( "/" )){ 48 | endpoint = '/' + endpoint; 49 | } 50 | try 51 | { 52 | server.removeContext(endpoint); 53 | } 54 | catch (IllegalArgumentException iex) 55 | { 56 | // there was nothing registered to that endpoint so action is a NOP. 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /docker-image-src/3.4/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:8-jre-slim 2 | 3 | ENV NEO4J_SHA256=%%NEO4J_SHA%% \ 4 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 5 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 6 | NEO4J_HOME="/var/lib/neo4j" \ 7 | TINI_VERSION="v0.18.0" \ 8 | TINI_SHA256="12d20136605531b09a2c2dac02ccee85e1b874eb322ef6baf7561cd93f93c855" 9 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 10 | 11 | RUN addgroup --system neo4j && adduser --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 12 | 13 | COPY ./local-package/* /tmp/ 14 | 15 | RUN apt update \ 16 | && apt install -y curl wget gosu jq \ 17 | && curl -L --fail --silent --show-error "https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini" > /sbin/tini \ 18 | && echo "${TINI_SHA256} /sbin/tini" | sha256sum -c --strict --quiet \ 19 | && chmod +x /sbin/tini \ 20 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 21 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 22 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 23 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 24 | && rm ${NEO4J_TARBALL} \ 25 | && mv "${NEO4J_HOME}"/data /data \ 26 | && mv "${NEO4J_HOME}"/logs /logs \ 27 | && chown -R neo4j:neo4j /data \ 28 | && chmod -R 777 /data \ 29 | && chown -R neo4j:neo4j /logs \ 30 | && chmod -R 777 /logs \ 31 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 32 | && chmod -R 777 "${NEO4J_HOME}" \ 33 | && ln -s /data "${NEO4J_HOME}"/data \ 34 | && ln -s /logs "${NEO4J_HOME}"/logs \ 35 | && mv /tmp/neo4j-plugins.json /neo4j-plugins.json \ 36 | && rm -rf /tmp/* \ 37 | && rm -rf /var/lib/apt/lists/* \ 38 | && apt-get -y purge --auto-remove curl 39 | 40 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 41 | 42 | WORKDIR "${NEO4J_HOME}" 43 | 44 | VOLUME /data /logs 45 | 46 | COPY docker-entrypoint.sh /docker-entrypoint.sh 47 | 48 | EXPOSE 7474 7473 7687 49 | 50 | ENTRYPOINT ["/sbin/tini", "-g", "--", "/docker-entrypoint.sh"] 51 | CMD ["neo4j"] 52 | -------------------------------------------------------------------------------- /docker-image-src/5/coredb/neo4j-plugins.json: -------------------------------------------------------------------------------- 1 | { 2 | "apoc-extended": { 3 | "versions": "https://neo4j-contrib.github.io/neo4j-apoc-procedures/versions.json", 4 | "properties": { 5 | "dbms.security.procedures.unrestricted": "apoc.*" 6 | } 7 | }, 8 | "apoc": { 9 | "location": "/var/lib/neo4j/labs/apoc-*-core.jar", 10 | "versions": "https://neo4j.github.io/apoc/versions.json", 11 | "properties": { 12 | "dbms.security.procedures.unrestricted": "apoc.*" 13 | } 14 | }, 15 | "bloom": { 16 | "location": "/var/lib/neo4j/products/bloom-plugin-*.jar", 17 | "versions": "https://bloom-plugins.s3.eu-west-2.amazonaws.com/versions.json", 18 | "properties": { 19 | "server.unmanaged_extension_classes": "com.neo4j.bloom.server=/browser/bloom", 20 | "dbms.security.procedures.unrestricted": "bloom.*", 21 | "dbms.bloom.license_file": "/licenses/bloom.license" 22 | } 23 | }, 24 | "graph-data-science": { 25 | "versions": "https://graphdatascience.ninja/versions.json", 26 | "location": "/var/lib/neo4j/products/neo4j-graph-data-science-*.jar", 27 | "properties": { 28 | "dbms.security.procedures.unrestricted": "gds.*" 29 | } 30 | }, 31 | "n10s": { 32 | "versions": "https://neo4j-labs.github.io/neosemantics/versions.json", 33 | "properties": { 34 | "dbms.security.procedures.unrestricted":"semantics.*" 35 | } 36 | }, 37 | "genai": { 38 | "location": "/var/lib/neo4j/products/neo4j-genai-plugin-*.jar", 39 | "properties": { 40 | "dbms.security.procedures.unrestricted": "genai.*" 41 | } 42 | }, 43 | "fleet-management": { 44 | "location": "/var/lib/neo4j/products/neo4j-fleet-management-*.jar", 45 | "properties": { 46 | "dbms.security.procedures.unrestricted": "fleetManagement.*", 47 | "dbms.security.procedures.allowlist": "fleetManagement.*" 48 | } 49 | }, 50 | "_testing": { 51 | "versions": "http://host.testcontainers.internal:3000/versions.json", 52 | "properties": { 53 | "dbms.security.procedures.unrestricted": "com.neo4j.docker.neo4jserver.plugins.*" 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/neo4jadmin/TestReport.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.neo4jadmin; 2 | 3 | import com.neo4j.docker.utils.WaitStrategies; 4 | import com.neo4j.docker.utils.TestSettings; 5 | import org.junit.jupiter.api.Assertions; 6 | import org.junit.jupiter.api.Test; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | import org.testcontainers.containers.ContainerLaunchException; 10 | import org.testcontainers.containers.GenericContainer; 11 | import org.testcontainers.containers.output.Slf4jLogConsumer; 12 | 13 | import java.time.Duration; 14 | 15 | public class TestReport 16 | { 17 | private final Logger log = LoggerFactory.getLogger( TestReport.class ); 18 | 19 | private GenericContainer createAdminContainer() 20 | { 21 | GenericContainer container = new GenericContainer( TestSettings.ADMIN_IMAGE_ID ) 22 | .withEnv( "NEO4J_ACCEPT_LICENSE_AGREEMENT", "yes" ).withEnv( "NEO4J_DEBUG", "yes" ) 23 | .withCommand( "neo4j-admin", "server", "report" ) 24 | .withLogConsumer( new Slf4jLogConsumer( log ) ); 25 | WaitStrategies.waitUntilContainerFinished( container, Duration.ofSeconds( 20 ) ); 26 | return container; 27 | } 28 | 29 | @Test 30 | void shouldErrorHelpfullyIfAdminReport() 31 | { 32 | try(GenericContainer container = createAdminContainer()) 33 | { 34 | Assertions.assertThrows( ContainerLaunchException.class, container::start ); 35 | Assertions.assertTrue( container.getLogs().contains( "To run the report tool inside a neo4j container, do:" ), 36 | "did not error about needing to run in the same container as the database." + 37 | " Actual logs:"+container.getLogs() ); 38 | Assertions.assertTrue( container.getLogs().contains( "docker exec neo4j-admin-report" ), 39 | "did not error about needing to run in the same container as the database." + 40 | " Actual logs:"+container.getLogs() ); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | *NOTE:* Supported images are available in the [official image library](https://hub.docker.com/_/neo4j/) on Docker Hub. 2 | Please use those in production. 3 | 4 | # Using the Neo4j Docker Image 5 | 6 | Documentation for the Neo4j image can be found [here](https://neo4j.com/docs/operations-manual/current/deployment/single-instance/docker/). 7 | 8 | You can start a Neo4j container like this: 9 | 10 | ``` 11 | docker run \ 12 | --publish=7474:7474 --publish=7687:7687 \ 13 | --volume=$HOME/neo4j/data:/data \ 14 | --volume=$HOME/neo4j/logs:/logs \ 15 | neo4j:latest 16 | ``` 17 | 18 | To start a Neo4j Enterprise Edition container, you can run: 19 | 20 | ``` 21 | docker run \ 22 | --publish=7474:7474 --publish=7687:7687 \ 23 | --env=NEO4J_ACCEPT_LICENSE_AGREEMENT=yes \ 24 | --volume=$HOME/neo4j/data:/data \ 25 | --volume=$HOME/neo4j/logs:/logs \ 26 | neo4j:enterprise 27 | ``` 28 | 29 | Mounting the `/data` and `/logs` folder is optional, 30 | but it means that data can persist between closing and reopening Neo4j containers. 31 | 32 | # Neo4j images for ARM64 33 | 34 | From 4.4.0 and onwards, Neo4j images have been available for ARM64 architectures through [Docker Hub](https://hub.docker.com/_/neo4j/). 35 | 36 | For earlier versions, we provide unsupported and untested builds of ARM64 Neo4j community edition from 4.0.0 to 4.3.23. 37 | These are unsuitable for production use, but may be useful for experimentation or hobbyists. 38 | 39 | They are available on Docker hub at: 40 | 41 | https://hub.docker.com/r/neo4j/neo4j-arm64-experimental 42 | 43 | 44 | The images take the name format `neo4j/neo4j-arm64-experimental:-arm64`. 45 | Example usage: 46 | 47 | ```shell script 48 | docker run \ 49 | --publish=7474:7474 --publish=7687:7687 \ 50 | --volume=$HOME/neo4j/data:/data \ 51 | --volume=$HOME/neo4j/logs:/logs \ 52 | neo4j/neo4j-arm64-experimental:4.1.0-arm64 53 | ``` 54 | 55 | 56 | # Building and Developing the Neo4j Docker Image 57 | 58 | See [DEVELOPMENT.md](DEVELOPMENT.md) 59 | 60 | # Getting support and contributing 61 | 62 | For bug reports and feature requests, please create issues and pull requests against this Github repository. 63 | 64 | If you need guidance with using Neo4j you can ask questions here: https://community.neo4j.com/ 65 | -------------------------------------------------------------------------------- /docker-image-src/3.5/coredb/neo4j-plugins.json: -------------------------------------------------------------------------------- 1 | { 2 | "apoc": { 3 | "versions": "https://neo4j-contrib.github.io/neo4j-apoc-procedures/versions.json", 4 | "properties": { 5 | "dbms.security.procedures.unrestricted": "apoc.*" 6 | } 7 | }, 8 | "apoc-core": { 9 | "location": "/var/lib/neo4j/labs/apoc-*-core.jar", 10 | "versions": "https://neo4j-contrib.github.io/neo4j-apoc-procedures/versions.json", 11 | "properties": { 12 | "dbms.security.procedures.unrestricted": "apoc.*" 13 | } 14 | }, 15 | "bloom": { 16 | "location": "/var/lib/neo4j/products/bloom-plugin-*.jar", 17 | "versions": "https://bloom-plugins.s3.eu-west-2.amazonaws.com/versions.json", 18 | "properties": { 19 | "dbms.unmanaged_extension_classes": "com.neo4j.bloom.server=/browser/bloom", 20 | "dbms.security.procedures.unrestricted": "bloom.*", 21 | "neo4j.bloom.license_file": "/licenses/bloom.license" 22 | } 23 | }, 24 | "streams": { 25 | "versions": "https://neo4j-contrib.github.io/neo4j-streams/versions.json", 26 | "properties": {} 27 | }, 28 | "graphql": { 29 | "versions": "https://neo4j-graphql.github.io/neo4j-graphql/versions.json", 30 | "properties": { 31 | "dbms.unmanaged_extension_classes": "org.neo4j.graphql=/graphql", 32 | "dbms.security.procedures.unrestricted": "graphql.*" 33 | } 34 | }, 35 | "graph-algorithms": { 36 | "versions": "https://neo4j-contrib.github.io/neo4j-graph-algorithms/versions.json", 37 | "properties": { 38 | "dbms.security.procedures.unrestricted": "algo.*" 39 | } 40 | }, 41 | "graph-data-science": { 42 | "versions": "https://graphdatascience.ninja/versions.json", 43 | "location": "/var/lib/neo4j/products/neo4j-graph-data-science-*.jar", 44 | "properties": { 45 | "dbms.security.procedures.unrestricted": "gds.*" 46 | } 47 | }, 48 | "n10s": { 49 | "versions": "https://neo4j-labs.github.io/neosemantics/versions.json", 50 | "properties": { 51 | "dbms.security.procedures.unrestricted":"semantics.*" 52 | } 53 | }, 54 | "_testing": { 55 | "versions": "http://host.testcontainers.internal:3000/versions.json", 56 | "properties": { 57 | "dbms.security.procedures.unrestricted": "com.neo4j.docker.neo4jserver.plugins.*" 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /docker-image-src/4.2/coredb/neo4j-plugins.json: -------------------------------------------------------------------------------- 1 | { 2 | "apoc": { 3 | "versions": "https://neo4j-contrib.github.io/neo4j-apoc-procedures/versions.json", 4 | "properties": { 5 | "dbms.security.procedures.unrestricted": "apoc.*" 6 | } 7 | }, 8 | "apoc-core": { 9 | "location": "/var/lib/neo4j/labs/apoc-*-core.jar", 10 | "versions": "https://neo4j-contrib.github.io/neo4j-apoc-procedures/versions.json", 11 | "properties": { 12 | "dbms.security.procedures.unrestricted": "apoc.*" 13 | } 14 | }, 15 | "bloom": { 16 | "location": "/var/lib/neo4j/products/bloom-plugin-*.jar", 17 | "versions": "https://bloom-plugins.s3.eu-west-2.amazonaws.com/versions.json", 18 | "properties": { 19 | "dbms.unmanaged_extension_classes": "com.neo4j.bloom.server=/browser/bloom", 20 | "dbms.security.procedures.unrestricted": "bloom.*", 21 | "neo4j.bloom.license_file": "/licenses/bloom.license" 22 | } 23 | }, 24 | "streams": { 25 | "versions": "https://neo4j-contrib.github.io/neo4j-streams/versions.json", 26 | "properties": {} 27 | }, 28 | "graphql": { 29 | "versions": "https://neo4j-graphql.github.io/neo4j-graphql/versions.json", 30 | "properties": { 31 | "dbms.unmanaged_extension_classes": "org.neo4j.graphql=/graphql", 32 | "dbms.security.procedures.unrestricted": "graphql.*" 33 | } 34 | }, 35 | "graph-algorithms": { 36 | "versions": "https://neo4j-contrib.github.io/neo4j-graph-algorithms/versions.json", 37 | "properties": { 38 | "dbms.security.procedures.unrestricted": "algo.*" 39 | } 40 | }, 41 | "graph-data-science": { 42 | "versions": "https://graphdatascience.ninja/versions.json", 43 | "location": "/var/lib/neo4j/products/neo4j-graph-data-science-*.jar", 44 | "properties": { 45 | "dbms.security.procedures.unrestricted": "gds.*" 46 | } 47 | }, 48 | "n10s": { 49 | "versions": "https://neo4j-labs.github.io/neosemantics/versions.json", 50 | "properties": { 51 | "dbms.security.procedures.unrestricted":"semantics.*" 52 | } 53 | }, 54 | "_testing": { 55 | "versions": "http://host.testcontainers.internal:3000/versions.json", 56 | "properties": { 57 | "dbms.security.procedures.unrestricted": "com.neo4j.docker.neo4jserver.plugins.*" 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /docker-image-src/4.3/coredb/neo4j-plugins.json: -------------------------------------------------------------------------------- 1 | { 2 | "apoc": { 3 | "versions": "https://neo4j-contrib.github.io/neo4j-apoc-procedures/versions.json", 4 | "properties": { 5 | "dbms.security.procedures.unrestricted": "apoc.*" 6 | } 7 | }, 8 | "apoc-core": { 9 | "location": "/var/lib/neo4j/labs/apoc-*-core.jar", 10 | "versions": "https://neo4j-contrib.github.io/neo4j-apoc-procedures/versions.json", 11 | "properties": { 12 | "dbms.security.procedures.unrestricted": "apoc.*" 13 | } 14 | }, 15 | "bloom": { 16 | "location": "/var/lib/neo4j/products/bloom-plugin-*.jar", 17 | "versions": "https://bloom-plugins.s3.eu-west-2.amazonaws.com/versions.json", 18 | "properties": { 19 | "dbms.unmanaged_extension_classes": "com.neo4j.bloom.server=/browser/bloom", 20 | "dbms.security.procedures.unrestricted": "bloom.*", 21 | "neo4j.bloom.license_file": "/licenses/bloom.license" 22 | } 23 | }, 24 | "streams": { 25 | "versions": "https://neo4j-contrib.github.io/neo4j-streams/versions.json", 26 | "properties": {} 27 | }, 28 | "graphql": { 29 | "versions": "https://neo4j-graphql.github.io/neo4j-graphql/versions.json", 30 | "properties": { 31 | "dbms.unmanaged_extension_classes": "org.neo4j.graphql=/graphql", 32 | "dbms.security.procedures.unrestricted": "graphql.*" 33 | } 34 | }, 35 | "graph-algorithms": { 36 | "versions": "https://neo4j-contrib.github.io/neo4j-graph-algorithms/versions.json", 37 | "properties": { 38 | "dbms.security.procedures.unrestricted": "algo.*" 39 | } 40 | }, 41 | "graph-data-science": { 42 | "versions": "https://graphdatascience.ninja/versions.json", 43 | "location": "/var/lib/neo4j/products/neo4j-graph-data-science-*.jar", 44 | "properties": { 45 | "dbms.security.procedures.unrestricted": "gds.*" 46 | } 47 | }, 48 | "n10s": { 49 | "versions": "https://neo4j-labs.github.io/neosemantics/versions.json", 50 | "properties": { 51 | "dbms.security.procedures.unrestricted":"semantics.*" 52 | } 53 | }, 54 | "_testing": { 55 | "versions": "http://host.testcontainers.internal:3000/versions.json", 56 | "properties": { 57 | "dbms.security.procedures.unrestricted": "com.neo4j.docker.neo4jserver.plugins.*" 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /generate-stub-plugin/ExampleNeo4jPlugin.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.test.myplugin; 2 | 3 | import java.util.stream.Stream; 4 | 5 | import org.neo4j.graphdb.GraphDatabaseService; 6 | import org.neo4j.logging.Log; 7 | import org.neo4j.procedure.Context; 8 | import org.neo4j.procedure.Name; 9 | import org.neo4j.procedure.Procedure; 10 | 11 | /* 12 | This class is a basic Neo4J plugin that defines a procedure which can be called via Cypher. 13 | */ 14 | public class ExampleNeo4jPlugin 15 | { 16 | // Output data class containing primitive types 17 | public static class PrimitiveOutput 18 | { 19 | public String string; 20 | public long integer; 21 | public double aFloat; 22 | public boolean aBoolean; 23 | 24 | public PrimitiveOutput( String string, long integer, double aFloat, boolean aBoolean ) 25 | { 26 | this.string = string; 27 | this.integer = integer; 28 | this.aFloat = aFloat; 29 | this.aBoolean = aBoolean; 30 | } 31 | } 32 | // @ServiceProvider 33 | // public static class ExampleConfigurationSetting implements SettingsDeclaration 34 | // { 35 | // public static final String CONF_NAME = "com.neo4j.docker.neo4jserver.plugins.loaded_verison"; 36 | // 37 | // @Description("Unique setting to identify which semver field was matched") 38 | // public static final Setting loadedVersionValue = SettingImpl.newBuilder( 39 | // CONF_NAME, 40 | // SettingValueParsers.STRING, 41 | // "unset" 42 | // ).build(); 43 | // } 44 | 45 | @Context 46 | public GraphDatabaseService db; 47 | 48 | @Context 49 | public Log log; 50 | 51 | // A Neo4j procedure that always returns fixed values 52 | @Procedure 53 | public Stream defaultValues( @Name( value = "string", defaultValue = "a string" ) String string, 54 | @Name( value = "integer", defaultValue = "42" ) long integer, 55 | @Name( value = "float", defaultValue = "3.14" ) double aFloat, 56 | @Name( value = "boolean", defaultValue = "true" ) boolean aBoolean ) 57 | { 58 | return Stream.of( new PrimitiveOutput( string, integer, aFloat, aBoolean ) ); 59 | } 60 | } -------------------------------------------------------------------------------- /src/test/resources/ha-cluster-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2.1' 2 | 3 | networks: 4 | lan: 5 | 6 | services: 7 | 8 | master: 9 | user: "%%USERIDGROUPID%%" 10 | image: "%%IMAGE%%" 11 | volumes: 12 | - "%%LOGS_DIR%%/master:/logs" 13 | networks: 14 | - lan 15 | ports: 16 | - 7474 17 | - 7687 18 | environment: 19 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 20 | - NEO4J_dbms_memory_pagecache_size=10M 21 | - NEO4J_dbms_memory_heap_initial__size=10M 22 | - NEO4J_AUTH=neo4j/neo 23 | - NEO4J_ha_serverId=1 24 | - NEO4J_dbms_mode=HA 25 | - NEO4J_ha_initialHosts=master:5001,slave1:5555,slave2:5001 26 | 27 | # Use this to make sure master pushes TXs to both slaves, by default it will be only one 28 | # - NEO4J_ha_tx__push__factor=2 29 | 30 | slave1: 31 | user: "%%USERIDGROUPID%%" 32 | image: "%%IMAGE%%" 33 | volumes: 34 | - "%%LOGS_DIR%%/slave1:/logs" 35 | networks: 36 | - lan 37 | ports: 38 | - 7474 39 | - 7687 40 | environment: 41 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 42 | - NEO4J_dbms_memory_pagecache_size=10M 43 | - NEO4J_dbms_memory_heap_initial__size=10M 44 | - NEO4J_AUTH=neo4j/neo 45 | - NEO4J_dbms_mode=HA 46 | - NEO4J_ha_serverId=2 47 | - NEO4J_ha_initialHosts=master:5001,slave1:5555,slave2:5001 48 | - NEO4J_ha_host_coordination=slave1:5555 49 | - NEO4J_ha_host_data=slave1:6666 50 | - NEO4J_ha_slave__only=true 51 | - NEO4J_ha_pull__interval=5s # Default value is disabled but we want slave to poll master for test 52 | 53 | slave2: 54 | user: "%%USERIDGROUPID%%" 55 | image: "%%IMAGE%%" 56 | volumes: 57 | - "%%LOGS_DIR%%/slave2:/logs" 58 | networks: 59 | - lan 60 | ports: 61 | - 7474 62 | - 7687 63 | environment: 64 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 65 | - NEO4J_dbms_memory_pagecache_size=10M 66 | - NEO4J_dbms_memory_heap_initial__size=10M 67 | - NEO4J_AUTH=neo4j/neo 68 | - NEO4J_dbms_mode=HA 69 | - NEO4J_ha_serverId=3 70 | - NEO4J_ha_initialHosts=master:5001,slave1:5555,slave2:5001 71 | - NEO4J_ha_host_coordination=slave2:5001 72 | - NEO4J_ha_host_data=slave2:6001 73 | - NEO4J_ha_slave__only=true 74 | - NEO4J_ha_pull__interval=5s # Default value is disabled but we want slave to poll master for test 75 | -------------------------------------------------------------------------------- /docker-image-src/4.4/coredb/Dockerfile-bullseye: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:11 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" \ 9 | LANG=C.UTF-8 10 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 11 | 12 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 13 | 14 | COPY ./local-package/* /startup/ 15 | 16 | RUN apt-get update \ 17 | && apt-get install --no-install-recommends -o Acquire::Retries=10 -y \ 18 | curl ca-certificates gcc libc-dev git jq make procps tini wget \ 19 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 20 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 21 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 22 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 23 | && rm ${NEO4J_TARBALL} \ 24 | && mv /startup/neo4j-admin-report.sh "${NEO4J_HOME}"/bin/neo4j-admin-report \ 25 | && mv "${NEO4J_HOME}"/data /data \ 26 | && mv "${NEO4J_HOME}"/logs /logs \ 27 | && chown -R neo4j:neo4j /data \ 28 | && chmod -R 777 /data \ 29 | && chown -R neo4j:neo4j /logs \ 30 | && chmod -R 777 /logs \ 31 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 32 | && chmod -R 777 "${NEO4J_HOME}" \ 33 | && chmod -R 755 "${NEO4J_HOME}/bin" \ 34 | && ln -s /data "${NEO4J_HOME}"/data \ 35 | && ln -s /logs "${NEO4J_HOME}"/logs \ 36 | && ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh \ 37 | && git clone https://github.com/ncopa/su-exec.git \ 38 | && cd su-exec \ 39 | && git checkout 4c3bb42b093f14da70d8ab924b487ccfbb1397af \ 40 | && echo d6c40440609a23483f12eb6295b5191e94baf08298a856bab6e15b10c3b82891 su-exec.c | sha256sum -c \ 41 | && echo 2a87af245eb125aca9305a0b1025525ac80825590800f047419dc57bba36b334 Makefile | sha256sum -c \ 42 | && make \ 43 | && mv /su-exec/su-exec /usr/bin/su-exec \ 44 | && apt-get -y purge --auto-remove curl gcc git make libc-dev \ 45 | && rm -rf /var/lib/apt/lists/* /su-exec 46 | 47 | 48 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 49 | 50 | WORKDIR "${NEO4J_HOME}" 51 | 52 | VOLUME /data /logs 53 | 54 | EXPOSE 7474 7473 7687 55 | 56 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 57 | CMD ["neo4j"] 58 | -------------------------------------------------------------------------------- /docker-image-src/5/coredb/Dockerfile-bullseye: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:17 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" \ 9 | LANG=C.UTF-8 10 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 11 | 12 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 13 | 14 | COPY ./local-package/* /startup/ 15 | 16 | RUN apt-get update \ 17 | && apt-get install --no-install-recommends -o Acquire::Retries=10 -y \ 18 | curl ca-certificates gcc libc-dev git jq make procps tini wget \ 19 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 20 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 21 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 22 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 23 | && rm ${NEO4J_TARBALL} \ 24 | && sed -i 's/Package Type:.*/Package Type: docker bullseye/' $NEO4J_HOME/packaging_info \ 25 | && mv /startup/neo4j-admin-report.sh "${NEO4J_HOME}"/bin/neo4j-admin-report \ 26 | && mv "${NEO4J_HOME}"/data /data \ 27 | && mv "${NEO4J_HOME}"/logs /logs \ 28 | && chown -R neo4j:neo4j /data \ 29 | && chmod -R 777 /data \ 30 | && chown -R neo4j:neo4j /logs \ 31 | && chmod -R 777 /logs \ 32 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 33 | && chmod -R 777 "${NEO4J_HOME}" \ 34 | && chmod -R 755 "${NEO4J_HOME}/bin" \ 35 | && ln -s /data "${NEO4J_HOME}"/data \ 36 | && ln -s /logs "${NEO4J_HOME}"/logs \ 37 | && git clone https://github.com/ncopa/su-exec.git \ 38 | && cd su-exec \ 39 | && git checkout 4c3bb42b093f14da70d8ab924b487ccfbb1397af \ 40 | && echo d6c40440609a23483f12eb6295b5191e94baf08298a856bab6e15b10c3b82891 su-exec.c | sha256sum -c \ 41 | && echo 2a87af245eb125aca9305a0b1025525ac80825590800f047419dc57bba36b334 Makefile | sha256sum -c \ 42 | && make \ 43 | && mv /su-exec/su-exec /usr/bin/su-exec \ 44 | && apt-get -y purge --auto-remove curl gcc git make libc-dev \ 45 | && rm -rf /var/lib/apt/lists/* /su-exec 46 | 47 | 48 | ENV PATH="${NEO4J_HOME}"/bin:$PATH 49 | 50 | WORKDIR "${NEO4J_HOME}" 51 | 52 | VOLUME /data /logs 53 | 54 | EXPOSE 7474 7473 7687 55 | 56 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 57 | CMD ["neo4j"] 58 | -------------------------------------------------------------------------------- /docker-image-src/calver/coredb/Dockerfile-bullseye: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye-slim 2 | ENV JAVA_HOME=/opt/java/openjdk 3 | COPY --from=eclipse-temurin:21 $JAVA_HOME $JAVA_HOME 4 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 5 | NEO4J_SHA256=%%NEO4J_SHA%% \ 6 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 7 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 8 | NEO4J_HOME="/var/lib/neo4j" \ 9 | LANG=C.UTF-8 10 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 11 | 12 | RUN addgroup --gid 7474 --system neo4j && adduser --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --ingroup neo4j neo4j 13 | 14 | COPY ./local-package/* /startup/ 15 | 16 | RUN apt-get update \ 17 | && apt-get install --no-install-recommends -o Acquire::Retries=10 -y \ 18 | curl ca-certificates gcc libc-dev git jq make procps tini wget \ 19 | && curl --fail --silent --show-error --location --remote-name ${NEO4J_URI} \ 20 | && echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet \ 21 | && tar --extract --file ${NEO4J_TARBALL} --directory /var/lib \ 22 | && mv /var/lib/neo4j-* "${NEO4J_HOME}" \ 23 | && rm ${NEO4J_TARBALL} \ 24 | && sed -i 's/Package Type:.*/Package Type: docker bullseye/' $NEO4J_HOME/packaging_info \ 25 | && mv /startup/neo4j-admin-report.sh "${NEO4J_HOME}"/bin/neo4j-admin-report \ 26 | && mv "${NEO4J_HOME}"/data /data \ 27 | && mv "${NEO4J_HOME}"/logs /logs \ 28 | && chown -R neo4j:neo4j /data \ 29 | && chmod -R 777 /data \ 30 | && chown -R neo4j:neo4j /logs \ 31 | && chmod -R 777 /logs \ 32 | && chown -R neo4j:neo4j "${NEO4J_HOME}" \ 33 | && chmod -R 777 "${NEO4J_HOME}" \ 34 | && chmod -R 755 "${NEO4J_HOME}/bin" \ 35 | && ln -s /data "${NEO4J_HOME}"/data \ 36 | && ln -s /logs "${NEO4J_HOME}"/logs \ 37 | && git clone https://github.com/ncopa/su-exec.git \ 38 | && cd su-exec \ 39 | && git checkout 4c3bb42b093f14da70d8ab924b487ccfbb1397af \ 40 | && echo d6c40440609a23483f12eb6295b5191e94baf08298a856bab6e15b10c3b82891 su-exec.c | sha256sum -c \ 41 | && echo 2a87af245eb125aca9305a0b1025525ac80825590800f047419dc57bba36b334 Makefile | sha256sum -c \ 42 | && make \ 43 | && mv /su-exec/su-exec /usr/bin/su-exec \ 44 | && apt-get -y purge --auto-remove curl gcc git make libc-dev \ 45 | && rm -rf /var/lib/apt/lists/* /su-exec 46 | 47 | 48 | ENV PATH="${NEO4J_HOME}"/bin:$PATH 49 | 50 | WORKDIR "${NEO4J_HOME}" 51 | 52 | VOLUME /data /logs 53 | 54 | EXPOSE 7474 7473 7687 55 | 56 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 57 | CMD ["neo4j"] 58 | -------------------------------------------------------------------------------- /docker-image-src/4.4/coredb/neo4j-plugins.json: -------------------------------------------------------------------------------- 1 | { 2 | "apoc": { 3 | "versions": "https://neo4j-contrib.github.io/neo4j-apoc-procedures/versions.json", 4 | "properties": { 5 | "dbms.security.procedures.unrestricted": "apoc.*" 6 | } 7 | }, 8 | "apoc-core": { 9 | "location": "/var/lib/neo4j/labs/apoc-*-core.jar", 10 | "versions": "https://raw.githubusercontent.com/neo4j-contrib/neo4j-apoc-procedures/refs/heads/master/versions.json", 11 | "properties": { 12 | "dbms.security.procedures.unrestricted": "apoc.*" 13 | } 14 | }, 15 | "bloom": { 16 | "location": "/var/lib/neo4j/products/bloom-plugin-*.jar", 17 | "versions": "https://bloom-plugins.s3.eu-west-2.amazonaws.com/versions.json", 18 | "properties": { 19 | "dbms.unmanaged_extension_classes": "com.neo4j.bloom.server=/browser/bloom", 20 | "dbms.security.procedures.unrestricted": "bloom.*", 21 | "neo4j.bloom.license_file": "/licenses/bloom.license" 22 | } 23 | }, 24 | "streams": { 25 | "versions": "https://neo4j-contrib.github.io/neo4j-streams/versions.json", 26 | "properties": {} 27 | }, 28 | "graphql": { 29 | "versions": "https://neo4j-graphql.github.io/neo4j-graphql/versions.json", 30 | "properties": { 31 | "dbms.unmanaged_extension_classes": "org.neo4j.graphql=/graphql", 32 | "dbms.security.procedures.unrestricted": "graphql.*" 33 | } 34 | }, 35 | "graph-algorithms": { 36 | "versions": "https://neo4j-contrib.github.io/neo4j-graph-algorithms/versions.json", 37 | "properties": { 38 | "dbms.security.procedures.unrestricted": "algo.*" 39 | } 40 | }, 41 | "graph-data-science": { 42 | "versions": "https://graphdatascience.ninja/versions.json", 43 | "location": "/var/lib/neo4j/products/neo4j-graph-data-science-*.jar", 44 | "properties": { 45 | "dbms.security.procedures.unrestricted": "gds.*" 46 | } 47 | }, 48 | "n10s": { 49 | "versions": "https://neo4j-labs.github.io/neosemantics/versions.json", 50 | "properties": { 51 | "dbms.security.procedures.unrestricted":"semantics.*" 52 | } 53 | }, 54 | "fleet-management": { 55 | "location": "/var/lib/neo4j/products/neo4j-fleet-management-*.jar", 56 | "properties": { 57 | "dbms.security.procedures.unrestricted": "fleetManagement.*", 58 | "dbms.security.procedures.allowlist": "fleetManagement.*" 59 | } 60 | }, 61 | "_testing": { 62 | "versions": "http://host.testcontainers.internal:3000/versions.json", 63 | "properties": { 64 | "dbms.security.procedures.unrestricted": "com.neo4j.docker.neo4jserver.plugins.*" 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /devenv: -------------------------------------------------------------------------------- 1 | # -*- mode: shell-script -*- 2 | 3 | PATH="./build:${PATH}" 4 | 5 | # MacOS specific checks 6 | if [ "$(uname)" == "Darwin" ] ; then 7 | 8 | # We use temporary directories during testing that need to be 9 | # accessible to the Docker daemon. By default on Macs, $TMPDIR 10 | # (which mktemp responds to) is set to a user-specific location that 11 | # the Docker daemon cannot read from. 12 | # 13 | # In some environments, such as TeamCity, $TMPDIR is intentionally 14 | # pointed elsewhere, so we only want to override the default 15 | # value. (We don't currently run these builds on Macs, but you never 16 | # know.) This default seems to be in /private/var/folders on some 17 | # Macs and /var/folders on others, so we accommodate both. 18 | if [[ "${TMPDIR}" == */var/folders* ]]; then 19 | export TMPDIR=/tmp 20 | fi 21 | 22 | echo "Setting PATH with MacOS specific locations" 23 | export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" 24 | export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH" 25 | export PATH="/usr/local/opt/make/libexec/gnubin:$PATH" 26 | 27 | if ! grep --version 2>/dev/null | grep -q "GNU grep" ; then 28 | cat >&2 </dev/null | grep -q "GNU sed" ; then 37 | cat >&2 </dev/null | grep -q "GNU coreutils" ; then 46 | cat >&2 </dev/null 2>/dev/null || cat >&2 </dev/null; then 65 | if which apt-get >/dev/null; then 66 | sudo apt-get install make 67 | else 68 | echo "Please install GNU Make 4.0 or later" 69 | fi 70 | fi 71 | 72 | if [[ -f devenv.local ]]; then 73 | source devenv.local 74 | # to be consistent with the rest of neo4j we should use NEO4JVERSION exclusively but unfortunately both with and without underscore are used in this repo 75 | export NEO4JVERSION 76 | NEO4J_VERSION="${NEO4JVERSION}" 77 | export NEO4J_VERSION 78 | else 79 | echo >&2 "Error: cannot find devenv.local" 80 | fi 81 | -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/neo4jadmin/TestAdminBasic.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.neo4jadmin; 2 | 3 | import com.neo4j.docker.utils.WaitStrategies; 4 | import com.neo4j.docker.utils.TestSettings; 5 | import org.junit.jupiter.api.Assertions; 6 | import org.junit.jupiter.api.Assumptions; 7 | import org.junit.jupiter.api.Test; 8 | import org.slf4j.Logger; 9 | import org.slf4j.LoggerFactory; 10 | import org.testcontainers.containers.ContainerLaunchException; 11 | import org.testcontainers.containers.GenericContainer; 12 | import org.testcontainers.containers.output.Slf4jLogConsumer; 13 | 14 | import java.time.Duration; 15 | 16 | public class TestAdminBasic 17 | { 18 | private final Logger log = LoggerFactory.getLogger( TestAdminBasic.class ); 19 | 20 | @Test 21 | void testCannotRunNeo4j() 22 | { 23 | GenericContainer admin = new GenericContainer( TestSettings.ADMIN_IMAGE_ID ); 24 | admin.withEnv( "NEO4J_ACCEPT_LICENSE_AGREEMENT", "yes" ) 25 | .withExposedPorts( 7474, 7687 ) 26 | .withLogConsumer( new Slf4jLogConsumer( log ) ) 27 | .withCommand( "neo4j", "console" ); 28 | WaitStrategies.waitUntilContainerFinished( admin, Duration.ofSeconds( 30) ); 29 | 30 | Assertions.assertThrows( ContainerLaunchException.class, admin::start ); 31 | admin.stop(); 32 | } 33 | @Test 34 | void testLicenseAcceptanceRequired_Neo4jAdmin() 35 | { 36 | Assumptions.assumeTrue( TestSettings.EDITION == TestSettings.Edition.ENTERPRISE, 37 | "No license checks for community edition"); 38 | 39 | String logsOut; 40 | try(GenericContainer container = new GenericContainer( TestSettings.ADMIN_IMAGE_ID ) 41 | .withLogConsumer( new Slf4jLogConsumer( log ) ) ) 42 | { 43 | WaitStrategies.waitUntilContainerFinished( container, Duration.ofSeconds( 30) ); 44 | // container start should fail due to licensing. 45 | Assertions.assertThrows( ContainerLaunchException.class, container::start, 46 | "Neo4j did not notify about accepting the license agreement" ); 47 | logsOut = container.getLogs(); 48 | } 49 | // double check the container didn't warn and start neo4j anyway 50 | Assertions.assertTrue( logsOut.contains( "must accept the license" ), 51 | "Neo4j did not notify about accepting the license agreement" ); 52 | Assertions.assertFalse( logsOut.contains( "Remote interface available" ), 53 | "Neo4j was started even though the license was not accepted" ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/utils/WaitStrategies.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.utils; 2 | 3 | import com.github.dockerjava.api.command.InspectContainerResponse; 4 | import org.rnorth.ducttape.unreliables.Unreliables; 5 | import org.testcontainers.containers.GenericContainer; 6 | import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; 7 | import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy; 8 | import org.testcontainers.containers.wait.strategy.Wait; 9 | import org.testcontainers.containers.wait.strategy.WaitStrategy; 10 | import org.testcontainers.utility.DockerStatus; 11 | 12 | import java.time.Duration; 13 | import java.util.concurrent.Callable; 14 | import java.util.concurrent.TimeUnit; 15 | 16 | public class WaitStrategies 17 | { 18 | 19 | private final static Duration STARTUP_TIMEOUT_SECONDS = Duration.ofSeconds(180); 20 | 21 | private WaitStrategies() {} 22 | 23 | public static WaitStrategy waitForNeo4jReady( String username, String password, String database, Duration timeout ) 24 | { 25 | if (TestSettings.EDITION == TestSettings.Edition.ENTERPRISE && 26 | TestSettings.NEO4J_VERSION.isAtLeastVersion(Neo4jVersion.NEO4J_VERSION_500)) { 27 | return Wait.forHttp("/db/" + database + "/cluster/available") 28 | .withBasicCredentials(username, password) 29 | .forPort(7474) 30 | .forStatusCode(200) 31 | .withStartupTimeout(timeout); 32 | } else 33 | { 34 | return waitForBoltReady(); 35 | } 36 | } 37 | 38 | public static WaitStrategy waitForNeo4jReady( String password ) { 39 | return waitForNeo4jReady( "neo4j", password, "neo4j", STARTUP_TIMEOUT_SECONDS); 40 | } 41 | 42 | public static WaitStrategy waitForBoltReady() 43 | { 44 | return Wait.forHttp("/") 45 | .forPort(7687) 46 | .forStatusCode(200) 47 | .withStartupTimeout(STARTUP_TIMEOUT_SECONDS); 48 | } 49 | 50 | /**For containers that will just run a command and exit automatically. 51 | * With this wait strategy, starting a container will block until the container has closed itself. 52 | * The container could have succeeded or failed, we just wait for it to close. 53 | * If the container fails to start, it will still throw an exception, this just prevents us from having to wait the full timeout. 54 | * @param container the container to set the wait strategy on 55 | * @param timeout how long to wait 56 | * @return container in the modified state. 57 | * */ 58 | public static GenericContainer waitUntilContainerFinished( GenericContainer container, Duration timeout) 59 | { 60 | container.setStartupCheckStrategy( new OneShotStartupCheckStrategy().withTimeout( timeout ) ); 61 | container.setWaitStrategy( new AbstractWaitStrategy() 62 | { 63 | @Override 64 | protected void waitUntilReady() 65 | { 66 | Callable isFinished = () -> { 67 | InspectContainerResponse.ContainerState x = waitStrategyTarget.getCurrentContainerInfo().getState(); 68 | return DockerStatus.isContainerStopped( x ); 69 | }; 70 | Unreliables.retryUntilTrue( (int)timeout.getSeconds(), TimeUnit.SECONDS, isFinished ); 71 | } 72 | }); 73 | return container; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/utils/TestSettings.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.utils; 2 | 3 | import org.junit.jupiter.api.Assertions; 4 | import org.testcontainers.utility.DockerImageName; 5 | 6 | import java.nio.file.Path; 7 | import java.nio.file.Paths; 8 | 9 | public class TestSettings 10 | { 11 | public static final Neo4jVersion NEO4J_VERSION = getVersion(); 12 | public static final DockerImageName IMAGE_ID = getImage(); 13 | public static final DockerImageName ADMIN_IMAGE_ID = getNeo4jAdminImage(); 14 | public static final Path TEST_TMP_FOLDER = Paths.get("local-mounts" ); 15 | public static final Edition EDITION = getEdition(); 16 | public static final BaseOS BASE_OS = getBaseOS(); 17 | public static final boolean SKIP_MOUNTED_FOLDER_TARBALLING = getSkipTarballingFromEnv(); 18 | 19 | public enum Edition 20 | { 21 | COMMUNITY, 22 | ENTERPRISE; 23 | } 24 | public enum BaseOS 25 | { 26 | BULLSEYE, 27 | UBI9, 28 | UBI8; 29 | } 30 | 31 | private static String getValueFromPropertyOrEnv(String propertyName, String envName) 32 | { 33 | String verStr = System.getProperty( propertyName ); 34 | if(verStr == null) 35 | { 36 | verStr = System.getenv( envName ); 37 | } 38 | Assertions.assertNotNull( String.format( "Neo4j %s has not been specified. " + 39 | "Either use mvn argument -D%s or set env %s", 40 | propertyName, propertyName, envName), 41 | verStr); 42 | return verStr; 43 | } 44 | 45 | private static Neo4jVersion getVersion() 46 | { 47 | return Neo4jVersion.fromVersionString( getValueFromPropertyOrEnv( "version", "NEO4JVERSION" )); 48 | } 49 | 50 | private static DockerImageName getImage() 51 | { 52 | return DockerImageName.parse(getValueFromPropertyOrEnv("image", "NEO4J_IMAGE")); 53 | } 54 | 55 | private static DockerImageName getNeo4jAdminImage() 56 | { 57 | return DockerImageName.parse(getValueFromPropertyOrEnv("adminimage", "NEO4JADMIN_IMAGE")); 58 | } 59 | 60 | private static Edition getEdition() 61 | { 62 | String edition = getValueFromPropertyOrEnv("edition", "NEO4J_EDITION"); 63 | switch ( edition.toLowerCase() ) 64 | { 65 | case "community": 66 | return Edition.COMMUNITY; 67 | case "enterprise": 68 | return Edition.ENTERPRISE; 69 | default: 70 | Assertions.fail( edition + " is not a valid Neo4j edition. Options are \"community\" or \"enterprise\"." ); 71 | } 72 | return null; 73 | } 74 | 75 | private static BaseOS getBaseOS() 76 | { 77 | String os = getValueFromPropertyOrEnv("baseos", "BASE_OS"); 78 | switch ( os.toLowerCase() ) 79 | { 80 | case "debian", "bullseye": 81 | return BaseOS.BULLSEYE; 82 | case "ubi9": 83 | return BaseOS.UBI9; 84 | default: 85 | Assertions.fail( os + " is not a valid Neo4j base operating system. Options are \"debian\", \"bullseye\" or \"ubi9\"." ); 86 | } 87 | return null; 88 | } 89 | 90 | private static boolean getSkipTarballingFromEnv() 91 | { 92 | // defaults to false. Tarballing test artifacts must be opt-out not opt-in. 93 | String skipTar = System.getenv( "NEO4J_SKIP_MOUNTED_FOLDER_TARBALLING" ); 94 | if(skipTar == null) return false; 95 | else return (skipTar.equals( "true" )); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /docker-image-src/5/coredb/Dockerfile-ubi8: -------------------------------------------------------------------------------- 1 | FROM redhat/ubi8-minimal:latest 2 | ENV JAVA_HOME=/usr 3 | 4 | # gather pre-requisite packages 5 | RUN set -eux; \ 6 | arch="$(uname -m)"; \ 7 | case "${arch}" in \ 8 | 'x86_64') \ 9 | tiniurl="https://github.com/krallin/tini/releases/download/v0.19.0/tini"; \ 10 | tinisha="93dcc18adc78c65a028a84799ecf8ad40c936fdfc5f2a57b1acda5a8117fa82c"; \ 11 | ;; \ 12 | 'aarch64') \ 13 | tiniurl="https://github.com/krallin/tini/releases/download/v0.19.0/tini-arm64"; \ 14 | tinisha="07952557df20bfd2a95f9bef198b445e006171969499a1d361bd9e6f8e5e0e81"; \ 15 | ;; \ 16 | *) echo >&2 "Neo4j does not currently have a docker image for architecture $arch"; exit 1 ;; \ 17 | esac; \ 18 | microdnf install -y dnf; \ 19 | dnf install -y \ 20 | findutils \ 21 | gcc \ 22 | git \ 23 | gzip \ 24 | hostname \ 25 | java-17 \ 26 | jq \ 27 | make \ 28 | procps \ 29 | shadow-utils \ 30 | tar \ 31 | wget \ 32 | which; \ 33 | wget -q ${tiniurl} -O /usr/bin/tini; \ 34 | wget -q ${tiniurl}.asc -O tini.asc; \ 35 | echo "${tinisha}" /usr/bin/tini | sha256sum -c --strict --quiet; \ 36 | chmod a+x /usr/bin/tini; \ 37 | export GNUPGHOME="$(mktemp -d)"; \ 38 | gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys \ 39 | 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 \ 40 | B42F6819007F00F88E364FD4036A9C25BF357DD4; \ 41 | gpg --batch --verify tini.asc /usr/bin/tini; \ 42 | git clone https://github.com/ncopa/su-exec.git; \ 43 | cd su-exec; \ 44 | git checkout 4c3bb42b093f14da70d8ab924b487ccfbb1397af; \ 45 | echo d6c40440609a23483f12eb6295b5191e94baf08298a856bab6e15b10c3b82891 su-exec.c | sha256sum -c; \ 46 | echo 2a87af245eb125aca9305a0b1025525ac80825590800f047419dc57bba36b334 Makefile | sha256sum -c; \ 47 | make; \ 48 | mv /su-exec/su-exec /usr/bin/su-exec; \ 49 | gpgconf --kill all; \ 50 | rm -rf "$GNUPGHOME" tini.asc /su-exec; \ 51 | dnf remove -y gcc git make; \ 52 | dnf autoremove; \ 53 | dnf clean all 54 | 55 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 56 | NEO4J_SHA256=%%NEO4J_SHA%% \ 57 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 58 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 59 | NEO4J_HOME="/var/lib/neo4j" 60 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 61 | 62 | COPY ./local-package/* /startup/ 63 | 64 | RUN set -eux; \ 65 | groupadd --gid 7474 --system neo4j && useradd --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --gid neo4j neo4j; \ 66 | curl --fail --silent --show-error --location --remote-name ${NEO4J_URI}; \ 67 | echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet; \ 68 | tar --extract --file ${NEO4J_TARBALL} --directory /var/lib; \ 69 | mv /var/lib/neo4j-* "${NEO4J_HOME}"; \ 70 | rm ${NEO4J_TARBALL}; \ 71 | sed -i 's/Package Type:.*/Package Type: docker ubi8/' $NEO4J_HOME/packaging_info; \ 72 | mv "${NEO4J_HOME}"/data /data; \ 73 | mv "${NEO4J_HOME}"/logs /logs; \ 74 | chown -R neo4j:neo4j /data; \ 75 | chmod -R 777 /data; \ 76 | chown -R neo4j:neo4j /logs; \ 77 | chmod -R 777 /logs; \ 78 | chown -R neo4j:neo4j "${NEO4J_HOME}"; \ 79 | chmod -R 777 "${NEO4J_HOME}"; \ 80 | ln -s /data "${NEO4J_HOME}"/data; \ 81 | ln -s /logs "${NEO4J_HOME}"/logs; \ 82 | mv /startup/neo4j-admin-report.sh "${NEO4J_HOME}"/bin/neo4j-admin-report 83 | 84 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 85 | 86 | WORKDIR "${NEO4J_HOME}" 87 | 88 | VOLUME /data /logs 89 | 90 | EXPOSE 7474 7473 7687 91 | 92 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 93 | CMD ["neo4j"] 94 | -------------------------------------------------------------------------------- /publish-neo4j-admin-images.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -eu -o pipefail 3 | 4 | ROOT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) 5 | source "$ROOT_DIR/build-utils-common-functions.sh" 6 | 7 | if [[ $# -eq 2 ]]; then 8 | NEO4JVERSION=${1} 9 | REPOSITORY=${2} 10 | elif [[ -z ${NEO4JVERSION:-""} ]]; then 11 | echo >&2 "NEO4JVERSION is unset. Either set it in the environment or pass as argument to this script." 12 | exit 1 13 | elif [[ -z ${REPOSITORY:-""} ]]; then 14 | echo >&2 "REPOSITORY is unset. Either set it in the environment or pass as argument to this script." 15 | exit 1 16 | fi 17 | 18 | echo "Verifying access or failing fast, by re-tagging neo4j-admin:5, when successful it's a noop." 19 | docker buildx imagetools create "${REPOSITORY}":5-community \ 20 | --tag "${REPOSITORY}:5" 21 | 22 | echo "Publishing ${REPOSITORY}:${NEO4JVERSION}" 23 | "${ROOT_DIR}/publish-neo4j-admin-image.sh" "${NEO4JVERSION}" "enterprise" "ubi9" "${REPOSITORY}" 24 | "${ROOT_DIR}/publish-neo4j-admin-image.sh" "${NEO4JVERSION}" "community" "ubi9" "${REPOSITORY}" 25 | "${ROOT_DIR}/publish-neo4j-admin-image.sh" "${NEO4JVERSION}" "enterprise" "bullseye" "${REPOSITORY}" 26 | "${ROOT_DIR}/publish-neo4j-admin-image.sh" "${NEO4JVERSION}" "community" "bullseye" "${REPOSITORY}" 27 | 28 | echo "Adding extra tags..." 29 | 30 | MAJOR=$(get_major_from_version "${NEO4JVERSION}") 31 | 32 | if [[ "$MAJOR" == "5" ]]; then 33 | echo "Tagging ${MAJOR}..." 34 | docker buildx imagetools create "${REPOSITORY}:${NEO4JVERSION}-community-bullseye" \ 35 | --tag "${REPOSITORY}:${MAJOR}-community-bullseye" \ 36 | --tag "${REPOSITORY}:${MAJOR}-community-debian" \ 37 | --tag "${REPOSITORY}:${MAJOR}-community" \ 38 | --tag "${REPOSITORY}:${MAJOR}" 39 | 40 | docker buildx imagetools create "${REPOSITORY}:${NEO4JVERSION}-enterprise-bullseye" \ 41 | --tag "${REPOSITORY}:${MAJOR}-enterprise-bullseye" \ 42 | --tag "${REPOSITORY}:${MAJOR}-enterprise-debian" \ 43 | --tag "${REPOSITORY}:${MAJOR}-enterprise" 44 | 45 | elif [[ "$MAJOR" -gt 2024 ]]; then 46 | echo "Tagging calver ${MAJOR}..." 47 | docker buildx imagetools create "${REPOSITORY}:${NEO4JVERSION}-community-bullseye" \ 48 | --tag "${REPOSITORY}:${MAJOR}-community-bullseye" \ 49 | --tag "${REPOSITORY}:${MAJOR}-community-debian" \ 50 | --tag "${REPOSITORY}:${MAJOR}-community" \ 51 | --tag "${REPOSITORY}:${MAJOR}" \ 52 | --tag "${REPOSITORY}:community-bullseye" \ 53 | --tag "${REPOSITORY}:community-debian" \ 54 | --tag "${REPOSITORY}:community" \ 55 | --tag "${REPOSITORY}:bullseye" \ 56 | --tag "${REPOSITORY}:debian" \ 57 | --tag "${REPOSITORY}:latest" 58 | 59 | docker buildx imagetools create "${REPOSITORY}:${NEO4JVERSION}-community-ubi9" \ 60 | --tag "${REPOSITORY}:${MAJOR}-community-ubi9" \ 61 | --tag "${REPOSITORY}:${MAJOR}-community-redhat" \ 62 | --tag "${REPOSITORY}:community-ubi9" \ 63 | --tag "${REPOSITORY}:community-redhat" \ 64 | --tag "${REPOSITORY}:ubi9" \ 65 | --tag "${REPOSITORY}:redhat" 66 | 67 | docker buildx imagetools create "${REPOSITORY}:${NEO4JVERSION}-enterprise-bullseye" \ 68 | --tag "${REPOSITORY}:${MAJOR}-enterprise-bullseye" \ 69 | --tag "${REPOSITORY}:${MAJOR}-enterprise-debian" \ 70 | --tag "${REPOSITORY}:${MAJOR}-enterprise" \ 71 | --tag "${REPOSITORY}:enterprise-bullseye" \ 72 | --tag "${REPOSITORY}:enterprise-debian" \ 73 | --tag "${REPOSITORY}:enterprise" 74 | 75 | docker buildx imagetools create "${REPOSITORY}:${NEO4JVERSION}-enterprise-ubi9" \ 76 | --tag "${REPOSITORY}:${MAJOR}-enterprise-ubi9" \ 77 | --tag "${REPOSITORY}:${MAJOR}-enterprise-redhat" \ 78 | --tag "${REPOSITORY}:enterprise-ubi9" \ 79 | --tag "${REPOSITORY}:enterprise-redhat" 80 | fi 81 | -------------------------------------------------------------------------------- /src/test/resources/causal-cluster-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2.1' 2 | 3 | networks: 4 | lan: 5 | 6 | services: 7 | 8 | core1: 9 | user: "%%USERIDGROUPID%%" 10 | image: "%%IMAGE%%" 11 | volumes: 12 | - "%%LOGS_DIR%%/core1:/logs" 13 | networks: 14 | - lan 15 | ports: 16 | - 7474 17 | - 7687 18 | environment: 19 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 20 | - NEO4J_dbms_memory_pagecache_size=10M 21 | - NEO4J_dbms_memory_heap_initial__size=10M 22 | - NEO4J_AUTH=neo4j/neo 23 | - NEO4J_dbms_mode=CORE 24 | - NEO4J_causalClustering_discoveryAdvertisedAddress=core1:5000 25 | - NEO4J_causalClustering_transactionAdvertisedAddress=core1:6000 26 | - NEO4J_causalClustering_raftAdvertisedAddress=core1:7000 27 | - NEO4J_causalClustering_expectedCoreClusterSize=3 28 | - NEO4J_causalClustering_initialDiscoveryMembers=core1:5000,core2:5000,core3:5000 29 | - NEO4J_causal__clustering_disable__middleware__logging=false 30 | 31 | core2: 32 | user: "%%USERIDGROUPID%%" 33 | image: "%%IMAGE%%" 34 | volumes: 35 | - "%%LOGS_DIR%%/core2:/logs" 36 | networks: 37 | - lan 38 | ports: 39 | - 7474 40 | - 7687 41 | environment: 42 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 43 | - NEO4J_dbms_memory_pagecache_size=10M 44 | - NEO4J_dbms_memory_heap_initial__size=10M 45 | - NEO4J_AUTH=neo4j/neo 46 | - NEO4J_dbms_mode=CORE 47 | - NEO4J_causalClustering_discoveryAdvertisedAddress=core2:5000 48 | - NEO4J_causalClustering_transactionAdvertisedAddress=core2:6000 49 | - NEO4J_causalClustering_raftAdvertisedAddress=core2:7000 50 | - NEO4J_causalClustering_expectedCoreClusterSize=3 51 | - NEO4J_causalClustering_initialDiscoveryMembers=core1:5000,core2:5000,core3:5000 52 | - NEO4J_causalClustering_refuseToBeLeader=true 53 | 54 | core3: 55 | user: "%%USERIDGROUPID%%" 56 | image: "%%IMAGE%%" 57 | volumes: 58 | - "%%LOGS_DIR%%/core3:/logs" 59 | - "%%LOGS_DIR%%/core3/backups:/backups" 60 | networks: 61 | - lan 62 | ports: 63 | - 6362 64 | - 7474 65 | - 7687 66 | environment: 67 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 68 | - NEO4J_dbms_memory_pagecache_size=10M 69 | - NEO4J_dbms_memory_heap_initial__size=10M 70 | - NEO4J_AUTH=neo4j/neo 71 | - NEO4J_dbms_mode=CORE 72 | - NEO4J_causalClustering_discoveryAdvertisedAddress=core3:5000 73 | - NEO4J_causalClustering_transactionAdvertisedAddress=core3:6000 74 | - NEO4J_causalClustering_raftAdvertisedAddress=core3:7000 75 | - NEO4J_causalClustering_expectedCoreClusterSize=3 76 | - NEO4J_causalClustering_initialDiscoveryMembers=core1:5000,core2:5000,core3:5000 77 | - NEO4J_causalClustering_refuseToBeLeader=true 78 | - NEO4J_dbms_backup_enabled=true 79 | - NEO4J_dbms_backup_address=0.0.0.0:6362 80 | 81 | readreplica1: 82 | user: "%%USERIDGROUPID%%" 83 | image: "%%IMAGE%%" 84 | volumes: 85 | - "%%LOGS_DIR%%/readreplica1:/logs" 86 | networks: 87 | - lan 88 | ports: 89 | - 7474 90 | - 7687 91 | environment: 92 | - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes 93 | - NEO4J_dbms_memory_pagecache_size=10M 94 | - NEO4J_dbms_memory_heap_initial__size=10M 95 | - NEO4J_AUTH=neo4j/neo 96 | - NEO4J_dbms_mode=READ_REPLICA 97 | - NEO4J_causalClustering_discoveryAdvertisedAddress=readreplica1:5000 98 | - NEO4J_causalClustering_transactionAdvertisedAddress=readreplica1:6000 99 | - NEO4J_causalClustering_raftAdvertisedAddress=readreplica1:7000 100 | - NEO4J_causalClustering_initialDiscoveryMembers=core1:5000,core2:5000,core3:5000 101 | -------------------------------------------------------------------------------- /docker-image-src/5/coredb/Dockerfile-ubi9: -------------------------------------------------------------------------------- 1 | FROM redhat/ubi9-minimal:latest 2 | 3 | # gather pre-requisite packages 4 | RUN set -eux; \ 5 | arch="$(rpm --query --queryformat='%{ARCH}' rpm)"; \ 6 | case "${arch}" in \ 7 | 'x86_64') \ 8 | tini_url="https://github.com/krallin/tini/releases/download/v0.19.0/tini"; \ 9 | tini_sha="93dcc18adc78c65a028a84799ecf8ad40c936fdfc5f2a57b1acda5a8117fa82c"; \ 10 | ;; \ 11 | 'aarch64') \ 12 | tini_url="https://github.com/krallin/tini/releases/download/v0.19.0/tini-arm64"; \ 13 | tini_sha="07952557df20bfd2a95f9bef198b445e006171969499a1d361bd9e6f8e5e0e81"; \ 14 | ;; \ 15 | *) echo >&2 "Neo4j does not currently have a docker image for architecture $arch"; exit 1 ;; \ 16 | esac; \ 17 | microdnf install -y --nodocs \ 18 | findutils \ 19 | gcc \ 20 | git \ 21 | gzip \ 22 | hostname \ 23 | java-17-openjdk-headless \ 24 | jq \ 25 | make \ 26 | procps \ 27 | shadow-utils \ 28 | tar \ 29 | wget \ 30 | which; \ 31 | # download tini and openssl 32 | wget -q ${tini_url} -O /usr/bin/tini; \ 33 | wget -q ${tini_url}.asc -O tini.asc; \ 34 | echo "${tini_sha}" /usr/bin/tini | sha256sum -c --strict --quiet; \ 35 | chmod a+x /usr/bin/tini; \ 36 | export GNUPGHOME="$(mktemp -d)"; \ 37 | gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys \ 38 | 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 \ 39 | B42F6819007F00F88E364FD4036A9C25BF357DD4; \ 40 | gpg --batch --verify tini.asc /usr/bin/tini; \ 41 | git clone https://github.com/ncopa/su-exec.git; \ 42 | cd su-exec; \ 43 | git checkout 4c3bb42b093f14da70d8ab924b487ccfbb1397af; \ 44 | echo d6c40440609a23483f12eb6295b5191e94baf08298a856bab6e15b10c3b82891 su-exec.c | sha256sum -c; \ 45 | echo 2a87af245eb125aca9305a0b1025525ac80825590800f047419dc57bba36b334 Makefile | sha256sum -c; \ 46 | make; \ 47 | mv /su-exec/su-exec /usr/bin/su-exec; \ 48 | gpgconf --kill all; \ 49 | rm -rf "$GNUPGHOME" /tini.asc /su-exec; \ 50 | microdnf remove -y git* perl* make gcc glibc-headers glibc-devel libxcrypt-devel; \ 51 | microdnf clean all 52 | 53 | ENV NEO4J_SHA256=%%NEO4J_SHA%% \ 54 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 55 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 56 | NEO4J_HOME="/var/lib/neo4j" \ 57 | LANG=C.UTF-8 58 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 59 | 60 | COPY ./local-package/* /startup/ 61 | 62 | RUN set -eux; \ 63 | groupadd --gid 7474 --system neo4j && useradd --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --gid neo4j neo4j; \ 64 | curl --fail --silent --show-error --location --remote-name ${NEO4J_URI}; \ 65 | echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet; \ 66 | tar --extract --file ${NEO4J_TARBALL} --directory /var/lib; \ 67 | mv /var/lib/neo4j-* "${NEO4J_HOME}"; \ 68 | rm ${NEO4J_TARBALL}; \ 69 | sed -i 's/Package Type:.*/Package Type: docker ubi9/' $NEO4J_HOME/packaging_info; \ 70 | mv /startup/neo4j-admin-report.sh "${NEO4J_HOME}"/bin/neo4j-admin-report; \ 71 | mv "${NEO4J_HOME}"/data /data; \ 72 | mv "${NEO4J_HOME}"/logs /logs; \ 73 | chown -R neo4j:neo4j /data; \ 74 | chmod -R 777 /data; \ 75 | chown -R neo4j:neo4j /logs; \ 76 | chmod -R 777 /logs; \ 77 | chown -R neo4j:neo4j "${NEO4J_HOME}"; \ 78 | chmod -R 777 "${NEO4J_HOME}"; \ 79 | chmod -R 755 "${NEO4J_HOME}/bin"; \ 80 | ln -s /data "${NEO4J_HOME}"/data; \ 81 | ln -s /logs "${NEO4J_HOME}"/logs 82 | 83 | ENV PATH="${NEO4J_HOME}"/bin:$PATH 84 | 85 | WORKDIR "${NEO4J_HOME}" 86 | 87 | VOLUME /data /logs 88 | 89 | EXPOSE 7474 7473 7687 90 | 91 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 92 | CMD ["neo4j"] 93 | -------------------------------------------------------------------------------- /docker-image-src/calver/coredb/Dockerfile-ubi9: -------------------------------------------------------------------------------- 1 | FROM redhat/ubi9-minimal:latest 2 | 3 | # gather pre-requisite packages 4 | RUN set -eux; \ 5 | arch="$(rpm --query --queryformat='%{ARCH}' rpm)"; \ 6 | case "${arch}" in \ 7 | 'x86_64') \ 8 | tini_url="https://github.com/krallin/tini/releases/download/v0.19.0/tini"; \ 9 | tini_sha="93dcc18adc78c65a028a84799ecf8ad40c936fdfc5f2a57b1acda5a8117fa82c"; \ 10 | ;; \ 11 | 'aarch64') \ 12 | tini_url="https://github.com/krallin/tini/releases/download/v0.19.0/tini-arm64"; \ 13 | tini_sha="07952557df20bfd2a95f9bef198b445e006171969499a1d361bd9e6f8e5e0e81"; \ 14 | ;; \ 15 | *) echo >&2 "Neo4j does not currently have a docker image for architecture $arch"; exit 1 ;; \ 16 | esac; \ 17 | microdnf install -y --nodocs \ 18 | findutils \ 19 | gcc \ 20 | git \ 21 | gzip \ 22 | hostname \ 23 | java-21-openjdk-headless \ 24 | jq \ 25 | make \ 26 | procps \ 27 | shadow-utils \ 28 | tar \ 29 | wget \ 30 | which; \ 31 | # download tini and openssl 32 | wget -q ${tini_url} -O /usr/bin/tini; \ 33 | wget -q ${tini_url}.asc -O tini.asc; \ 34 | echo "${tini_sha}" /usr/bin/tini | sha256sum -c --strict --quiet; \ 35 | chmod a+x /usr/bin/tini; \ 36 | export GNUPGHOME="$(mktemp -d)"; \ 37 | gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys \ 38 | 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 \ 39 | B42F6819007F00F88E364FD4036A9C25BF357DD4; \ 40 | gpg --batch --verify tini.asc /usr/bin/tini; \ 41 | git clone https://github.com/ncopa/su-exec.git; \ 42 | cd su-exec; \ 43 | git checkout 4c3bb42b093f14da70d8ab924b487ccfbb1397af; \ 44 | echo d6c40440609a23483f12eb6295b5191e94baf08298a856bab6e15b10c3b82891 su-exec.c | sha256sum -c; \ 45 | echo 2a87af245eb125aca9305a0b1025525ac80825590800f047419dc57bba36b334 Makefile | sha256sum -c; \ 46 | make; \ 47 | mv /su-exec/su-exec /usr/bin/su-exec; \ 48 | gpgconf --kill all; \ 49 | rm -rf "$GNUPGHOME" /tini.asc /su-exec; \ 50 | microdnf remove -y git* perl* make gcc glibc-headers glibc-devel libxcrypt-devel; \ 51 | microdnf clean all 52 | 53 | ENV NEO4J_SHA256=%%NEO4J_SHA%% \ 54 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 55 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 56 | NEO4J_HOME="/var/lib/neo4j" \ 57 | LANG=C.UTF-8 58 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 59 | 60 | COPY ./local-package/* /startup/ 61 | 62 | RUN set -eux; \ 63 | groupadd --gid 7474 --system neo4j && useradd --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --gid neo4j neo4j; \ 64 | curl --fail --silent --show-error --location --remote-name ${NEO4J_URI}; \ 65 | echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet; \ 66 | tar --extract --file ${NEO4J_TARBALL} --directory /var/lib; \ 67 | mv /var/lib/neo4j-* "${NEO4J_HOME}"; \ 68 | rm ${NEO4J_TARBALL}; \ 69 | sed -i 's/Package Type:.*/Package Type: docker ubi9/' $NEO4J_HOME/packaging_info; \ 70 | mv /startup/neo4j-admin-report.sh "${NEO4J_HOME}"/bin/neo4j-admin-report; \ 71 | mv "${NEO4J_HOME}"/data /data; \ 72 | mv "${NEO4J_HOME}"/logs /logs; \ 73 | chown -R neo4j:neo4j /data; \ 74 | chmod -R 777 /data; \ 75 | chown -R neo4j:neo4j /logs; \ 76 | chmod -R 777 /logs; \ 77 | chown -R neo4j:neo4j "${NEO4J_HOME}"; \ 78 | chmod -R 777 "${NEO4J_HOME}"; \ 79 | chmod -R 755 "${NEO4J_HOME}/bin"; \ 80 | ln -s /data "${NEO4J_HOME}"/data; \ 81 | ln -s /logs "${NEO4J_HOME}"/logs 82 | 83 | ENV PATH="${NEO4J_HOME}"/bin:$PATH 84 | 85 | WORKDIR "${NEO4J_HOME}" 86 | 87 | VOLUME /data /logs 88 | 89 | EXPOSE 7474 7473 7687 90 | 91 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 92 | CMD ["neo4j"] 93 | -------------------------------------------------------------------------------- /docker-image-src/4.4/coredb/Dockerfile-ubi9: -------------------------------------------------------------------------------- 1 | FROM redhat/ubi9-minimal:latest 2 | ENV JAVA_HOME=/usr 3 | 4 | # gather pre-requisite packages 5 | RUN set -eux; \ 6 | arch="$(rpm --query --queryformat='%{ARCH}' rpm)"; \ 7 | case "${arch}" in \ 8 | 'x86_64') \ 9 | tini_url="https://github.com/krallin/tini/releases/download/v0.19.0/tini"; \ 10 | tini_sha="93dcc18adc78c65a028a84799ecf8ad40c936fdfc5f2a57b1acda5a8117fa82c"; \ 11 | ;; \ 12 | 'aarch64') \ 13 | tini_url="https://github.com/krallin/tini/releases/download/v0.19.0/tini-arm64"; \ 14 | tini_sha="07952557df20bfd2a95f9bef198b445e006171969499a1d361bd9e6f8e5e0e81"; \ 15 | ;; \ 16 | *) echo >&2 "Neo4j does not currently have a docker image for architecture $arch"; exit 1 ;; \ 17 | esac; \ 18 | microdnf install -y dnf; \ 19 | dnf install -y \ 20 | findutils \ 21 | gcc \ 22 | git \ 23 | gzip \ 24 | hostname \ 25 | java-11-openjdk-headless \ 26 | jq \ 27 | make \ 28 | procps \ 29 | shadow-utils \ 30 | tar \ 31 | wget \ 32 | which; \ 33 | # download tini and openssl 34 | wget -q ${tini_url} -O /usr/bin/tini; \ 35 | wget -q ${tini_url}.asc -O tini.asc; \ 36 | echo "${tini_sha}" /usr/bin/tini | sha256sum -c --strict --quiet; \ 37 | chmod a+x /usr/bin/tini; \ 38 | export GNUPGHOME="$(mktemp -d)"; \ 39 | gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys \ 40 | 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 \ 41 | B42F6819007F00F88E364FD4036A9C25BF357DD4; \ 42 | gpg --batch --verify tini.asc /usr/bin/tini; \ 43 | git clone https://github.com/ncopa/su-exec.git; \ 44 | cd su-exec; \ 45 | git checkout 4c3bb42b093f14da70d8ab924b487ccfbb1397af; \ 46 | echo d6c40440609a23483f12eb6295b5191e94baf08298a856bab6e15b10c3b82891 su-exec.c | sha256sum -c; \ 47 | echo 2a87af245eb125aca9305a0b1025525ac80825590800f047419dc57bba36b334 Makefile | sha256sum -c; \ 48 | make; \ 49 | mv /su-exec/su-exec /usr/bin/su-exec; \ 50 | gpgconf --kill all; \ 51 | rm -rf "$GNUPGHOME" tini.asc /su-exec; \ 52 | dnf remove -y gcc git make; \ 53 | dnf autoremove; \ 54 | dnf clean all 55 | 56 | ENV PATH="${JAVA_HOME}/bin:${PATH}" \ 57 | NEO4J_SHA256=%%NEO4J_SHA%% \ 58 | NEO4J_TARBALL=%%NEO4J_TARBALL%% \ 59 | NEO4J_EDITION=%%NEO4J_EDITION%% \ 60 | NEO4J_HOME="/var/lib/neo4j" \ 61 | LANG=C.UTF-8 62 | ARG NEO4J_URI=%%NEO4J_DIST_SITE%%/%%NEO4J_TARBALL%% 63 | 64 | COPY ./local-package/* /startup/ 65 | 66 | RUN set -eux; \ 67 | groupadd --gid 7474 --system neo4j && useradd --uid 7474 --system --no-create-home --home "${NEO4J_HOME}" --gid neo4j neo4j; \ 68 | curl --fail --silent --show-error --location --remote-name ${NEO4J_URI}; \ 69 | echo "${NEO4J_SHA256} ${NEO4J_TARBALL}" | sha256sum -c --strict --quiet; \ 70 | tar --extract --file ${NEO4J_TARBALL} --directory /var/lib; \ 71 | mv /var/lib/neo4j-* "${NEO4J_HOME}"; \ 72 | rm ${NEO4J_TARBALL}; \ 73 | mv /startup/neo4j-admin-report.sh "${NEO4J_HOME}"/bin/neo4j-admin-report; \ 74 | mv "${NEO4J_HOME}"/data /data; \ 75 | mv "${NEO4J_HOME}"/logs /logs; \ 76 | chown -R neo4j:neo4j /data; \ 77 | chmod -R 777 /data; \ 78 | chown -R neo4j:neo4j /logs; \ 79 | chmod -R 777 /logs; \ 80 | chown -R neo4j:neo4j "${NEO4J_HOME}"; \ 81 | chmod -R 777 "${NEO4J_HOME}"; \ 82 | chmod -R 755 "${NEO4J_HOME}/bin"; \ 83 | ln -s /data "${NEO4J_HOME}"/data; \ 84 | ln -s /logs "${NEO4J_HOME}"/logs; \ 85 | ln -s /startup/docker-entrypoint.sh /docker-entrypoint.sh 86 | 87 | ENV PATH "${NEO4J_HOME}"/bin:$PATH 88 | 89 | WORKDIR "${NEO4J_HOME}" 90 | 91 | VOLUME /data /logs 92 | 93 | EXPOSE 7474 7473 7687 94 | 95 | ENTRYPOINT ["tini", "-g", "--", "/startup/docker-entrypoint.sh"] 96 | CMD ["neo4j"] 97 | -------------------------------------------------------------------------------- /docker-image-src/2.3/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -eu 2 | 3 | setting() { 4 | setting="${1}" 5 | value="${2}" 6 | file="${3}" 7 | 8 | if [ -n "${value}" ]; then 9 | if grep --quiet --fixed-strings "${setting}=" "${NEO4J_HOME}/conf/${file}"; then 10 | sed --in-place "s|.*${setting}=.*|${setting}=${value}|" "${NEO4J_HOME}/conf/${file}" 11 | else 12 | echo "${setting}=${value}" >>"${NEO4J_HOME}/conf/${file}" 13 | fi 14 | fi 15 | } 16 | 17 | if [ "$1" == "neo4j" ]; then 18 | setting "keep_logical_logs" "${NEO4J_KEEP_LOGICAL_LOGS:-100M size}" neo4j.properties 19 | setting "dbms.pagecache.memory" "${NEO4J_CACHE_MEMORY:-512M}" neo4j.properties 20 | setting "wrapper.java.additional=-Dneo4j.ext.udc.source" "${NEO4J_UDC_SOURCE:-docker}" neo4j-wrapper.conf 21 | setting "wrapper.java.initmemory" "${NEO4J_HEAP_MEMORY:-512}" neo4j-wrapper.conf 22 | setting "wrapper.java.maxmemory" "${NEO4J_HEAP_MEMORY:-512}" neo4j-wrapper.conf 23 | setting "org.neo4j.server.thirdparty_jaxrs_classes" "${NEO4J_THIRDPARTY_JAXRS_CLASSES:-}" neo4j-server.properties 24 | setting "allow_store_upgrade" "${NEO4J_ALLOW_STORE_UPGRADE:-}" neo4j.properties 25 | 26 | if [ "${NEO4J_AUTH:-}" == "none" ]; then 27 | setting "dbms.security.auth_enabled" "false" neo4j-server.properties 28 | elif [[ "${NEO4J_AUTH:-}" == neo4j/* ]]; then 29 | password="${NEO4J_AUTH#neo4j/}" 30 | setting "org.neo4j.server.webserver.address" "127.0.0.1" neo4j-server.properties 31 | bin/neo4j start || \ 32 | (cat data/log/console.log && echo "Neo4j failed to start" && exit 1) 33 | if ! curl --fail --silent --user "neo4j:${password}" http://localhost:7474/db/data/ >/dev/null ; then 34 | curl --fail --silent --show-error --user neo4j:neo4j \ 35 | --data '{"password": "'"${password}"'"}' \ 36 | --header 'Content-Type: application/json' \ 37 | http://localhost:7474/user/neo4j/password 38 | fi 39 | bin/neo4j stop 40 | elif [ -n "${NEO4J_AUTH:-}" ]; then 41 | echo "Invalid value for NEO4J_AUTH: '${NEO4J_AUTH}'" 42 | exit 1 43 | fi 44 | 45 | setting "org.neo4j.server.webserver.address" "0.0.0.0" neo4j-server.properties 46 | setting "org.neo4j.server.database.mode" "${NEO4J_DATABASE_MODE:-}" neo4j-server.properties 47 | setting "ha.server_id" "${NEO4J_SERVER_ID:-}" neo4j.properties 48 | setting "ha.server" "${NEO4J_HA_ADDRESS:-}:6001" neo4j.properties 49 | setting "ha.cluster_server" "${NEO4J_HA_ADDRESS:-}:5001" neo4j.properties 50 | setting "ha.initial_hosts" "${NEO4J_INITIAL_HOSTS:-}" neo4j.properties 51 | 52 | [ -f "${EXTENSION_SCRIPT:-}" ] && . ${EXTENSION_SCRIPT} 53 | 54 | if [ -d /conf ]; then 55 | find /conf -type f -exec cp {} "${NEO4J_HOME}/conf" \; 56 | fi 57 | 58 | if [ -d /ssl ]; then 59 | num_certs=$(ls /ssl/*.cert 2>/dev/null | wc -l) 60 | num_keys=$(ls /ssl/*.key 2>/dev/null | wc -l) 61 | if [ $num_certs == "1" -a $num_keys == "1" ]; then 62 | cert=$(ls /ssl/*.cert) 63 | key=$(ls /ssl/*.key) 64 | setting "dbms.security.tls_certificate_file" $cert neo4j-server.properties 65 | setting "dbms.security.tls_key_file" $key neo4j-server.properties 66 | else 67 | echo "You must provide exactly one *.cert and exactly one *.key in /ssl." 68 | exit 1 69 | fi 70 | fi 71 | 72 | if [ -d /plugins ]; then 73 | find /plugins -type f -exec cp {} plugins \; 74 | fi 75 | 76 | exec bin/neo4j console 77 | elif [ "$1" == "dump-config" ]; then 78 | if [ -d "${NEO4J_HOME}/conf" ]; then 79 | cp --recursive "${NEO4J_HOME}"/conf/* /conf 80 | else 81 | echo >&2 "You must provide a /conf volume" 82 | exit 1 83 | fi 84 | else 85 | exec "$@" 86 | fi 87 | -------------------------------------------------------------------------------- /src/test/java/com/neo4j/docker/utils/Neo4jVersion.java: -------------------------------------------------------------------------------- 1 | package com.neo4j.docker.utils; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | public class Neo4jVersion 7 | { 8 | public static final Neo4jVersion NEO4J_VERSION_400 = new Neo4jVersion( 4, 0, 0 ); 9 | public static final Neo4jVersion NEO4J_VERSION_440 = new Neo4jVersion( 4, 4, 0 ); 10 | public static final Neo4jVersion NEO4J_VERSION_500 = new Neo4jVersion( 5, 0, 0 ); 11 | public static final Neo4jVersion NEO4J_VERSION_527 = new Neo4jVersion( 5, 27, 0 ); 12 | 13 | public final int major; 14 | public final int minor; 15 | public final int patch; 16 | public final String label; 17 | 18 | public static Neo4jVersion fromVersionString( String version ) 19 | { 20 | Pattern pattern = Pattern.compile( "(?[\\d]+)\\.(?[\\d]+)\\.(?[\\d]+)(?