标签: docker-java

如何在基于Docker image的java:8-jdk-alpine中使curl可用并保持图像清洁?

我们正在使用运行curl命令的java代码来获取一些结果.

我们已经构建了一个jar文件,jar文件执行得很好

现在,当我们尝试doker化java程序(使用jar)并在docker中运行应用程序时,我们收到此错误:

errorjava.io.IOException: Cannot run program "curl": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at com.ps.api.common.CoreAPI_Spec.executeCoreAPI(CoreAPI_Spec.java:295)
    at com.ps.api.common.CoreAPI_Spec.getAccessTokens(CoreAPI_Spec.java:319)
Run Code Online (Sandbox Code Playgroud)

使用Dockerfile:

FROM ubuntu:16.04
MAINTAINER niro;

# Install prerequisites
RUN apt-get update && apt-get install -y \
curl

FROM java:8-jdk-alpine
# Set the working directory to /app
WORKDIR /Users/******/Desktop/CoreAPI_Jar

# Copy the current directory contents into the container at /app
ADD *******_Automation-0.0.1-SNAPSHOT-jar-with-dependencies.jar ******_Automation-0.0.1-SNAPSHOT-jar-with-dependencies.jar

# Run app.py when the container launches
CMD ["java", "-jar", "******-0.0.1-SNAPSHOT-jar-with-dependencies.jar"]
Run Code Online (Sandbox Code Playgroud)

java docker docker-java

22
推荐指数
2
解决办法
4万
查看次数

测试容器无法配置端口绑定

我正在使用 testcontainer 版本1.15.2。测试在 windows 10 上的 intellij 中运行。我有一个wiremock 容器。默认情况下它监听端口8080。我想将此端口映射到8081. 所以我这样做:

public WiremockContainer() {
    super("wiremock/wiremock:2.9.0-alpine");

    self()
            .waitingFor(Wait.forLogMessage(".*port:\\s*8080.*", 1)
                    .withStartupTimeout(Duration.ofSeconds(25L)))
            .withCreateContainerCmdModifier(cmd -> cmd.getHostConfig()
                    .withPortBindings(new PortBinding(Ports.Binding.bindPort(8081), new ExposedPort(8080)))
            )
            .withNetworkAliases("wiremock")
            .withExposedPorts(8081);
}
Run Code Online (Sandbox Code Playgroud)

创建容器时,它会侦听随机端口,而不是8081[1]。我究竟做错了什么 ?我应该怎么做才能让容器监听8081而不是随机端口?

[1]

  1. 我有另一个容器尝试连接http://wiremock:8081并不断获取Connection refused
  2. 当我添加:.waitingFor((...)forPort(8081)(...)));发生超时。

java spring-boot docker-java testcontainers testcontainers-junit5

9
推荐指数
2
解决办法
1万
查看次数

在 Java 中控制 docker-compose

我创建了相当多的 docker-compose 脚本,这些脚本产生了几个服务。我现在想控制 JVM 中的 docker-compose。基本上,我希望能够执行upand down,理想情况下带有-p <project name>参数,因此我可以同时生成多个实例。

这在Java中可能吗?

java docker docker-compose docker-java

7
推荐指数
1
解决办法
4427
查看次数

使用 docker-java 从 Amazon ECR 提取映像

我在使用 docker-java 客户端从 Amazon ECR 提取映像时遇到问题。ECR注册中心登录认证成功,但无法从存储库拉取特定镜像。奇怪的是,使用 bash 登录 ECR 并使用 docker 拉取镜像是有效的。

