我正在努力建立一个码头形象,将使mysql码头容器。我有一个我写的小程序,它将创建我需要的数据库,并执行一些例程来推送其中的一些数据。问题是我需要编写程序,以便在构建容器时自动执行。
如果我手动运行它,程序运行得很好,但是当我尝试在dockerfile或docker-entrypoint.sh中运行它时,它从来没有运行过。当容器运行这个脚本时,服务器似乎没有完全启动,或者至少不能通过localhost访问?我猜在构建docker容器之后还有其他方法来运行自定义程序吗?或者解决方案就在我尝试访问数据库的方式上?
编辑
这就是我的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核心根据一些参数在数据库中播种数据。应用程序正在尝试连接到数据库,如下所示:
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.However执行,这种方法似乎效率低下,我真的希望直接使用docker mysql服务器。
新尝试
我将我的init文件更改为:
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文件。
我最终在我的程序上创建了一个转储参数,告诉它连接到外部服务器,构建种子,然后将其导出到sql文件中。
然后,我在我的init.sh文件上运行以下代码
./dbseedapp DUMP param1 param2 ...
mysql -u root -p mydbname --binary-mode < /tmp/dbseeder/temp/dump.sql我使用MysqlBackup.Net从外部mysql服务器生成sql文件。
我想找到另一个解决方案,但目前这是我想出的最好的解决方案。如果有人有更好的主意..。让我知道。
发布于 2021-05-27 12:16:46
如果你使用的是官方的MySQL图片,这可能会对你有所帮助。
容器首次启动时,会创建一个指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行在/docker-entrypoint-initdb.d中找到的扩展名为.sh, .sql and .sql.gz的文件。文件将按字母顺序执行。
所以如果你想在容器中推送一些数据,只需要在这个目录下放一个备份文件.sql,/docker-entrypoint-initdb.d在容器启动时会初始化数据
https://stackoverflow.com/questions/67714508
复制相似问题