Связи контейнеров в трубопроводе Jenkins
Поскольку docker-compose недоступен для меня в моем конвейере Jenkins, я использую два разных контейнера. Я пытаюсь связать их, но получаю следующую ошибку в Jenkins для первого контейнера
org.jenkinsci.plugins.scriptsecurity.scripts.UnapprovedUsageException: script not yet approved for use
at org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval.using(ScriptApproval.java:474)
at org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval$using$0.call(Unknown Source)
at com.splunk.splunkjenkins.UserActionDSL.perform(UserActionDSL.groovy:39)
at com.splunk.splunkjenkins.listeners.LoggingRunListener.onCompleted(LoggingRunListener.java:85)
at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:209)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.finish(WorkflowRun.java:610)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.access$800(WorkflowRun.java:137)
at org.jenkinsci.plugins.workflow.job.WorkflowRun$GraphL.onNewHead(WorkflowRun.java:1037)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.notifyListeners(CpsFlowExecution.java:1473)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$3.run(CpsThreadGroup.java:489)
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$1.run(CpsVmExecutorService.java:38)
at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:136)
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
GitHub has been notified of this commit’s build result
java.io.IOException: Failed to run image '<REGISTRY>/postgres'. Error: docker: Error response from daemon: Cannot link to a non running container: /wizardly_shaw AS /lucid_franklin/localhost.
Вот мой соответствующий этап Дженкинса
stage('build & test') {
environment {
POSTGRES_DB = 'mytestdb'
POSTGRES_USER = 'postgres'
POSTGRES_PASSWORD = 'postgres'
FLYWAY_URL = 'jdbc:postgresql://localhost:5432/mytestdb'
FLYWAY_USER = 'postgres'
FLYWAY_PASSWORD = 'postgres'
}
steps {
checkout scm
script {
docker.withRegistry(docker_repository, 'credentials-id') {
docker.image('<REGISTRY>/postgres').withRun("") { c ->
docker.image('<REGISTRY>/postgres').inside("--link ${c.id}:localhost") {
sh '''
psql --version
echo "$(date) - waiting for database to start"
while ! pg_isready -h localhost -p 5432 -d $POSTGRES_DB
do
echo "$(date) - waiting for database to start"
sleep 10
done
'''
}
}
docker.image('<REGISTRY>/flyway/flyway').inside("--link ${c.id}:localhost") {
sh '''
info
'''
}
}
}
}
}
Кто-нибудь может мне здесь помочь?
1 ответ
Похоже, что это вызывает проблему, потому что вы связываете другой контейнер с именем. попробуйте изменить имя с
localhost
к чему-то другому.
Взгляните на мой простой пример. В моем примере я запускаю два контейнера Postgres, связывающих друг друга. В одном из них запущен сервер Postgres, а в другом я просто использую
psql
командная строка.
Если вы обратите внимание на
psql 'host=db user=postgres password=mysecretpassword'
в другом контейнере, я указал хост как
db
который связан с идентификатором контейнера сервера postgres
node {
docker.image('postgres').withRun('-e POSTGRES_PASSWORD=mysecretpassword') { c ->
docker.image('postgres').inside("--link ${c.id}:db") {
sh """
#psql -h db -U postgres
psql 'host=db user=postgres password=mysecretpassword'
# perform any psql operation here
"""
}
}
}