添加新的依赖项时软件包会卸载吗?

时间:2020-01-09 20:33:46

标签: 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 "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以及git并使用bash运行load_git.sh脚本。我正在文学上每隔一行记录日志,但是在load_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镜像并在本地启动时,它运行良好。

2 个答案:

答案 0 :(得分:1)

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

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

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

RUN apk add bash git

,还要考虑您是否实际上需要使用这些工具之一来运行映像中打包的应用程序。)

答案 1 :(得分:0)

我尝试重现此内容,并在远程计算机上使用以下脚本进行管理:

#!/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

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.224207)
Executing busybox-1.31.1-r8.trigger
OK: 15 MiB in 20 packages
OK: 15 MiB in 20 packages
bash works

所以我认为这是apk中的计时问题