【问题标题】:Detect Docker runtime on host using environment variables使用环境变量检测主机上的 Docker 运行时
【发布时间】:2019-04-25 22:17:34
【问题描述】:

我想使用 TestContainers 运行测试以验证 Flyway 迁移的正确执行。

使用 JUnit5,我想仅在运行 Docker 守护进程 (@EnabledIfSystemProperty(named = "docker...", matches = "")) https://junit.org/junit5/docs/current/user-guide/#writing-tests-conditional-execution-system-properties 的主机上启用这些测试。

我的问题是:如何使用环境变量检查主机上的 Docker 守护进程是否可用?

PS:我无权访问 CI 主机。

【问题讨论】:

    标签: docker junit5 testcontainers


    【解决方案1】:

    如果在此之前可以运行 bash,则可以运行:

    export IS_DOCKER_RUNNING =`cat /var/run/docker.pid`
    

    并检查环境变量是否为空或包含 id。

    【讨论】:

    • 感谢您的回答。不幸的是,我无权访问运行构建的主机。
    • 你不能把它放在 CI/CD 构建上吗?
    【解决方案2】:

    这涉及到几个变量(“调用用户是否有权限”是一个重要的检查;“我可以访问的 Docker 是否实际上是本地的”是另一个有趣的问题)并且不会有魔法告诉你这一点的环境变量。

    我可能会尝试运行一次性容器;类似于

    docker run --rm busybox /bin/true
    

    如果成功,则继续进行其他基于 Docker 的端到端测试。

    基于@NinaHashemi 的回答,如果它必须是环境变量,并且您可以在测试之前/周围运行 shell 脚本(任何 POSIX shell,不一定是 bash),那么您可以运行

    if docker run --rm busybox /bin/true >/dev/null 2>&1; then
        export IS_DOCKER_RUNNING=yes
    fi
    

    【讨论】:

    • 感谢您的回答。如前所述,我无权访问运行构建的主机。在运行测试之前,我将尝试在我的 Jenkinsfile 中创建这个变量(使用@NinaHashemi 的答案或你的答案)。
    • 你可以在 Groovy 中做类似的事情(在 Jenkins 流水线语言中),但我不是很精通。
    • 我最终决定使用 JUnit5 组和 Maven 配置文件 (dev/ci) 排除需要 Docker 运行时的测试,以保证本地构建(在开发机器上)和集成构建之间的行为相同。
    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多