Как заставить curl вызывать контейнер docker, работающий внутри другого контейнера docker?

#docker

#docker

Вопрос:

Мое приложение — это приложение с весенней загрузкой, запущенное на порту 8080. Ниже приведен пример сценария. Одна часть взята из gitlab-pipeline, а две другие — before и run script.

Внутри конвейера Gitlab:

 stages:
  - performance

#Run performance test
load_performance:
  stage: performance
  when: manual
  before_script:
    - source ./scripts/gitlab/perf-test/before-script.sh
  script:
    - echo "Running load test"
    - source ./scripts/gitlab/perf-test/run_gatling.sh
  after_script:
    - ls -ltra ./scripts/performance-test/gatling
  artifacts:
    paths:
      - "./scripts/performance-test/gatling/results"
    expire_in: 1 week
    when: always
 

before-script.sh : Этот скрипт загружает изображение gatling и моего приложения и запускает его в отключенном режиме.

 
LOCALHOST="host.docker.internal"
BASE_URL="http://${LOCALHOST}:8080"


echo "Pulling Gatling image"
docker pull denvazh/gatling


echo "Start my-service2"
starttime=`date  %s`

docker run --ulimit nofile=65536:200000 -itd -p 8080:8080 --name my-service 
-v /var/run/docker.sock:/var/run/docker.sock 
-v $DIR:/opt/app 
gcr.io/com-gcr/my-service-java:jdk-X.X.X_X 
/bin/bash -c "cd /opt/app amp;amp; ls -ltra amp;amp; source .envrc 
          amp;amp; ./gradlew clean bootRun"


 

run_gatling.sh : этот скрипт проверяет, работает my-service или нет. Если он включен, запустите тест стробирования.

 sleep 5
docker inspect -f '{{ .NetworkSettings.IPAddress }}' my-service

while ! curl http://localhost:8080/actuator/health ## this condition always fail but on local it passes after 1-2 minutes
do
    echo "waiting on my-service to up"
    docker logs --tail=10 my-service
    sleep 30
done

echo "my-service up. It took $(($(date  '%s') - starttime)) seconds."



echo "Starting test:"
starttime=`date  %s`

docker run -it --rm -v $DIR/scripts/performance-test/gatling/conf:/opt/gatling/conf 
-v $DIR/scripts/performance-test/gatling/user-files:/opt/gatling/user-files 
-v $DIR/scripts/performance-test/gatling/results:/opt/gatling/results 
-e JAVA_OPTS="-Dduration=$DURATION -DbaseUrl=$BASE_URL -DmaxRequest=MAX_REQUEST" 
denvazh/gatling -rd performance_tests

docker stop my-service
docker rm my-service


echo "Test complete. It took $(($(date  '%s') - starttime)) seconds."

 

Комментарии:

1. localhost в Docker обычно означает «этот контейнер», поэтому, если второй контейнер выполняет буквально curl http://localhost... , он не достигает контейнера приложения. Можете ли вы предоставить часть фактического кода в этой настройке?

2. Привет @DavidMaze, я добавил псевдокод. Мой код работает на локальном компьютере. На локальном хост-порту 8080 все запросы пересылаются на контейнерный порт 8080, но это не работает внутри gitlab runner.