Как запустить смонтированный shell-скрипт внутри контейнера docker? - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь запустить смонтированный сценарий оболочки внутри контейнера docker, выполнив следующие действия:

  1. этап сборки: сборка docker образа.
  2. этап тестирования: монтирование каталога в контейнер во время выполнения с файлом сценария оболочки внутри.
  3. этап тестирования: запуск оболочки- файл сценария из docker.

Может кто-нибудь объяснить, как это должно быть сделано?

см. строку: #- ?? HERE I SHOULD RUN THE TEST: /test/check.sh ??

services:
    - docker:dind

stages:
    - build
    - test

before_script:
        - docker info

# Build the docker image
build:
    image: docker:latest
    services:
        - docker:dind
    before_script:
        - docker login docker.example.com -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
    only:
        - master
    script:
        - docker build -t our-docker .
        - docker save our-docker > our-docker.tar
    artifacts:
        paths:
            - our-docker.tar
        expire_in: 1 week

    stage: build


test:
    image: docker:latest
    only:
        - master
    script:
        - docker load < our-docker.tar
        - docker run --volume source="$(pwd)/test",target="/test" our-docker
        #- ?? HERE I SHOULD RUN THE TEST: /test/check.sh ??
    stage: test

1 Ответ

0 голосов
/ 06 февраля 2020

Во-первых, возникла проблема с самой командой docker run:

docker run --volume source="$(pwd)/test",target="/test" our-docker  # buggy

в качестве синтаксиса для установки bind-mount :

  • либо docker run -v "$PWD/test":"/test" our-docker
    (-v - краткая форма --volume)
  • или docker run --mount type=bind,source="$PWD/test",target="/test" our-docker

( Примечание: Выше я заменил "$(pwd)" на специальную переменную оболочки "$PWD", которая предотвращает вращение еще одного процесса.)

Далее, вы не можете просто добавить строку /test/check.sh после строки docker run, потому что вам точно нужно выполните эту команду в контексте docker run. С этой целью вы можете использовать шаблон, который я предложил в этом другом потоке SO: Как мне установить docker -credential-ecr-login в моем PATH, прежде чем что-либо еще в GitLab CI (который содержит подробности / замечания о set -e, кавычках и экранировании в контексте этого шаблона).

Заключение

Точнее, не могли бы вы попробовать следующую адаптацию вашего .gitlab-ci.yml ? (Я добавил несколько ls команд, которые должны помочь в отладке вашей конфигурации):

services:
  - docker:dind

stages:
  - build
  - test

before_script:
  - docker info

# Build the docker image
build:
  image: docker:latest
  services:
    - docker:dind
  before_script:
    - docker login docker.example.com -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
  only:
    - master
  script:
    - docker build -t our-docker .
    - docker save our-docker > our-docker.tar
  artifacts:
    paths:
      - our-docker.tar
    expire_in: 1 week
  stage: build

test:
  image: docker:latest
  # note: use /bin/sh below as this image doesn't provide /bin/bash
  only:
    - master
  script:
    - docker load < our-docker.tar
    - echo "$PWD"
    - ls
    - ls -Rhal test
    - |
      docker run --rm -v "$PWD/test":"/test" our-docker /bin/sh -c "
        set -ex
        ls -Rhal /test
        /test/check.sh
      "
  stage: test
...