Mysql 构建docker后如何运行程序
我正在努力构建一个docker映像,它将创建一个mysql docker容器。我有一个我写的小程序,它将创建我需要的数据库,并执行一些例行程序,将一些数据推送到数据库中。问题是我需要编程,以便在容器构建时自动执行 如果我手动运行该程序,它可以正常工作,但当我尝试在dockerfile或docker-entrypoint.sh中运行它时,它从未运行过。当容器运行此脚本时,服务器似乎没有完全启动,或者至少不能通过localhost访问?我想在docker容器构建之后,还有其他方法来运行自定义程序吗?还是解决方案正在我尝试访问数据库的过程中 编辑 这就是我的docker撰写文件内容Mysql 构建docker后如何运行程序,mysql,docker,Mysql,Docker,我正在努力构建一个docker映像,它将创建一个mysql docker容器。我有一个我写的小程序,它将创建我需要的数据库,并执行一些例行程序,将一些数据推送到数据库中。问题是我需要编程,以便在容器构建时自动执行 如果我手动运行该程序,它可以正常工作,但当我尝试在dockerfile或docker-entrypoint.sh中运行它时,它从未运行过。当容器运行此脚本时,服务器似乎没有完全启动,或者至少不能通过localhost访问?我想在docker容器构建之后,还有其他方法来运行自定义程序吗?
db:
build: ./databaseDocker
volumes:
- ./database:/var/lib/mysql
environment:
MYSQL_DATABASE: 'MyDatabaseName'
MYSQL_USER: 'company_root'
MYSQL_PASSWORD: '12345'
MYSQL_ROOT_PASSWORD: '123456'
ports:
- 3306:3306
networks:
- app-network
./databaseDocker文件夹中的Dockerfile
FROM mysql:5.7.34
COPY ./dbseeder /tmp/dbseeder
WORKDIR /tmp/dbseeder
RUN chmod 777 .
COPY ./db_custom_init.sh /docker-entrypoint-initdb.d/
EXPOSE 3306
包含我正在运行的命令的db_custom_init.sh文件
./DBSeedApp Param1 Param2
该应用程序是在家编写的,使用.net core根据一些参数在数据库中播种数据。应用程序正在尝试连接到数据库,如下所示:
string connectionString = $"server={host};port={port};user={username};pwd={password};database={databaseName};";
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.Connection = conn;
conn.Open();
//do stuff
conn.Close();
}
}
我可能不喜欢的一种解决方案是将数据种子植入外部数据库,并将SQL备份转储到docker容器中,以便直接通过mysql cli执行。但是,这种方法似乎不太有效,我确实希望直接使用docker mysql服务器
新尝试
我更改了我的初始化文件:
echo "Check DB!"
while ! mysqladmin ping -h localhost -u root -p123456; do
echo "Wait ..."
sleep 1
done
echo "DB ready!"
./DBSeedApp Param1 Param2
但运气不好,我也在程序中添加了以下内容:
private void VerifyConnections()
{
try
{
string connectionString = $"server={host};port={port};user={username};pwd={password};";
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
System.Console.WriteLine($"Trying to connect to {host}");
conn.Open();
System.Console.WriteLine($"Connection successful to {host}");
conn.Close();
}
}
catch (Exception)
{
System.Console.WriteLine($"Cannot connect to {host}");
}
}
但是运气不好,它证实了我找不到localhost db服务器。我还尝试指定db容器名称,但也不起作用
让它工作,但。。。
我用一个肮脏的黑客让它工作。我使用一个外部mysql服务器“构建我的种子”,然后从这个外部服务器转储一个sql文件
最后,我在程序上创建了一个dump参数,告诉它连接到外部服务器,构建种子,然后将其导出到sql文件中
然后我在init.sh文件上运行它
./dbseedapp DUMP param1 param2 ...
mysql -u root -p mydbname --binary-mode < /tmp/dbseeder/temp/dump.sql
/dbseedapp DUMP param1 param2。。。
mysql-u root-p mydbname——二进制模式
我曾经从外部mysql服务器生成sql文件
我想找到另一个解决方案,但目前这是我想到的最好的解决方案。如果有人有更好的主意。。。让我知道。如果您使用的是官方MySQL映像,这可能会对您有所帮助 第一次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量初始化该数据库。此外,它将执行扩展名为
.sh、.sql和.sql.gz
的文件,这些文件位于/docker entrypoint initdb.d
中。文件将按字母顺序执行
因此,如果您想在容器中推送一些数据,只需将备份文件
.sql
与此目录中的数据一起放置,/docker entrypoint initdb.d
当容器启动时,它将初始化数据检查docker compose我正在使用docker compose。。。我不明白这对我有什么帮助?你能进一步解释一下吗?你能发布shell脚本和docker文件吗?在没有看到代码的情况下很难确定问题所在。这是否回答了您的问题?在不知道具体问题的情况下,一种解决方案可能是检查服务器是否已启动并正在运行。看,这不是我的情况,我真的需要使用一个程序,将种子数据到数据库中。数据不能包含在sql文件中。。。我将尝试找到一种方法来转储SQL文件,但在此之前我仍然需要执行该程序@AlexandreSamson@AlexandreSamson是吗try@AlexandreSamson对不起,堆栈溢出移动应用程序是坏的,我的电脑崩溃了,这是一个好主意。。。但我不知道具体怎么做。我试试看