Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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 添加新依赖项时是否卸载包?_Bash_Shell_Docker_Alpine - Fatal编程技术网

Bash 添加新依赖项时是否卸载包?

Bash 添加新依赖项时是否卸载包?,bash,shell,docker,alpine,Bash,Shell,Docker,Alpine,在基于alpine linux的docker入口点脚本中,我有以下几行代码: #!/bin/sh echo "============== START ============" echo $@ NOLOAD=0 FILE="" RET=1 if [ ! -f /initialized ]; then echo "not initialized" apk add --virtual .init-deps bash echo "bash installed" echo "Bu

在基于alpine linux的docker入口点脚本中,我有以下几行代码:

#!/bin/sh
echo "============== START ============"
echo $@
NOLOAD=0
FILE=""

RET=1

if [ !  -f /initialized ]; then
  echo "not initialized"
  apk add --virtual .init-deps bash
  echo "bash installed"
  echo "Building from server"
  apk add --virtual .init-deps git
  echo "git installed"
  bash load_git.sh "${GIT_SERVER}" "${GIT_USERNAME}" "${GIT_PASSWORD}" "${GIT_BRANCH}"
  RET=$?
  echo cloning done
fi
echo "just before purging all dependencies"
apk --purge del .init-deps
我希望安装
bash
,以及使用bash运行
load\u git.sh
脚本。我每隔一行写一次日志,但在
load\u git.sh
脚本运行之前,我得到了一些奇怪的结果:

============== START ============

not initialized
(1/6) Installing ncurses-terminfo-base (6.1_p20191130-r0)
(2/6) Installing ncurses-terminfo (6.1_p20191130-r0)
(3/6) Installing ncurses-libs (6.1_p20191130-r0)
(4/6) Installing readline (8.0.1-r0)
(5/6) Installing bash (5.0.11-r1)
Executing bash-5.0.11-r1.post-install
(6/6) Installing .init-deps (20200109.202215)
Executing busybox-1.31.1-r8.trigger
OK: 18 MiB in 24 packages
bash installed
Building from server
(1/12) Installing ca-certificates (20191127-r0)
(2/12) Installing nghttp2-libs (1.40.0-r0)
(3/12) Installing libcurl (7.67.0-r0)
(4/12) Installing expat (2.2.9-r1)
(5/12) Installing pcre2 (10.34-r1)
(6/12) Installing git (2.24.1-r0)
(7/12) Upgrading .init-deps (20200109.202215 -> 20200109.202216)
(8/12) Purging bash (5.0.11-r1)
Executing bash-5.0.11-r1.pre-deinstall
(9/12) Purging readline (8.0.1-r0)
(10/12) Purging ncurses-libs (6.1_p20191130-r0)
(11/12) Purging ncurses-terminfo (6.1_p20191130-r0)
(12/12) Purging ncurses-terminfo-base (6.1_p20191130-r0)
Executing busybox-1.31.1-r8.trigger
Executing ca-certificates-20191127-r0.trigger
OK: 25 MiB in 25 packages
git installed
/init.sh: line 17: bash: not found
cloning done
outside if statement to get source
just before purging all dependencies
Build failed, starting shell
我无法理解这样一个事实:在安装git时,它也会清除bash,这一点都没有意义


编辑:只有在synology nas中通过ssh连接启动docker时,使用本地docker映像并在本地启动时,才会发生这种情况。我尝试在远程计算机上复制这种情况,并使用下面的脚本进行管理:

#!/bin/sh
if [ !  -f /initialized ]; then
  apk add --virtual .init-deps bash
  apk add --virtual .init-deps git
  bash -c "bash works"
fi
但连续运行会产生不同的结果:

ubuntu@dev:~$ docker run c81a2d3a5f6b
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz
(1/6) Installing ncurses-terminfo-base (6.1_p20191130-r0)
(2/6) Installing ncurses-terminfo (6.1_p20191130-r0)
(3/6) Installing ncurses-libs (6.1_p20191130-r0)
(4/6) Installing readline (8.0.1-r0)
(5/6) Installing bash (5.0.11-r1)
Executing bash-5.0.11-r1.post-install
(6/6) Installing .init-deps (20200109.224208)
Executing busybox-1.31.1-r8.trigger
OK: 15 MiB in 20 packages
(1/12) Installing ca-certificates (20191127-r0)
(2/12) Installing nghttp2-libs (1.40.0-r0)
(3/12) Installing libcurl (7.67.0-r0)
(4/12) Installing expat (2.2.9-r1)
(5/12) Installing pcre2 (10.34-r1)
(6/12) Installing git (2.24.1-r0)
(7/12) Upgrading .init-deps (20200109.224208 -> 20200109.224209)
(8/12) Purging bash (5.0.11-r1)
Executing bash-5.0.11-r1.pre-deinstall
(9/12) Purging readline (8.0.1-r0)
(10/12) Purging ncurses-libs (6.1_p20191130-r0)
(11/12) Purging ncurses-terminfo (6.1_p20191130-r0)
(12/12) Purging ncurses-terminfo-base (6.1_p20191130-r0)
Executing busybox-1.31.1-r8.trigger
Executing ca-certificates-20191127-r0.trigger
OK: 22 MiB in 21 packages
/test.sh: line 5: bash: not found


因此,我认为这是apk中的一个计时问题。看起来这里发生的是,
apk add--virtual.init deps
选项创建了一个虚拟包,并使它依赖于刚刚安装的其他包。当您第二次这样做时,它将创建一个新的虚拟包,该虚拟包(仅)依赖于第二组包,并将虚拟包升级到新版本;执行此操作时,第一组软件包将自动卸载

这里有两个简单的解决方法:从两行中删除此
--virtual.init deps
选项,或者将所有安装合并到一个
apk add
行中

(在容器启动时下载包通常不是很好的做法,特别是因为删除和重新创建容器是一个相当常规的操作。更好的做法是在映像的Dockerfile中执行一次

RUN apk add bash git

还要考虑你是否真的需要这些工具来运行在你的映像中打包的应用程序。)< /P>在Loop-Git?SH中什么?另一个脚本(应该从Git中下载的最新版本下载)。脚本顶部有一个回声,我知道它没有运行。放置echo“outdir”显示其中一个(返回变量设置为nor)。容器将在第一次加载时从git下载代码,并使用bash实际处理git中的潜在错误,并显示良好的日志。由于在初始加载bash和git之后不再需要,或者如果我使用另一种源代码管理方案(如hg/svn)需要安装另一个包,我认为最好动态安装这些包,我建议的方法是在运行Docker之前在主机上克隆存储库,然后在Docker文件中

将应用程序源复制到映像中。然后映像是应用程序的固定独立副本,它不依赖于启动时是否有源代码管理工具(或其凭据),如果外部源代码管理系统不可用,容器也不会失败。
RUN apk add bash git