Skip to content

Commit feb5a58

Browse files
committed
LPD-68592 Import/export via creating and extracting tar files after image creation to avoid large Docker contexts
1 parent b91c96c commit feb5a58

File tree

12 files changed

+81
-55
lines changed

12 files changed

+81
-55
lines changed

.dockerignore

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,17 @@
1-
**/.gitkeep
1+
**/.gitkeep
2+
.github/
3+
.gradle/
4+
build/
5+
buildSrc/
6+
data/
7+
dumps/
8+
exported_data/
9+
build.gradle
10+
gradle.properties
11+
gradle-local.properties
12+
gradlew
13+
gradlew.bat
14+
README.markdown
15+
settings.gradle
16+
source-formatter-suppressions.xml
17+
source-formatter.properties

Dockerfile.helper

Lines changed: 0 additions & 7 deletions
This file was deleted.

build.gradle

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import com.bmuschko.gradle.docker.tasks.container.DockerCopyFileFromContainer
2-
31
import com.liferay.docker.workspace.environments.Util
42

53
import groovy.json.JsonSlurper
@@ -32,26 +30,76 @@ withZone(ZoneId.systemDefault())
3230

3331
String timestamp = formatter.format(now)
3432

35-
tasks.register("exportContainerData", DockerCopyFileFromContainer) {
36-
containerId = "${config.namespace}-data-helper"
37-
33+
tasks.register("exportContainerData") {
3834
doFirst {
39-
mkdir hostPath.get()
35+
String hostPath = file("exported_data/data_${config.namespace}_${timestamp}").absolutePath
4036

41-
waitForCommand("docker compose create data-helper")
42-
}
37+
getExistingVolumeNames().each {
38+
String volumeName ->
4339

44-
doLast {
45-
updateGradleLocalProperties(["lr.docker.environment.data.directory" : hostPath.get()])
40+
String backupFileName = "${volumeName.substring(config.namespace.length() + 1)}.tar"
4641

47-
logger.lifecycle("\nUpdated gradle-local.properties with the new value:\nlr.docker.environment.data.directory=${hostPath.get()}")
48-
}
42+
if (backupFileName.equals("dumps.tar")) {
43+
return
44+
}
45+
46+
println "Creating backup of volume ${volumeName} in ${hostPath}/${backupFileName}"
47+
waitForCommand("docker run --rm -v ${volumeName}:/source -v ${hostPath}:/target busybox:latest tar --create --file=/target/${backupFileName} --directory=/source .")
48+
println "Created backup of volume ${volumeName} in ${hostPath}/${backupFileName}"
49+
}
4950

50-
hostPath = provider {
51-
"exported_data/data_${config.namespace}_${timestamp}"
51+
updateGradleLocalProperties(["lr.docker.environment.data.directory" : hostPath])
52+
53+
logger.lifecycle("\nUpdated gradle-local.properties with the new value:\nlr.docker.environment.data.directory=${hostPath}")
5254
}
55+
}
56+
57+
tasks.register("importContainerData") {
58+
mustRunAfter ":buildDockerImage"
59+
60+
doFirst {
61+
List<String> previousVolumeNames = getExistingVolumeNames()
62+
63+
waitForCommand("docker compose build")
64+
waitForCommand("docker compose create")
65+
66+
List<String> currentVolumeNames = getExistingVolumeNames()
67+
68+
project.file(config.dataDirectory).listFiles().each {
69+
File backupFile ->
70+
71+
if (backupFile.isFile() && !backupFile.name.endsWith(".tar")) {
72+
return
73+
}
74+
75+
String volumeName = "${config.namespace}_${backupFile.name}"
76+
77+
if (backupFile.isFile()) {
78+
volumeName = volumeName.substring(0, volumeName.length() - 4)
79+
}
80+
81+
if (!currentVolumeNames.contains(volumeName)) {
82+
return
83+
}
84+
85+
if (previousVolumeNames.contains(volumeName)) {
86+
return
87+
}
88+
89+
println "Restoring backup of volume ${volumeName} using ${backupFile.absolutePath}"
5390

54-
remotePath = "/container-data"
91+
if (backupFile.isFile()) {
92+
waitForCommand("docker run --rm -v ${volumeName}:/target -v ${backupFile.absolutePath}:/source.tar busybox:latest tar --extract --file=/source.tar --directory=/target/")
93+
}
94+
else {
95+
waitForCommand("docker run --rm -v ${volumeName}:/target -v ${backupFile.absolutePath}:/source busybox:latest sh -c 'cp --update --recursive /source/* /target/'")
96+
}
97+
98+
println "Restored backup of volume ${volumeName} using ${backupFile.absolutePath}"
99+
100+
println waitForCommand("docker run --rm -v ${volumeName}:/${volumeName} busybox:latest du -sh /${volumeName}/")
101+
}
102+
}
55103
}
56104

57105
tasks.register("importDocumentLibraryStructure") {
@@ -160,6 +208,7 @@ composeUp {
160208
}
161209

162210
dependsOn ":buildDockerImage"
211+
dependsOn ":importContainerData"
163212
dependsOn ":importDatabaseDumps"
164213

165214
doFirst {

compose-recipes/db2/service.db2.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
services:
2-
data-helper:
3-
volumes:
4-
- db2:/container-data/db2
52
database:
63
build: ./compose-recipes/db2
74
container_name: ${NAMESPACE}-database-db2

compose-recipes/elasticsearch/service.elasticsearch.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
services:
2-
data-helper:
3-
volumes:
4-
- elasticsearch:/container-data/elasticsearch
52
elasticsearch:
63
build: ./compose-recipes/elasticsearch
74
container_name: ${NAMESPACE}-elasticsearch

compose-recipes/liferay/service.liferay.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
services:
2-
data-helper:
3-
volumes:
4-
- liferay:/container-data/liferay
52
liferay:
63
container_name: ${NAMESPACE}-liferay
74
env_file:

compose-recipes/mariadb/service.mariadb.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
services:
2-
data-helper:
3-
volumes:
4-
- mariadb:/container-data/mariadb
52
database:
63
build: ./compose-recipes/mariadb
74
container_name: ${NAMESPACE}-database-mariadb

compose-recipes/mysql/service.mysql.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
services:
2-
data-helper:
3-
volumes:
4-
- mysql:/container-data/mysql
52
database:
63
build: ./compose-recipes/mysql
74
container_name: ${NAMESPACE}-database-mysql

compose-recipes/postgres/service.postgres.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
services:
2-
data-helper:
3-
volumes:
4-
- postgres:/container-data/postgres
52
database:
63
build: ./compose-recipes/postgres
74
container_name: ${NAMESPACE}-database-postgres

compose-recipes/webserver-http/service.webserver_http.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
services:
2-
data-helper:
3-
volumes:
4-
- webserver-http:/container-data/webserver-http
52
webserver:
63
build: ./compose-recipes/webserver-http
74
container_name: ${NAMESPACE}-webserver-http

0 commit comments

Comments
 (0)