首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在构建docker后运行程序

如何在构建docker后运行程序
EN

Stack Overflow用户
提问于 2021-05-27 09:19:35
回答 1查看 58关注 0票数 0

我正在努力建立一个码头形象,将使mysql码头容器。我有一个我写的小程序,它将创建我需要的数据库,并执行一些例程来推送其中的一些数据。问题是我需要编写程序,以便在构建容器时自动执行。

如果我手动运行它,程序运行得很好,但是当我尝试在dockerfile或docker-entrypoint.sh中运行它时,它从来没有运行过。当容器运行这个脚本时,服务器似乎没有完全启动,或者至少不能通过localhost访问?我猜在构建docker容器之后还有其他方法来运行自定义程序吗?或者解决方案就在我尝试访问数据库的方式上?

编辑

这就是我的docker编写的文件内容

代码语言:javascript
复制
 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

代码语言:javascript
复制
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文件

代码语言:javascript
复制
./DBSeedApp Param1 Param2

该应用程序是家庭编写的,使用.net核心根据一些参数在数据库中播种数据。应用程序正在尝试连接到数据库,如下所示:

代码语言:javascript
复制
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文件更改为:

代码语言:javascript
复制
echo "Check DB!"
while ! mysqladmin ping -h localhost -u root -p123456; do
    echo "Wait ..."
    sleep 1
done
echo "DB ready!"
./DBSeedApp Param1 Param2

但不幸的是,我还在我的程序中添加了以下内容:

代码语言:javascript
复制
 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文件上运行以下代码

代码语言:javascript
复制
./dbseedapp DUMP param1 param2 ...
mysql -u root -p mydbname --binary-mode < /tmp/dbseeder/temp/dump.sql

我使用MysqlBackup.Net从外部mysql服务器生成sql文件。

我想找到另一个解决方案,但目前这是我想出的最好的解决方案。如果有人有更好的主意..。让我知道。

EN

回答 1

Stack Overflow用户

发布于 2021-05-27 12:16:46

如果你使用的是官方的MySQL图片,这可能会对你有所帮助。

容器首次启动时,会创建一个指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行在/docker-entrypoint-initdb.d中找到的扩展名为.sh, .sql and .sql.gz的文件。文件将按字母顺序执行。

所以如果你想在容器中推送一些数据,只需要在这个目录下放一个备份文件.sql/docker-entrypoint-initdb.d在容器启动时会初始化数据

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67714508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档