Different image behavior in Google Container Registry vs locally (packaged Spring Boot app)

10/12/2017

We have a Spring Boot application (multiple micro-services), packaged with Google Container Builder and published to the registry. Our cloudbuild.yaml looks like this:

steps:
- name: 'gcr.io/cloud-builders/java/gradle'
  id: 'java-build'
  args: ['build']

- name: 'gcr.io/cloud-builders/docker'
  args: ['build', 
         '-t', 'gcr.io/$PROJECT_ID/api-auth:$COMMIT_SHA',
         '-t', 'gcr.io/$PROJECT_ID/api-auth:latest',
         '-f', './api-auth/Dockerfile', './api-auth']
  waitFor: ['java-build']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', 
         '-t', 'gcr.io/$PROJECT_ID/api-user:$COMMIT_SHA',
         '-t', 'gcr.io/$PROJECT_ID/api-user:latest',
         '-f', './api-user/Dockerfile', './api-user']
  waitFor: ['java-build']

images:
- 'gcr.io/$PROJECT_ID/api-auth:$COMMIT_SHA'
- 'gcr.io/$PROJECT_ID/api-auth:latest'
- 'gcr.io/$PROJECT_ID/api-user:$COMMIT_SHA'
- 'gcr.io/$PROJECT_ID/api-user:latest'

which is called by a trigger on push into the repository on GitHub.

If I run this locally:

container-builder-local --dryrun=false .

resulting images run fine, e.g.:

docker run -e "SPRING_PROFILES_ACTIVE=development" -p 9000:9000 gcr.io/.../api-auth:latest

but when the image is built in the cloud with the Container Builder, the application doesn't work and fails with error that never ocurred before.

Even when pulled:

gcloud docker -- pull gcr.io/.../api-auth:latest

and run locally the new error stops the application from loading:

2017-10-11 16:35:27.661  WARN 5 --- [           main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webSecurityConfig': Unsatisfied dependency expressed through field 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationManager' defined in class path resource [org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.authentication.AuthenticationManager]: Factory method 'authenticationManager' threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'OAuth2Config': Unsatisfied dependency expressed through field 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'authenticationManager': Requested bean is currently in creation: Is there an unresolvable circular reference?
2017-10-11 16:35:27.663  INFO 5 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2017-10-11 16:35:27.676  INFO 5 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2017-10-11 16:35:27.718  INFO 5 --- [           main] utoConfigurationReportLoggingInitializer :

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-10-11 16:35:27.730 ERROR 5 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   :

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

   webSecurityConfig (field private org.springframework.security.authentication.AuthenticationManager com.project.auth.config.WebSecurityConfig.authenticationManager)
┌─────┐
|  authenticationManager defined in class path resource [org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.class]
↑     ↓
|  OAuth2Config (field private org.springframework.security.authentication.AuthenticationManager com.project.auth.config.OAuth2Config.authenticationManager)
└─────┘

This only happens when the image goes through the Cloud Container Builder - neither the local one, nor with a local gradle build.

Could this possibly be a problem in the cloud, or am I missing something trivial?


I have also filed an issue on GitHub, but since it's a broader problem along with the Spring Boot nature of the application, I thought I'd ask here to see if it rings any bell.

-- Michal
google-cloud-platform
google-container-builder
google-kubernetes-engine
spring-boot

0 Answers