首页 > 解决方案 > Dockerfile 在入口点执行附加脚本

问题描述

我正在为glats/alpine-lamplamp的开发工作构建一个容器。我想在容器加载后运行一些额外的 sql 命令(创建数据库和一些测试用户)。我创建了一个新脚本,作为 Dockerfile 的入口点运行,如下所示:init.sh

FROM glats/alpine-lamp
ENV MYSQL_ROOT_PASSWORD=password
COPY init.sh /init.sh
RUN chmod u+x /init.sh
ENTRYPOINT ["/init.sh"]

在我的init.sh我正在执行父容器的入口点脚本,但是由于这个脚本不会退出并且不会在后台运行,所以我的添加永远不会被执行。我尝试了几种调用父脚本的不同方法,包括source entry.sh/bin/sh /entry.sh(/entry.sh). 我也尝试使用 将其发送到后台/entry.sh &,但这也不起作用。

当父脚本不退出时,向容器添加其他入口点脚本的正确方法是什么?

编辑:我的初始化脚本

#!/bin/sh
#run the parent container's entry script
/entry.sh &

# now run the rest of the stuff that needs to happen
mysql -u root -ppassword -e "CREATE DATABASE IF NOT EXISTS mydatabase"

标签: dockerdocker-entrypoint

解决方案


我认为基于在 mysql 运行后还有其他方法可以运行初始查询这一事实,您应该尝试从另一个角度解决这个问题。例如,您可以使用卷来设置显示./conf/docker-entrypoint-initdb.d 内容

编辑:您也可以将 .sh 文件放在目录中,而不仅仅是 .sql 文件。它们按字母顺序执行。这里这里有更好的解释


推荐阅读