我正在使用 3.0 版本的 java-docker 库(https://github.com/docker-java/docker-java/)。有关如何调试或解决此问题的任何帮助都会很有用。

    // ECR client
    AmazonECRClient ecrClient = new AmazonECRClient(awsCredentialsProvider);
    GetAuthorizationTokenRequest getAuthTokenRequest = new GetAuthorizationTokenRequest();
    List<String> registryIds = new ArrayList<String>();
    registryIds.add("accountid");
    getAuthTokenRequest.setRegistryIds(registryIds);

    // Get Authorization Token
    GetAuthorizationTokenResult getAuthTokenResult = ecrClient.getAuthorizationToken(getAuthTokenRequest);
    AuthorizationData authData = getAuthTokenResult.getAuthorizationData().get(0);
    String userPassword = StringUtils.newStringUtf8(Base64.decodeBase64(authData.getAuthorizationToken()));
    String user = userPassword.substring(0, userPassword.indexOf(":"));
    String password = userPassword.substring(userPassword.indexOf(":")+1);

    DockerClientConfigBuilder config = new DockerClientConfigBuilder();
    config.withDockerHost("unix:///var/run/docker.sock");
    config.withDockerTlsVerify(false);
    config.withRegistryUsername(user);
    config.withRegistryPassword(password);
    config.withRegistryUrl(authData.getProxyEndpoint());
    config.build();

    DockerCmdExecFactory dockerCmdExecFactory = new DockerCmdExecFactoryImpl(); …
Run Code Online (Sandbox Code Playgroud)

java amazon-web-services docker docker-java

5
推荐指数
1
解决办法
2978
查看次数

如何使用 docker-java 创建并启动具有特定端口、分离模式的 Docker 容器

我想使用 docker java 客户端创建并运行 docker。我想运行这样的东西:

docker run -d -p 4444:4444 --name selenium-hub selenium/hub:2.53.0
Run Code Online (Sandbox Code Playgroud)

如何在docker-java客户端上执行这个命令?到目前为止,这是我的代码:

CreateContainerResponse response = dockerClient.createContainerCmd("selenium/hub")
               .withName(name)
               .exec();
Run Code Online (Sandbox Code Playgroud)

实际上我不知道如何指定 -d (用于在后台运行)。和-p。请帮我。抱歉,我是 Docker 新手。

docker docker-java

5
推荐指数
2
解决办法
3551
查看次数

使用 Docker exec 运行 Java 命令失败,并显示“没有此类文件或目录”

我在 Scala 项目中使用Docker Java 客户端以编程方式创建映像并启动带有卷的容器,然后当这一切完成后,还会在附加卷之一中可用的 jar 文件中执行 Java 类。

  // Constructing the container and getting it's ID
  val containerID = dockerClient
    .createContainerCmd(imageID)
    .withName(s"${namePrefix}_${RandomStringUtils.randomAlphanumeric(12)}")
    .withTty(true)
    .withVolumes(volume)
    .withBinds(new Bind("/home/core/docker-dependencies", new Volume("/opt/dependencies")))
    .exec()
    .getId
  // Starting the container
  dockerClient
    .startContainerCmd(containerID)
    .exec()
Run Code Online (Sandbox Code Playgroud)

我试图运行的命令:

val command = s"""bash -c "java -cp /opt/dependencies/Platforms-assembly-0.2.4.jar com.org.test.platforms.common.Endpoint param1 param2}""""
Run Code Online (Sandbox Code Playgroud)

命令中引用的 jar 文件在创建容器时绑定的卷中可用。

我尝试运行不同版本的命令,例如简单的 Java 命令(不带bash -c),我还尝试了不同的位置,例如本地 PC 上的文件位置或运行 Docker 的计算机上的路径,遗憾的是结果相同。

  // Preparing the command for execution
  val executionID = dockerClient
    .execCreateCmd(containerID)
    .withCmd(command)
    .exec()
    .getId
  // …
Run Code Online (Sandbox Code Playgroud)

docker docker-java

5
推荐指数
1
解决办法
2623
查看次数

TestContainers:重用来自 DockerComposeContainer 的网络以在其他 GenericContainer 中使用?

有一个方法:

org.testcontainers.containers.GenericContainer#withNetwork

我可以使用它来使用 TestContainers 库生成具有相同网络的容器。

但是 DockerComposeContainer 怎么样,首先我启动它,然后我想从中获取一个网络并在我跟随 GenericContainers 生成时重用相同的网络。

现在还有可能吗?

docker-compose docker-java testcontainers

5
推荐指数
0
解决办法
384
查看次数

docker-java/docker 远程 api 块直到容器完成

我正在尝试使用 docker-java 从 java 使用 docker 远程 API,并且我正在努力寻找一种方法来查看容器的执行何时完成:

 CreateContainerResponse container = dockerClient.createContainerCmd("me/vw:v0.1")
                .withVolumes(workingDIR)
                .withBinds(new Bind("/localDrive", workingDIR))
                .withCmd("vw", "/rcv1/rcv1.train.vw.gz", "--cache_file", "/rcv1/cache_train", "-f", "/rcv1/r_temp")
                .withLogConfig(logconf)
                .exec();
        dockerClient.startContainerCmd((container.getId())).exec();

        Thread.sleep(10000); //OBVIOUSLY BROKEN HACK IS BROKEN
        System.out.println("PRINTING LOGS");
        System.out.println(containerLog(container.getId(), dockerClient));
Run Code Online (Sandbox Code Playgroud)

检查容器是否完成的正常方法是什么?我是否必须编写一些轮询docker服务器的东西,或者是否有一些方便的阻塞函数/调用?docker-java有非常糟糕的文档,我所做的大部分工作都是通过查看测试用例来完成的。

干杯,

缺口

docker docker-java

4
推荐指数
1
解决办法
1742
查看次数

使用公司代理测试容器

不同测试容器的每次启动都会抛出com.github.dockerjava.api.exception.InternalServerErrorException: {"message":"Get https://quay.io/v1/_ping: dial tcp x.x.x.x: getsockopt: connection refused"}

这并不奇怪(docker 背后有一个公司代理)。如何配置 testcontainers 使用特定的 HTTP 代理?

另一种方法可能是禁用“ping”命令并​​使用我们公司的 docker 存储库。

java http-proxy docker docker-java testcontainers

4
推荐指数
1
解决办法
3736
查看次数

如何获得用Testcontainers执行的命令退出代码?

使用GenericContainer#execInContainer我只能得到stdout或stderr。

有什么方法可以获取已执行命令的退出代码吗?

我不能依靠stderr中文本的存在。我执行的应用程序将一些信息打印到stderr,但是退出并显示代码0。

docker-java testcontainers

2
推荐指数
1
解决办法
457
查看次数