@@ -53,6 +53,7 @@ import org.mandas.docker.client.messages.HostConfig
5353import org.mandas.docker.client.messages.LogConfig
5454import java.io.FileWriter
5555import java.nio.file.Files
56+ import java.nio.file.LinkOption
5657import java.nio.file.Path
5758import java.time.OffsetDateTime
5859import java.time.ZoneOffset
@@ -69,6 +70,7 @@ class DockerOrchestrator(channel: Channel<ShinyProxyEvent>,
6970 private val dockerGID: Int = config.readConfigValue(null , " SPO_DOCKER_GID" ) { it.toInt() }
7071 private val dockerSocket: String = config.readConfigValue(" /var/run/docker.sock" , " SPO_DOCKER_SOCKET" ) { it }
7172 private val disableICC: Boolean = config.readConfigValue(false , " SPO_DISABLE_ICC" ) { it.toBoolean() }
73+ private var dataDirUid: Int
7274 private val state = mutableMapOf<String , ShinyProxyStatus >()
7375
7476 private val logger = KotlinLogging .logger { }
@@ -98,12 +100,13 @@ class DockerOrchestrator(channel: Channel<ShinyProxyEvent>,
98100 .uri(" unix://" + dockerSocket)
99101 .readTimeoutMillis(0 ) // no timeout, needed for startContainer and logs, #32606
100102 .build()
103+ dataDirUid = getDatadirUId()
101104 caddyConfig = CaddyConfig (dockerClient, dataDir, config)
102105 dockerActions = DockerActions (dockerClient)
103106 shinyProxyReadyChecker = ShinyProxyReadyChecker (channel, dockerActions, dockerClient, dataDir)
104- redisConfig = RedisConfig (dockerClient, dockerActions, persistentState, dataDir, config)
105- craneConfig = CraneConfig (dockerClient, dockerActions, dataDir, inputDir, redisConfig, caddyConfig, persistentState)
106- monitoringConfig = MonitoringConfig (dockerClient, dockerActions, dataDir, caddyConfig, config, dockerSocket)
107+ redisConfig = RedisConfig (dockerClient, dockerActions, persistentState, dataDir, dataDirUid, config)
108+ craneConfig = CraneConfig (dockerClient, dockerActions, dataDir, inputDir, redisConfig, caddyConfig, persistentState, dataDirUid )
109+ monitoringConfig = MonitoringConfig (dockerClient, dockerActions, dataDir, dataDirUid, caddyConfig, config, dockerSocket)
107110 logFilesCleaner = LogFilesCleaner (dataDir.resolve(" logs" ), fileManager, dockerActions)
108111 fileManager.createDirectories(dataDir)
109112 eventWriter = FileWriter (dataDir.resolve(" events.json" ).toFile())
@@ -278,6 +281,7 @@ class DockerOrchestrator(channel: Channel<ShinyProxyEvent>,
278281 .hostConfig(hostConfigBuilder.build())
279282 .labels(shinyProxy.labels + LabelFactory .labelsForShinyProxyInstance(shinyProxyInstance, version))
280283 .env(" PROXY_VERSION=${version} " , " PROXY_REALM_ID=${shinyProxy.realmId} " , " SPRING_CONFIG_IMPORT=/opt/shinyproxy/generated.yml" )
284+ .user(dataDirUid.toString())
281285 .build()
282286
283287 logger.info { " ${logPrefix(shinyProxyInstance)} [Docker] Creating new container" }
@@ -515,4 +519,15 @@ class DockerOrchestrator(channel: Channel<ShinyProxyEvent>,
515519 return (cpuPeriod.toDouble() * converted).toLong()
516520 }
517521
522+ private fun getDatadirUId (): Int {
523+ try {
524+ val owner = Integer .parseInt(Files .getAttribute(dataDir, " unix:uid" , LinkOption .NOFOLLOW_LINKS ).toString())
525+ logger.info { " Owner of data dir is '$owner '" }
526+ return owner
527+ } catch (e: Exception ) {
528+ logger.warn(e) { " Failed to determine owner of data dir - failling back to user 1000" }
529+ return 1000
530+ }
531+ }
532+
518533}
0 commit comments