Testcontainers не запускает контейнер FTP - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь развернуть тестконтейнер в Java с FTP,

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

1 Ответ

1 голос
/ 30 апреля 2020

Если контейнер «не появляется», это может означать три вещи:

  1. Существует некоторая проблема с конфигурацией тестовых контейнеров (в коде). В этом случае есть вероятность, что вы увидите исключение в Java, я предполагаю, что это не ваш случай

  2. start.sh был запущен, но по какой-то причине процесс умер и контейнер docker сам умер. В этом случае поместите точку останова справа после кода тестового контейнера (перед кодом, который фактически его использует), и как только вы достигнете этой точки останова, выполните docker ps. Скорее всего, контейнера там не будет. Затем попытайтесь понять из docker ps -a, был ли «недавно умерший» контейнер и что показывают его журналы? (вы можете попытаться ввести echo hello в начало. sh, чтобы проверить, что он выводится на стандартный вывод и выбирается командой docker logs)

  3. Начало. sh запускает какой-то сервер, но до его запуска требуется время. Я видел, что это происходит для некоторых типов контейнеров (это в значительной степени зависит от того, как написано start.sh). В этом случае проделайте тот же трюк с точкой останова, но на этот раз, когда вы запустите docker ps, вы увидите, что процесс docker запущен и работает. Попробуйте немного подождать и «продолжить» выполнение теста. Если вы видите, что тест работает сейчас, вы можете либо переписать сценарий запуска, чтобы он не возвращался, когда служба будет готова (порт может принимать соединения), либо добавить «искусственное» ожидание в коде (да, я знаю это звучит плохо, но иногда вы не можете взять контейнер с собой, так что это ваш единственный выбор).

...