如何在Docker容器中运行已安装的Shell脚本?

时间:2020-01-31 13:35:01

标签: docker gitlab gitlab-ci

我正在尝试通过以下步骤在Docker容器中运行已安装的shell脚本:

  1. 构建阶段::构建docker映像。
  2. 测试阶段:在运行时将目录安装到容器中,其中包含shell脚本文件。
  3. 测试阶段:从docker内部运行shell脚本文件。

有人可以解释该怎么做吗?

查看行: #- ?? 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 :(得分:0)

首先,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)"上方替换了特殊的shell变量"$PWD",这样可以避免旋转另一个进程。)

接下来,您不能仅在/test/check.sh行之后追加docker run行,因为您确实需要在docker run 上下文中运行该命令。为此,您可能要使用我在另一个SO线程中建议的模式:How do I set docker-credential-ecr-login in my PATH before anything else in 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