bash - 似乎入口点和 shell 形式的 cmd 都是单独执行的
问题描述
我有一个从公共 IBM Db2 映像构建的自定义映像,该映像具有一个执行初始化的入口点。为了在启动时创建多个数据库,我编写了自己的 init.sh 并将其放在 CMD 子句中。'docker ps' 中的命令如下:
/var/db2_setup/lib/setup_db2_instance.sh /bin/sh -c /init.sh
init.sh 是
#!/bin/sh
su - db2inst1 << EOF
export PATH=$PATH:/opt/ibm/db2/V11.1/bin
db2 create database DB1
db2 create database DB2
db2 create database DB3
EOF
据我所知,应该忽略以下“/bin/sh -c /init.sh”,因为我检查了 setup_db2_instance.sh 文件,其中没有处理像 /bin/sh 这样的参数的代码。
但是db2初始化成功,三个db都创建好了。有没有人遇到过这种情况或有任何参考解释为什么会发生这种情况?
解决方案
入口点和命令之间的关系是:命令是入口点的参数。这就是为什么您现在看到奇怪的命令的原因,因为 /var/db2_setup/lib/setup_db2_instance.sh 可能是图像的默认入口点,并且您通过命令传递将 /bin/sh -c /init.sh 作为参数添加到它。因此,对于您的情况,您需要覆盖容器的入口点而不是命令。
因此,您可以输入入口点:/bin/sh 和命令:-c /init.sh 并导致启动 docker 将是:/bin/sh -c /init.sh
或者你可以把空的入口点和完整的命令放在命令部分,或者把空的命令部分和完整的命令放在入口点 - 由你决定。
推荐阅读
- android - 使用 altbeacon 停止和重新启动前台服务扫描
- vba - 在 PrintOptions 下添加范围并在变量中确定它
- asp.net - 如何让 dropdownlist_selectedindexchange 先触发
- charts - 在 Google Chart 上显示独立的 x 轴系列
- xamarin - Xamarin 是否将 Forms 应用程序转换为 Java,如果没有,那么它如何在 Android 上运行?
- generics - 如何在 Rust 中转换泛型原始类型?
- r - 在 R 中通过引用传递列表并添加到列表
- python - 从同一笔记本中不同单元格中的类创建类对象
- c# - 如何删除多维数组中的项目,它会改变数组长度吗?
- ruby - 如何将 redmine 插件升级到 rails 5,现在不推荐使用 alias_method_chain