diff --git a/.dockerignore b/.dockerignore index 6cb35d20..137ac52c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,17 @@ -**/.gitkeep \ No newline at end of file +**/.gitkeep +.github/ +.gradle/ +build/ +buildSrc/ +data/ +dumps/ +exported_data/ +build.gradle +gradle.properties +gradle-local.properties +gradlew +gradlew.bat +README.markdown +settings.gradle +source-formatter-suppressions.xml +source-formatter.properties \ No newline at end of file diff --git a/Dockerfile.helper b/Dockerfile.helper deleted file mode 100644 index 81168d34..00000000 --- a/Dockerfile.helper +++ /dev/null @@ -1,11 +0,0 @@ -FROM busybox:latest - -ARG DATA_DIRECTORY=data - -COPY --chown=1000:1000 ${DATA_DIRECTORY} /container-data - -RUN ([ -d /container-data/sqlserver ] && addgroup --gid 10001 mssql && adduser -S -s /usr/sbin/nologin -h /home/mssql --disabled-password -G mssql -u 10001 mssql) || echo - -RUN ([ -d /container-data/sqlserver ] && chown -R 10001:10001 /container-data/sqlserver) || echo - -USER 1000 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 2b1385f5..42664e97 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,3 @@ -import com.bmuschko.gradle.docker.tasks.container.DockerCopyFileFromContainer - import com.liferay.docker.workspace.environments.Util import groovy.json.JsonSlurper @@ -32,26 +30,76 @@ withZone(ZoneId.systemDefault()) String timestamp = formatter.format(now) -tasks.register("exportContainerData", DockerCopyFileFromContainer) { - containerId = "${config.namespace}-data-helper" - +tasks.register("exportContainerData") { doFirst { - mkdir hostPath.get() + String hostPath = projectDir.relativePath(file("exported_data/data_${config.namespace}_${timestamp}")) - waitForCommand("docker compose create data-helper") - } + getExistingVolumeNames().each { + String volumeName -> - doLast { - updateGradleLocalProperties(["lr.docker.environment.data.directory" : hostPath.get()]) + String backupFileName = "${volumeName.substring(config.namespace.length() + 1)}.tar" - logger.lifecycle("\nUpdated gradle-local.properties with the new value:\nlr.docker.environment.data.directory=${hostPath.get()}") - } + if (backupFileName.equals("dumps.tar")) { + return + } + + println "Creating backup of volume ${volumeName} in ${hostPath}/${backupFileName}" + waitForCommand("docker run --rm -v ${volumeName}:/source -v ${hostPath}:/target busybox:latest tar --create --file=/target/${backupFileName} --directory=/source .") + println "Created backup of volume ${volumeName} in ${hostPath}/${backupFileName}" + } - hostPath = provider { - "exported_data/data_${config.namespace}_${timestamp}" + updateGradleLocalProperties(["lr.docker.environment.data.directory" : hostPath]) + + logger.lifecycle("\nUpdated gradle-local.properties with the new value:\nlr.docker.environment.data.directory=${hostPath}") } +} + +tasks.register("importContainerData") { + mustRunAfter ":buildDockerImage" + + doFirst { + List previousVolumeNames = getExistingVolumeNames() + + waitForCommand("docker compose build") + waitForCommand("docker compose create") + + List currentVolumeNames = getExistingVolumeNames() + + project.file(config.dataDirectory).listFiles().each { + File backupFile -> + + if (backupFile.isFile() && !backupFile.name.endsWith(".tar")) { + return + } + + String volumeName = "${config.namespace}_${backupFile.name}" + + if (backupFile.isFile()) { + volumeName = volumeName.substring(0, volumeName.length() - 4) + } - remotePath = "/container-data" + if (!currentVolumeNames.contains(volumeName)) { + return + } + + if (previousVolumeNames.contains(volumeName)) { + return + } + + println "Restoring backup of volume ${volumeName} using ${backupFile.absolutePath}" + + if (backupFile.isFile()) { + waitForCommand("docker run --rm -v ${volumeName}:/target -v ${backupFile.absolutePath}:/source.tar busybox:latest tar --extract --file=/source.tar --directory=/target/") + } + else { + waitForCommand("docker run --rm -v ${volumeName}:/target -v ${backupFile.absolutePath}:/source busybox:latest sh -c 'cp --update --recursive /source/* /target/'") + } + + println "Restored backup of volume ${volumeName} using ${backupFile.absolutePath}" + + println waitForCommand("docker run --rm -v ${volumeName}:/${volumeName} busybox:latest du -sh /${volumeName}/") + } + } } tasks.register("importDocumentLibraryStructure") { @@ -74,38 +122,42 @@ tasks.register("importDocumentLibraryStructure") { } } -tasks.register("shareWorkspace", Zip) { - archiveFileName = provider { - "workspace_${config.namespace}_${timestamp}.zip" - } - - destinationDirectory = file 'shared_workspaces' - +tasks.register("shareWorkspace") { doLast { - logger.lifecycle "\nWorkspace zip: ${archiveFile.get()}\n" - } - - exclude ".gitkeep" - exclude ".gitignore" - exclude ".git" - exclude ".gradle" - exclude "binds" - exclude "dumps/*" - exclude "shared_workspaces" - exclude { - FileTreeElement fileTreeElement -> - - fileTreeElement.relativePath.pathString.startsWith("exported_data/") && - !fileTreeElement.relativePath.pathString.startsWith(config.dataDirectory) - } + String fileListFileName = "shared_workspaces/workspace_${config.namespace}_${timestamp}.txt" + String archiveFileName = "shared_workspaces/workspace_${config.namespace}_${timestamp}.7z" + + file(fileListFileName).text = fileTree('.') { + exclude ".gitkeep" + exclude ".gitignore" + exclude ".git" + exclude ".gradle" + exclude "binds" + exclude "buildSrc/build" + exclude "buildSrc/.gradle" + exclude "dumps/*" + exclude "shared_workspaces" + exclude { + FileTreeElement fileTreeElement -> + + fileTreeElement.relativePath.pathString.startsWith("exported_data/") && + !fileTreeElement.relativePath.pathString.startsWith(config.dataDirectory) + } - from '.' + include "${config.dataDirectory}/**" + include "**/*" + }.files.collect { + File file -> - include "${config.dataDirectory}/**" - include "**/*" + project.relativePath(file) + }.join("\n") - outputs.upToDateWhen { - false + try { + waitForCommand("7z a -m0=lzma2 -mx=1 -bsp2 ${archiveFileName} -i@${fileListFileName}") + } + finally { + file(fileListFileName).delete() + } } } @@ -164,6 +216,7 @@ composeUp { } dependsOn ":buildDockerImage" + dependsOn ":importContainerData" dependsOn ":importDatabaseDumps" doFirst { diff --git a/compose-recipes/db2/service.db2.yaml b/compose-recipes/db2/service.db2.yaml index b16b14d7..630b7c7f 100644 --- a/compose-recipes/db2/service.db2.yaml +++ b/compose-recipes/db2/service.db2.yaml @@ -1,7 +1,4 @@ services: - data-helper: - volumes: - - db2:/container-data/db2 database: build: ./compose-recipes/db2 container_name: ${NAMESPACE}-database-db2 diff --git a/compose-recipes/elasticsearch/service.elasticsearch.yaml b/compose-recipes/elasticsearch/service.elasticsearch.yaml index 8102d341..c97ed6f8 100644 --- a/compose-recipes/elasticsearch/service.elasticsearch.yaml +++ b/compose-recipes/elasticsearch/service.elasticsearch.yaml @@ -1,7 +1,4 @@ services: - data-helper: - volumes: - - elasticsearch:/container-data/elasticsearch elasticsearch: build: ./compose-recipes/elasticsearch container_name: ${NAMESPACE}-elasticsearch diff --git a/compose-recipes/liferay/service.liferay.yaml b/compose-recipes/liferay/service.liferay.yaml index 985cd3b5..fd62c7c9 100644 --- a/compose-recipes/liferay/service.liferay.yaml +++ b/compose-recipes/liferay/service.liferay.yaml @@ -1,7 +1,4 @@ services: - data-helper: - volumes: - - liferay:/container-data/liferay liferay: container_name: ${NAMESPACE}-liferay env_file: diff --git a/compose-recipes/mariadb/service.mariadb.yaml b/compose-recipes/mariadb/service.mariadb.yaml index 6fa57673..cd9b3e48 100644 --- a/compose-recipes/mariadb/service.mariadb.yaml +++ b/compose-recipes/mariadb/service.mariadb.yaml @@ -1,7 +1,4 @@ services: - data-helper: - volumes: - - mariadb:/container-data/mariadb database: build: ./compose-recipes/mariadb container_name: ${NAMESPACE}-database-mariadb diff --git a/compose-recipes/mysql/service.mysql.yaml b/compose-recipes/mysql/service.mysql.yaml index 4e49a8fb..a1150370 100644 --- a/compose-recipes/mysql/service.mysql.yaml +++ b/compose-recipes/mysql/service.mysql.yaml @@ -1,7 +1,4 @@ services: - data-helper: - volumes: - - mysql:/container-data/mysql database: build: ./compose-recipes/mysql container_name: ${NAMESPACE}-database-mysql diff --git a/compose-recipes/postgres/service.postgres.yaml b/compose-recipes/postgres/service.postgres.yaml index be427780..e137659c 100644 --- a/compose-recipes/postgres/service.postgres.yaml +++ b/compose-recipes/postgres/service.postgres.yaml @@ -1,7 +1,4 @@ services: - data-helper: - volumes: - - postgres:/container-data/postgres database: build: ./compose-recipes/postgres container_name: ${NAMESPACE}-database-postgres diff --git a/compose-recipes/sqlserver/service.sqlserver.yaml b/compose-recipes/sqlserver/service.sqlserver.yaml index 7bb7ba6d..4685ed0c 100644 --- a/compose-recipes/sqlserver/service.sqlserver.yaml +++ b/compose-recipes/sqlserver/service.sqlserver.yaml @@ -1,7 +1,4 @@ services: - data-helper: - volumes: - - sqlserver:/container-data/sqlserver database: build: ./compose-recipes/sqlserver container_name: ${NAMESPACE}-database-sqlserver diff --git a/compose-recipes/webserver-http/service.webserver_http.yaml b/compose-recipes/webserver-http/service.webserver_http.yaml index fa3d9d98..04a8daab 100644 --- a/compose-recipes/webserver-http/service.webserver_http.yaml +++ b/compose-recipes/webserver-http/service.webserver_http.yaml @@ -1,7 +1,4 @@ services: - data-helper: - volumes: - - webserver-http:/container-data/webserver-http webserver: build: ./compose-recipes/webserver-http container_name: ${NAMESPACE}-webserver-http diff --git a/compose-recipes/webserver-https/service.webserver_https.yaml b/compose-recipes/webserver-https/service.webserver_https.yaml index ddcd4414..1e6ed6cb 100644 --- a/compose-recipes/webserver-https/service.webserver_https.yaml +++ b/compose-recipes/webserver-https/service.webserver_https.yaml @@ -1,7 +1,4 @@ services: - data-helper: - volumes: - - webserver-https:/container-data/webserver-https webserver: build: ./compose-recipes/webserver-https container_name: ${NAMESPACE}-webserver-https diff --git a/docker-compose.yaml b/docker-compose.yaml index bf5dff09..33e35253 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,11 +1,3 @@ name: ${NAMESPACE} -services: - data-helper: - build: - args: - DATA_DIRECTORY: ${DATA_DIRECTORY} - context: . - dockerfile: Dockerfile.helper - container_name: ${NAMESPACE}-data-helper volumes: dumps: \ No newline at end of file