bash在docker:git上启动/ bin / sh

时间:2018-07-17 09:57:50

标签: bash docker

在我的计算机上bashdocker:git上一直持续。

~ # bash
bash-4.4# ps
PID   USER     TIME   COMMAND
    1 root       0:00 sh
   26 root       0:00 bash
   32 root       0:00 ps
bash-4.4# echo $0
bash
bash-4.4# echo $SHELL
/bin/ash

ash似乎有些不安,但是我可以运行#!/bin/bash文件,到目前为止还可以。

但是,在gitlab.com上的Gitlab CI上,命令bash不会返回任何内容,但它似乎不会继续运行。为什么会这样?

$ apk add --update bash
$ bash
$ ps && pwd && echo $0 && echo $SHELL && ls /bin
PID   USER     TIME   COMMAND
    1 root       0:00 /bin/sh
   10 root       0:00 /bin/sh
   25 root       0:00 ps
/builds/230s/industrial_calibration
/bin/sh

ash
base64
bash
bashbug
:

计算机上更详细的输出:

$ lsb_release -a|grep Description
No LSB modules are available.
Description:    Ubuntu 16.04.4 LTS
$ docker pull docker:git
$ docker images | grep -i docker
docker    git    5c58d1939c5d        10 days ago         152MB
$ docker run -it docker:git

~ # apk add --update bash
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
:
(10/10) Installing tar (1.29-r1)
Executing busybox-1.27.2-r11.trigger
OK: 37 MiB in 31 packages
~ # bash
bash-4.4# ps
PID   USER     TIME   COMMAND
    1 root       0:00 sh
   26 root       0:00 bash
   32 root       0:00 ps
bash-4.4# echo $0
bash
bash-4.4# echo $SHELL
/bin/ash

.gitlab-ci.yml使用(由于传递的文件使用bash特定的语法,因此在最后一行失败):

image: docker:git
before_script:
  - apk add --update bash coreutils tar  # install industrial_ci depedencies
  - bash
  - git clone https://github.com/plusone-robotics/industrial_ci.git .ci_config -b gitlab_modularize
  - ps && pwd && echo $0 && echo $SHELL && ls /bin
  - source ./.ci_config/industrial_ci/src/tests/gitlab_module.sh

更新:在bash -c中购买基于bash的文件确实有效,但是对我来说可能没有用,因为我真正想要的是使用该文件中定义的函数,并且因为{ {1}}行终止并且不携带上下文,该功能将在后面的IMO行中不可用。

bash -c

1 个答案:

答案 0 :(得分:0)

image: alpine
before_script:
  - apk add --update bash coreutils tar
  - bash
  - echo smth

现在假设您是计算机。您等待每个命令完成后再执行下一个命令,而无需使用键盘。所以你会怎么做?让我们尝试使用Alpine,用;替换换行符:

$ docker run -ti --rm alpine sh -c 'apk add --update bash; bash; echo smth'
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/6) Installing pkgconf (1.3.10-r0)
(2/6) Installing ncurses-terminfo-base (6.0_p20171125-r0)
(3/6) Installing ncurses-terminfo (6.0_p20171125-r0)
(4/6) Installing ncurses-libs (6.0_p20171125-r0)
(5/6) Installing readline (7.0.003-r0)
(6/6) Installing bash (4.4.19-r1)
Executing bash-4.4.19-r1.post-install
Executing busybox-1.27.2-r7.trigger
OK: 13 MiB in 17 packages
bash-4.4# 

您不要触摸键盘。您可以无休止地等待bash-4.4#行消失,因为bash会无休止地等待您键入任何内容。 echo smth命令将永远不会执行,gitlab将超时,等待bash结束。
现在,如果您想使用gitlab-ci在bash中使用bash在高山中执行某些操作,我建议您这样做:创建一个可执行脚本ci-myscript.sh,您将其添加并提交到您的仓库中:

 $ cat ci-myscript.sh
 #!/bin/bash
 git clone https://github.com/plusone-robotics/industrial_ci.git .ci_config -b gitlab_modularize
 ps && pwd && echo $0 && echo $SHELL && ls /bin
 source ./.ci_config/industrial_ci/src/tests/gitlab_module.sh

第一行#!/bin/bash告诉Shell应该在bash下执行此脚本。现在,从您的gitlab-ci中运行:

image: docker:git
before_script:
  - apk add --update bash coreutils tar
  - ./ci-myscript-sh

创建这样的脚本实际上是一个很好的工作流程,因为您可以先在计算机上本地测试脚本,然后再在gitlab-ci中对其进行测试。
另一种选择是按@Mazel在注释中建议的单次调用bash。

image: docker:git
before_script:
  - apk add --update bash coreutils tar
  - bash -c 'git clone https://github.com/plusone-robotics/industrial_ci.git .ci_config -b gitlab_modularize; ps && pwd && echo $0 && echo $SHELL && ls /bin; source ./.ci_config/industrial_ci/src/tests/gitlab_module.sh'

那样,您需要在一行中调用所有内容,因为下一行与上一行不会具有相同的环境。