我们正在使用运行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) 我正在使用 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]
http://wiremock:8081
并不断获取Connection refused
.waitingFor((...)forPort(8081)(...)));
发生超时。java spring-boot docker-java testcontainers testcontainers-junit5
我创建了相当多的 docker-compose 脚本,这些脚本产生了几个服务。我现在想控制 JVM 中的 docker-compose。基本上,我希望能够执行up
and down
,理想情况下带有-p <project name>
参数,因此我可以同时生成多个实例。
这在Java中可能吗?
我在使用 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) 我想使用 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 新手。
我在 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) 有一个方法:
org.testcontainers.containers.GenericContainer#withNetwork
我可以使用它来使用 TestContainers 库生成具有相同网络的容器。
但是 DockerComposeContainer 怎么样,首先我启动它,然后我想从中获取一个网络并在我跟随 GenericContainers 生成时重用相同的网络。
现在还有可能吗?
我正在尝试使用 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
有非常糟糕的文档,我所做的大部分工作都是通过查看测试用例来完成的。
干杯,
缺口
不同测试容器的每次启动都会抛出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 存储库。
使用GenericContainer#execInContainer
我只能得到stdout或stderr。
有什么方法可以获取已执行命令的退出代码吗?
我不能依靠stderr中文本的存在。我执行的应用程序将一些信息打印到stderr,但是退出并显示代码0。