Java Testcontainers不运行FTP容器

Java Testcontainers不运行FTP容器,java,spring-boot,testcontainers,Java,Spring Boot,Testcontainers,我正在尝试使用FTP在Java中部署testcontainer private final static ImageFromDockerfile imageDockerFile = new ImageFromDockerfile().withFileFromClasspath("Dockerfile",

我正在尝试使用FTP在Java中部署testcontainer

private final static ImageFromDockerfile imageDockerFile = new ImageFromDockerfile().withFileFromClasspath("Dockerfile",
                                                                                                             "ftp_container/Dockerfile")
                                                                                      .withFileFromClasspath("vsftp.conf",
                                                                                                             "ftp_container/vsftp.conf")
                                                                                      .withFileFromClasspath("start.sh",
                                                                                                             "ftp_container/start.sh");


  public FtpContainer()
  {
    super(imageDockerFile);
    withCopyFileToContainer(MountableFile.forClasspathResource("ftp_container/vsftp.conf"),
                            "etc/vsftp/vsftp.conf");
    withCopyFileToContainer(MountableFile.forClasspathResource("ftp_container/start.sh"),
                            "/start.sh");
    withCommand("ftp");
  }
它开始时没有问题,但是容器没有出现,我无法连接到容器

Dockerfile是:

FROM centos

RUN yum -y install openssl vsftpd && rm -rf /var/cache/yum/*

RUN useradd -ms /bin/bash admin && echo 'admin:admin' | chpasswd

COPY vsftp.conf /etc/vsftp/vsftp.conf
COPY start.sh /

RUN chmod +x /start.sh
RUN mkdir -p /home/vsftpd/
RUN chown -R ftp:ftp /home/vsftpd/

VOLUME /home/admin
VOLUME /var/log/vsftpd

EXPOSE 21

ENTRYPOINT ["/start.sh"]
编辑:我添加我的开始。sh:

#!/bin/sh

CONF_FILE="/etc/vsftp/vsftp.conf"

echo "Launching vsftp on ftp protocol"

&>/dev/null /usr/sbin/vsftpd $CONF_FILE
如果容器“未出现”,它可能意味着三件事:

  • testcontainers的配置(在代码中)存在一些问题。在这种情况下,您很可能会在Java中看到异常,我假设这不是您的情况

  • 已触发
    start.sh
    ,但由于某种原因,进程已停止,docker容器本身也停止。在这种情况下,在测试容器代码的右边(实际使用它的代码之前)放置一个断点,到达该断点后运行
    docker ps
    。集装箱很可能不在那里。然后试着从
    docker ps-a
    了解是否有一个“最近死亡”的容器,它的日志显示了什么?(您可以尝试在start.sh中放置一个
    echo hello
    ,以检查它是否打印到stdout并由docker logs命令获取)

  • sh启动某种类型的服务器,但需要时间才能启动。我在某些类型的容器中看到了这种情况(这在很大程度上取决于
    start.sh
    的编写方式)。在本例中,使用断点执行相同的技巧,但这次当您运行
    docker ps
    时,您应该会看到docker进程启动并运行。 尝试等待一段时间并“继续”测试执行。如果您现在看到测试工作正常,您可以重写启动脚本,使其在服务准备就绪(端口可以接收连接)时不会返回,也可以在代码中添加“人工”等待(是的,我知道这听起来很糟糕,但有时您无法加固容器,因此这是您唯一的选择)


  • 好的,我会试着和echo hello和docker ps一起看。谢谢!所以它映射到我答案中的案例“2”,对吗?有人试图运行它吗?“docker ps-a”显示了什么?它在退出0时退出,在下面的评论中我显示了我的开始。sh你应该编辑你的问题,而不是添加答案,因为它实际上不是一个答案:)无论如何,这意味着离开testcontainers,你创建的docker映像也应该立即以0退出,对吗?在这种情况下,我建议尝试构建映像(使用docker build命令),并在开始使用testcontainers之前从命令行开始。。。我怀疑它来自配置文件,但我不熟悉这个具体的ftp服务器,所以我无法对它发表评论,因为我也尝试过构建映像,但没有成功。您知道另一个ftp服务器要放入testcontainers吗?