GenericContainer не берет файлы для обработки

GenericContainer не обрабатывает файлы во время работы вне Testcontainers, работает нормально

Похоже, что контейнер как-то ограничен, не хватает ресурсов или каким-то образом заблокирован, или просмотр файла ведет себя неправильно с привязкой.

public class SimpleIntegrationTest {

    private static final Logger LOGGER = LoggerFactory.getLogger(SimpleIntegrationTest.class);

    @Rule
    public GenericContainer container = new GenericContainer<>(
            new ImageFromDockerfile()
                    .withDockerfileFromBuilder(builder ->
                            builder
                                    .from("ourproduct:latest")
                                    .workDir("/opt/ourproduct")
                                    .entryPoint("./Scripts/start.sh")
                                    .build()))
            .withExposedPorts(8080)
            .withFileSystemBind("/home/greg/share", "/share", BindMode.READ_WRITE)
            .withCreateContainerCmdModifier(cmd -> cmd.withHostName("somehost.com"))
            .waitingFor(Wait.forLogMessage(".*Ourproduct is Up.*\\n", 1).withStartupTimeout(Duration.ofSeconds(60)));

    @Test
    public void simpleExchangeTest() throws IOException, InterruptedException {

        LOGGER.info("Starting simple exchange test...");

        // copy input file
        InputStream request = ClassLoader.getSystemResourceAsStream("message.txt");
        File target = new File("/home/greg/share/input/message.txt");
        FileUtils.copyToFile(request, target);
        FileUtils.touch(target);

        // watch for response
        Path path = Paths.get("/home/greg/share/output");
        WatchService watchService = path.getFileSystem().newWatchService();
        path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);

        LOGGER.info("Waiting up to [{}] seconds for response file...", 30);
        WatchKey watchKey = watchService.poll(30, TimeUnit.SECONDS);

        if (watchKey != null) {
            watchKey.pollEvents().stream().forEach(event -> LOGGER.info(event.context().toString()));
        }

        LOGGER.info("Container logs...");
        LOGGER.info(container.getLogs());

    }
}

Очевидно, я ожидаю ответа в /home/greg/share/output, но он так и не приходит.

Отлично работает, когда я это делаю:

  1. docker run -itd --name cont --hostname somehost.com -p 8080:8080 --mount type=bind,source=/home/greg/share,target=/share ourproduct:latest
  2. docker exec -it cont bash

В контейнере

  1. cd /opt/ourproduct
  2. ./Scripts/start.sh

Внешний контейнер на хосте

  1. cp message.txt /home/greg/share/input/

Через несколько секунд я получаю ответ в home/greg/share/output Не в случае TestContainers...

EDIT: когда я добавляю тест:

Container.ExecResult execResult = container.execInContainer("./Scripts/status.sh");

Я получаю:

com.github.dockerjava.api.exception.ConflictException: {"message":"Container aac697315e3e22ccee4cdf805e6b1b325663bae054ab1104021c4da724cb4a5a is not running"}

Любая идея, что не так и почему он не работает?


person GrzegorzM    schedule 12.06.2019    source источник
comment
Может ли быть проблема с правами доступа к файлам?   -  person Nicola Ambrosetti    schedule 12.06.2019
comment
Контейнер запускается с правами root... так что, вероятно, нет. Но какая разница между CLI и Testcontainers в этом случае...   -  person GrzegorzM    schedule 12.06.2019
comment
когда я добавляю Container.ExecResult execResult = gtFrame.execInContainer(./Scripts/status.sh); Я получаю com.github.dockerjava.api.exception.ConflictException: {message:Container aac697315e3e22ccee4cdf805e6b1b325663bae054ab1104021c4da724cb4a5a не работает} Как это возможно, в чем может быть причина?   -  person GrzegorzM    schedule 12.06.2019
comment
Может быть, по какой-то причине контейнер немедленно выходит? Это объясняет, почему вы не получаете выходной файл.   -  person Nicola Ambrosetti    schedule 12.06.2019
comment
для CLI я использую опцию -itd, чтобы контейнер оставался. Как получить то же самое в TestContainers? кажется, есть проблема в моем коде. Такое же поведение для следующего: ` @Rule public GenericContainer test = new GenericContainer‹›(ubuntu:16.04) .withCreateContainerCmdModifier(cmd -> cmd.withHostName(the-cache)); Container.ExecResult execResult0 = test.execInContainer(ls, -al, /); `   -  person GrzegorzM    schedule 12.06.2019
comment
Разница в том, что когда вы запускаете docker напрямую, вы на самом деле запускаете bash с TTY. Таким образом, контейнер работает до тех пор, пока вы не выйдете из оболочки. В тесте вы вместо этого создаете образ, а затем запускаете контейнер на его основе. Поэтому, как только ваш статус.sh будет выполнен, он остановит контейнер. Я подозреваю, что status.sh закрывается до того, как ваш тест скопирует входной файл в контейнер.   -  person Nicola Ambrosetti    schedule 12.06.2019
comment
Это, скорее всего, правильно. Как это исправить и сохранить работоспособность контейнера во время тестов?   -  person GrzegorzM    schedule 12.06.2019
comment
@GregorzM Это полностью зависит от вашего приложения. Хранилище контейнеров, как только процессы, запущенные вашим status.sh, останавливаются   -  person Nicola Ambrosetti    schedule 12.06.2019
comment
Тогда как запустить этот простой ls -al / на Ubuntu из TestContainers? это тоже не работает...   -  person GrzegorzM    schedule 12.06.2019


Ответы (1)


добавление хвоста решило проблему

.entryPoint("./Scripts/start.sh && tail -f /dev/null")
person GrzegorzM    schedule 12.06.2019
comment
Это не относится к вашему сообщению/вопросу. Я вижу, что у вас есть некоторый опыт использования TestContainers, просто хотел посмотреть, не звонит ли что-нибудь в мою проблему: stackoverflow.com/questions/56674613/ - person chom; 22.06.2019