Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash在docker上启动/bin/sh:git_Bash_Docker - Fatal编程技术网

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
,这就是为什么我喜欢executor
docker: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'