我正在构建一个詹金斯容器,并希望在初始流程中设置KeycloakSecurityRealm。我已经有一个脚本可以正常使用默认设置:
import hudson.*
import hudson.model.*
import jenkins.*
import jenkins.model.*
import java.util.logging.Logger
import hudson.security.*
import java.util.*
import com.michelin.cio.hudson.plugins.rolestrategy.*
import java.lang.reflect.*
import org.jenkinsci.plugins
/*
NOTE: that megascript should be split someday, when my groovy skills improves.
*/
Thread.start {
//vbles definition
def logger = Logger.getLogger("")
def instance = Jenkins.getInstance()
def pm = instance.getPluginManager()
def uc = instance.getUpdateCenter()
def installed = false
// More code...
//No plugins to update. Security can be set
logger.info("All plugins are up to date")
logger.info("Setting security")
// logger.info("Creating initial user")
// hudsonRealm.createAccount("USER","USER")
logger.info("Creating reaml")
def keycloakSecurityRealm = keycloakRealm.createSecurityComponents()
//realm based on jenkins database
logger.info("Setting Security realm to KEYCLOAK")
instance.setSecurityRealm(keycloakSecurityRealm)
//not anonymous read allowed
此代码崩溃,没有任何信息。我想调试容器,所以我检查了可以运行容器崩溃的步骤来附加交互式控制台:
可以做
docker run -ti 3ed
我可以以根用户身份访问该容器。
问题是我无法调试脚本。我已经检查了使用jdb的某些方法,但是在所有情况下都需要运行它的邮件Java类。原始脚本在调用时无需更改就可以正常工作,因此它可以在没有任何类的情况下运行文件。
如何调试容器内的此类Java脚本?
谢谢。
答案 0 :(得分:2)
一旦进入容器,请确保以调试模式运行代码。
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=32887 ...
如果您没有机会自己启动Java,则可以随时使用_JAVA_OPTIONS
export _JAVA_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=32887
将调试器(例如IntelliJ)连接到远程机器(基于Docker的容器)。从容器外部启动的IDE中调试代码。
应该可以解决问题。
对于样本(用于剖析),请在此处查看:
https://github.com/mkowsiak/ProfilerDocker
这不是一回事,但是从某种意义上说,这类似,基于Docker的代码(Java)在容器内执行,而探查器(在容器外运行)则附加到远程机器上。