簡體   English   中英

如何在 docker 容器內運行已安裝的 shell 腳本?

[英]How to run a mounted shell-script inside a docker container?

我正在嘗試按照以下步驟在 docker 容器內運行已安裝的 shell 腳本:

  1. 構建階段:構建 docker 鏡像。
  2. 測試階段:在運行時將一個目錄掛載到容器中,其中包含一個 shell-script 文件。
  3. 測試階段:從 docker 內部運行 shell-script 文件。

有人可以解釋一下應該如何做嗎?

見行: #- ?? HERE I SHOULD RUN THE TEST: /test/check.sh ?? #- ?? 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

首先, docker run命令本身存在問題:

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

因為設置綁定安裝的語法是:

  • 要么docker run -v "$PWD/test":"/test" our-docker
    -v--volume的縮寫形式)
  • docker run --mount type=bind,source="$PWD/test",target="/test" our-docker

注意:我用特殊的 shell 變量"$PWD"替換了上面的"$(pwd)" ,以避免旋轉另一個進程。)

接下來,你不能只是追加行/test/check.shdocker run線路,因為你正好需要的范圍內運行該命令docker run 為此,您可能想使用我在另一個 SO 線程中提出的模式:如何在 GitLab CI 中的任何其他內容之前在我的 PATH 中設置 docker-credential-ecr-login (其中包含有關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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM