【问题标题】:Testcontainers does not run FTP containerTestcontainers 不运行 FTP 容器
【发布时间】:2020-08-14 16:41:58
【问题描述】:

我正在尝试使用 FTP 在 Java 中部署一个测试容器,

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"]

编辑:我添加了我的 start.sh:

#!/bin/sh

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

echo "Launching vsftp on ftp protocol"

&>/dev/null /usr/sbin/vsftpd $CONF_FILE

【问题讨论】:

    标签: java spring-boot testcontainers


    【解决方案1】:

    如果容器“没有出现”,它可能意味着三件事:

    1. 测试容器的配置存在一些问题(在代码中)。在这种情况下,您可能会在 Java 中看到异常,我认为这不是您的情况

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

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

    【讨论】:

    • 好的,我会尝试使用 echo hello 和 docker ps 来查看它。谢谢!
    • 所以它映射到我的答案的情况“2”,对吧?有没有尝试运行它? “docker ps -a”显示什么?
    • 它以 Exit 0 退出,在下面的评论中我显示了我的 start.sh
    • 您应该编辑您的问题,而不是添加答案,因为它不是真正的答案:) 无论如何,这意味着不管测试容器,您创建的 docker 映像也应该立即以 0 退出, 正确的?在这种情况下,我建议尝试构建映像(使用 docker build 命令)并在开始使用 testcontainers 之前从命令行开始......我怀疑它来自配置文件,但我不熟悉这个具体的ftp 服务器,所以我无法对此发表评论
    • 我也尝试构建图像但不起作用。你知道另一个要放入测试容器的 ftp 服务器吗?
    猜你喜欢
    • 2022-01-08
    • 2020-04-22
    • 2019-01-17
    • 2020-01-02
    • 2019-11-01
    • 2020-08-13
    • 2020-11-20
    • 2018-06-27
    • 2022-10-20
    相关资源
    最近更新 更多