bash在docker上启动/bin/sh:git
在我的电脑上,bash在docker上启动/bin/sh:git,bash,docker,Bash,Docker,在我的电脑上,bash在docker: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文件,所以到目前为止
bash
在docker: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
特定语法,因此在最后一行失败):
更新:在
bash-c
中查找基于bash的文件确实有效,但它可能对我没有用处,因为我真正想要的是使用该文件中定义的函数,并且由于bash-c
行终止并且不携带上下文,因此该函数在后面的行中不可用
- /bin/bash -c "source ./.ci_config/industrial_ci/src/tests/gitlab_module.sh"
- pass_sshkey_docker
现在想象你的电脑。在执行下一个命令之前,您要等待每个命令完成,而不使用键盘。那你是做什么的?让我们用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在alpine中使用bash执行某些操作,我建议您这样做:创建一个可执行脚本ci myscript.sh
,git将其添加并提交到您的repo:
$ 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'
这样,您需要在一行中调用所有内容,因为下一行的环境与前一行不同。您是否可以尝试使用-c
选项直接在bash中运行命令,例如/bin/bash-c“git clone…&&ps&&pwd”
@MazelTov我已经更新了我的帖子以回答您的评论。另一个选项可能是创建自己的映像,您将使用docker:git的,然后只需安装bash并将入口点设置为bash,而不是sh(或ash)然后在管道中使用该图像…还有gitlab ci,我学会了在不使用-t选项的情况下使用docker run-i
,这样我的命令可以工作,并且可以检测出退出代码。。。示例:docker run-i my_image/test_unit.sh
,这就是为什么我喜欢executordocker:dind
:-)bash-c'source foo;“$@”中的一些函数
image: docker:git
before_script:
- apk add --update bash coreutils tar
- ./ci-myscript-sh
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'