-
Notifications
You must be signed in to change notification settings - Fork 101
CMR-11030: Fix failure to launch Docker with Testcontainers #2351
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
WalkthroughThe managed dependency for org.testcontainers/testcontainers is updated from version 1.21.3 to 2.0.2 in project.clj. The existing exclusion of org.apache.commons/commons-compress is preserved throughout the change. Changes
Estimated code review effort🎯 1 (Trivial) | ⏱️ ~3 minutes
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
✨ Finishing touches🧪 Generate unit tests (beta)
Tip 📝 Customizable high-level summaries are now available in beta!You can now customize how CodeRabbit generates the high-level summary in your pull requests — including its content, structure, tone, and formatting.
Example instruction:
Note: This feature is currently in beta for Pro-tier users, and pricing will be announced later. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| [org.testcontainers/testcontainers "2.0.2" ;; latest | ||
| :exclusions [[org.apache.commons/commons-compress]]]] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Script executed:
#!/bin/bash
# Find all references to testcontainers in the codebase
rg -in "testcontainers" -C2 --type=clj --type=java --type=gradleRepository: nasa/Common-Metadata-Repository
<shell_result>
Repository: nasa/Common-Metadata-Repository
Exit code: 2
stderr:
unrecognized file type: clj
</shell_result>
Script executed:
#!/bin/bash
# Find all references to testcontainers without file type restriction
rg -in "testcontainers" -C2Repository: nasa/Common-Metadata-Repository
<shell_result>
Repository: nasa/Common-Metadata-Repository
Exit code: 0
stdout:
project.clj-22- [clj-time "0.15.1"] ;; latest is 0.15.2
project.clj-23- [org.clojure/clojure "1.11.2"] ;; lattest is 1.11.4 or 1.12.2
project.clj:24: [org.apache.commons/commons-compress "1.28.0"] ;; see testcontainers
project.clj:25: [org.testcontainers/testcontainers "2.0.2" ;; latest
project.clj-26- :exclusions [[org.apache.commons/commons-compress]]]]
project.clj-27- :profiles {:uberjar {:modules {:dirs ["access-control-app"
--
elastic-utils-lib/project.clj-16- [org.clojure/clojure]
elastic-utils-lib/project.clj-17- [org.elasticsearch/elasticsearch ~elastic-version]
elastic-utils-lib/project.clj:18: ;; testcontainers needs a newer version of commons-compress, for now
elastic-utils-lib/project.clj-19- ;; we will force it to use the latest version
elastic-utils-lib/project.clj-20- [org.apache.commons/commons-compress]
elastic-utils-lib/project.clj:21: [org.testcontainers/testcontainers]
elastic-utils-lib/project.clj-22- [org.yaml/snakeyaml "1.31"]
elastic-utils-lib/project.clj-23- [potemkin "0.4.5"]]
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-7- (:import
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-8- (java.time Duration)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:9: (org.testcontainers.containers FixedHostPortGenericContainer Network)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:10: (org.testcontainers.containers.wait.strategy Wait)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:11: (org.testcontainers.images.builder ImageFromDockerfile)))
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-12-
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-13-(def ^:private elasticsearch-official-docker-image
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-38- image specified. Must specify dockerfile with key \"Dockerfile\" otherwise
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-39- uses default image. See:
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:40: https://www.testcontainers.org/features/creating_images/
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-41- kibana-port -> if provided will also bring up a kibana container to use with the
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-42- new elasticsearch node."
--
redis-utils-lib/project.clj-15- [nasa-cmr/cmr-common-lib "0.1.1-SNAPSHOT"]
redis-utils-lib/project.clj-16- [org.clojure/clojure]
redis-utils-lib/project.clj:17: ;; testcontainers needs a newer version of commons-compress, for now
redis-utils-lib/project.clj-18- ;; we will force it to use the latest version
redis-utils-lib/project.clj-19- [org.apache.commons/commons-compress]
redis-utils-lib/project.clj:20: [org.testcontainers/testcontainers]]
redis-utils-lib/project.clj-21- :plugins [[lein-exec "0.3.7"]
redis-utils-lib/project.clj-22- [lein-parent "0.3.9"]
--
message-queue-lib/project.clj-40- [org.clojure/clojure]
message-queue-lib/project.clj-41- [org.clojure/tools.reader "1.3.2"]
message-queue-lib/project.clj:42: ;; testcontainers needs a newer version of commons-compress, for now
message-queue-lib/project.clj-43- ;; we will force it to use the latest version
message-queue-lib/project.clj-44- [org.apache.commons/commons-compress]
message-queue-lib/project.clj:45: [org.testcontainers/testcontainers]
message-queue-lib/project.clj-46-
message-queue-lib/project.clj-47- [potemkin "0.4.5"]
--
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-6- [cmr.message-queue.config :as config])
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-7- (:import
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj:8: (org.testcontainers.containers FixedHostPortGenericContainer Network)))
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-9-
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-10-(def ELASTIC_MQ_UI_PORT 9325)
--
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-5- [cmr.common.log :as log :refer [debug error]])
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-6- (:import
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj:7: (org.testcontainers.containers FixedHostPortGenericContainer Network)))
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-8-
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-9-(def REDIS_DEFAULT_PORT 6379)
</shell_result>
Script executed:
#!/bin/bash
# Find test files that may use testcontainers
fd -e clj -path "*/test/*" | head -20Repository: nasa/Common-Metadata-Repository
<shell_result>
Repository: nasa/Common-Metadata-Repository
Exit code: 0
stderr:
error: 'h' isn't a valid value for '--type <filetype>'
[possible values: file, directory, symlink, executable, empty, socket, pipe]
For more information try '--help'
</shell_result>
Script executed:
#!/bin/bash
# Find test files that use testcontainers
find . -name "*test*.clj" -o -name "*_test.clj" | xargs rg -l "testcontainers" 2>/dev/null | head -10Repository: nasa/Common-Metadata-Repository
<shell_result>
Repository: nasa/Common-Metadata-Repository
Exit code: 0
</shell_result>
Testcontainers 2.0.0 release notes breaking changes
<web_search_result>
Testcontainers Java 2.0.0 (released Oct 14, 2025) — breaking changes (summary):
- Removed JUnit 4 support. [1]
- All module artifact coordinates renamed/prefixed to testcontainers- (e.g., org.testcontainers:mysql → org.testcontainers:testcontainers-mysql). [1]
- Container classes moved to module-specific packages (e.g., MySQLContainer → org.testcontainers.mysql). [1]
- Add support for specifying Docker image in DockerComposeContainer and ComposeContainer (API change). [1]
- Make Neo4jContainer generic and drop a deprecated method. [1]
- Drop modules’ default constructors (constructors removed). [1]
- Remove LinkableContainer from NginxContainer. [1]
Sources: GitHub release notes for testcontainers-java 2.0.0. [1] (github.com)
Citations:
- 1: https://github.com/testcontainers/testcontainers-java/releases?utm_source=openai
</web_search_result>
Script executed:
#!/bin/bash
# Check how FixedHostPortGenericContainer is instantiated
rg "FixedHostPortGenericContainer" -A3 -B1Repository: nasa/Common-Metadata-Repository
<shell_result>
Repository: nasa/Common-Metadata-Repository
Exit code: 0
stdout:
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj- (:import
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj: (org.testcontainers.containers FixedHostPortGenericContainer Network)))
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-(def REDIS_DEFAULT_PORT 6379)
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-
--
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj- [http-port network]
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj: (doto (FixedHostPortGenericContainer. redis-image)
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj- (.withFixedExposedPort (int http-port) REDIS_DEFAULT_PORT)
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj- (.withNetwork network)))
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-
--
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj- (let [network (Network/newNetwork)
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj: ^FixedHostPortGenericContainer redis (build-redis http-port network)]
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj- (try
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj- (.start redis)
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj- (assoc this :redis redis)
--
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj- (:import
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj: (org.testcontainers.containers FixedHostPortGenericContainer Network)))
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-(def ELASTIC_MQ_UI_PORT 9325)
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-
--
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj- [http-port1 http-port2 network]
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj: (-> (FixedHostPortGenericContainer. elasticmq-image)
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj- (.withNetwork network)
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj- (.withFixedExposedPort (Integer. http-port1) (Integer. http-port1))
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj- (.withFixedExposedPort (Integer. http-port2) (Integer. http-port2))))
--
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj- (let [network (Network/newNetwork)
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj: ^FixedHostPortGenericContainer sqs-server (build-sqs-server queue-port ui-port network)]
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj- (try
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj- (.start sqs-server)
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj- (assoc this :sqs-server sqs-server)
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (java.time Duration)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj: (org.testcontainers.containers FixedHostPortGenericContainer Network)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (org.testcontainers.containers.wait.strategy Wait)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (org.testcontainers.images.builder ImageFromDockerfile)))
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- [http-port network]
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj: (doto (FixedHostPortGenericContainer. kibana-official-docker-image)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (.withFixedExposedPort (int http-port) 5601)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (.withNetwork network)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (.withStartupTimeout (Duration/ofSeconds 240))))
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- elasticsearch-official-docker-image)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj: container (FixedHostPortGenericContainer. image)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- network (Network/newNetwork)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- kibana (when kibana-port
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (build-kibana kibana-port network))]
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (let [containers (build-node http-port opts)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj: ^FixedHostPortGenericContainer node (:elasticsearch containers)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj: ^FixedHostPortGenericContainer kibana (:kibana containers)]
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (try
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (.start node)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (when kibana
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (let [containers (:containers this)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj: ^FixedHostPortGenericContainer node (:elasticsearch containers)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj: ^FixedHostPortGenericContainer kibana (:kibana containers)]
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (when node
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (.stop node))
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj- (when (get-in this [:opts :data-dir])
</shell_result>
Testcontainers FixedHostPortGenericContainer constructor 2.0 changes
<web_search_result>
Short answer: In Testcontainers 2.0 the old no-arg / String-image constructors (including FixedHostPortGenericContainer(String)) are deprecated/removed — FixedHostPortGenericContainer remains deprecated (you should avoid fixed host ports) and container constructors now require a DockerImageName instance (e.g. new GenericContainer(DockerImageName.parse("image:tag"))). Also many container classes were moved to module-specific packages. See release notes and API docs for details. [1][2][3][4]
References
- Testcontainers 2.x release notes (breaking changes: drop of module default/no-arg constructors, package moves). [1]
- FixedHostPortGenericContainer API (marked deprecated; shows constructor deprecated). [2]
- Testcontainers releases page (2.0.0 / 2.0.x changelog). [3]
- Deprecated constructors list (calls out FixedHostPortGenericContainer(String) deprecation). [4]
</web_search_result>
Major breaking API changes in Testcontainers 2.0.2 will cause compilation failures
The bump from 1.21.3 to 2.0.2 introduces breaking changes that will prevent the codebase from compiling:
FixedHostPortGenericContainer(String)constructor has been removed/deprecated in 2.0. The new API requiresDockerImageName.parse("image:tag").- This affects three modules that currently use the old constructor syntax:
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj—(FixedHostPortGenericContainer. redis-image)message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj—(FixedHostPortGenericContainer. elasticmq-image)elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj—(FixedHostPortGenericContainer. image)(2 instances)
All constructor calls must be updated to use DockerImageName.parse() before this version bump will work.
🤖 Prompt for AI Agents
In project.clj around lines 25 to 26, the Testcontainers bump to 2.0.2 breaks
code that uses the removed FixedHostPortGenericContainer(String) constructor;
update every call that does (FixedHostPortGenericContainer.
<image-var-or-literal>) to pass a DockerImageName instance instead, e.g.
(FixedHostPortGenericContainer. (DockerImageName/parse <image-var-or-literal>));
update the three affected files
(redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj,
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj,
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj) and add an
import or fully-qualify DockerImageName
(org.testcontainers.utility.DockerImageName) where necessary.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FixedHostPortGenericContainer is deprecated but is not removed. No change needed for that
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🌐 Web query:
Testcontainers 2.0.2 FixedHostPortGenericContainer constructor String parameter
💡 Result:
Yes — Testcontainers 2.0.2 provides a FixedHostPortGenericContainer(String dockerImageName) constructor, but the constructor is marked deprecated (use of fixed host ports is discouraged). [1][2]
Sources:
- Testcontainers 2.0.2 API index (FixedHostPortGenericContainer(String)). [1]
- FixedHostPortGenericContainer Javadoc showing the constructor deprecated in later 1.x docs. [2]
@TylerHeald1, you're absolutely right! I apologize for the confusion. The FixedHostPortGenericContainer(String) constructor is indeed still available in Testcontainers 2.0.2, though it's marked as deprecated. The version bump from 1.21.3 to 2.0.2 should work without requiring any code changes to the constructor calls.
Thank you for the clarification—the upgrade can proceed as-is! 👍
Codecov Report✅ All modified and coverable lines are covered by tests.
Additional details and impacted files@@ Coverage Diff @@
## master #2351 +/- ##
===========================================
- Coverage 58.17% 25.64% -32.54%
===========================================
Files 1063 1003 -60
Lines 72197 68792 -3405
Branches 2086 1021 -1065
===========================================
- Hits 42003 17642 -24361
- Misses 28255 50129 +21874
+ Partials 1939 1021 -918 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
I am the only one around today, so I will merge this. I see a green build in bamboo. |
Overview
What is the objective?
Fix failure to launch Docker with Testcontainers
What are the changes?
Updated testcontainers version
What areas of the application does this impact?
Local development, embedded services
Required Checklist
Additional Checklist
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.