- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想制作一个基于 mysql/mysql-server 的 docker 镜像。我有一个应用程序(golang),它应该使用 MySQL 来存储数据。我想在 docker 中运行这个应用程序
我的 Docker 文件看起来像
FROM mysql/mysql-server
ENV MYSQL_ROOT_PASSWORD rootpass
ENV MYSQL_DATABASE mydb
ENV MYSQL_USER dbuser
ENV MYSQL_PASSWORD dbpass
ADD myapp / # compiled colang app connecting to localhost:3306 mysql server
CMD ["myapp"]
我构建这个镜像并运行它时出现错误
docker run --name mycont -it myimage
dial tcp [::1]:3306: getsockopt: connection refused
这里有什么问题?
也许我必须先以某种方式启动 mysql 服务器才能执行我的应用程序?
我的应用程序尝试使用用户 dbuser/dbpassword 和数据库 mydb 连接到 localhost:3306 上的 mysql。然后会在数据库中创建一些表
最佳答案
嗯,这是有可能实现的,但这不是一个好的做法。推荐的方法是运行两个不同的容器:一个运行 mysql,另一个运行您的应用程序。除此之外,您还需要一个编排工具来运行容器。
因此,冒着获得一些反对票的风险 :-),与其直接回答您的问题并展示如何创建一个可以运行两种功能的容器,我更愿意展示双容器方法我考虑一个更好的做法。
在我的示例中,我使用 docker compose 进行编排。如果您还没有安装它,则需要安装它。下面是我用来运行两个容器的 docker-compose.yml
文件:
version: '3'
services:
mysqlserver:
image: mysql/mysql-server
command: --default-authentication-plugin=mysql_native_password
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: "rootpass"
MYSQL_DATABASE: "mydb"
MYSQL_USER: "dbuser"
MYSQL_PASSWORD: "dbpass"
myapp:
image: myimage
environment:
MYSQL_SERVER: "mysqlserver"
MYSQL_DATABASE: "mydb"
MYSQL_USER: "dbuser"
MYSQL_PASSWORD: "dbpass"
该文件定义了两个服务:mysqlserver
和 myapp
,它们将作为单独的容器运行。这两个服务中的每一个都定义了两个元素:
image
环境
变量mysqlserver
服务定义了两个额外的属性:
command
,它指定了在运行时传递给 mysql 服务的额外参数。简而言之:--default-authentication-plugin
是 mysql 8 所必需的。尝试在没有它的情况下运行容器,最终可能会出现一些连接错误。您可以在官方 mysql docker 页面上阅读更多相关信息。ports
,指定容器对外暴露哪些端口现在,让我们定义您的应用图像。我不会说 golang,但我准备了一个使用 Linux shell 脚本的简单示例。
myapp
代码如下:
#!/bin/sh
echo ">> Waiting for $MYSQL_SERVER to start"
while ! `nc -z $MYSQL_SERVER 3306`; do sleep 3; done
echo ">> $MYSQL_SERVER has started"
mysql --host=$MYSQL_SERVER --user=$MYSQL_USER --password=$MYSQL_PASSWORD --database=$MYSQL_DATABASE<<EOFMYSQL
drop table if exists test;
create table test(id int, name varchar(20));
insert into test values (5, 'a'), (12, 'b');
select * from test;
EOFMYSQL
该应用程序将首先在一个 while 循环中运行 nc
命令,每 3 秒检查一次 mysql 服务器的状态,并且仅在 mysqlserver
完全启动时退出循环并接受端口 3306 上的连接。我们需要确保数据库服务器在尝试连接之前正在运行,对吗?
服务器启动后,myapp
使用在 docker compose 文件中作为环境变量传递的凭据连接到它。连接后,它运行一些sql语句(删除表、创建表、插入、选择)。所有这些环境参数都可以硬编码在 myapp
的代码中,但我认为将它们传递到 docker compose 文件中会更好。
用于创建myapp
镜像的Dockerfile
如下:
FROM alpine
RUN apk add netcat-openbsd mysql-client
ADD myapp /
RUN chmod +x /myapp
CMD /myapp
我通常使用 alpine linux 作为我测试的基础,因为它非常轻量级。我需要运行 apk add netcat-openbsd mysql-client
以将 nc
和 mysql-client
添加到图像中。您只需要添加 golang myapp 文件,而不是 myapp shell 脚本。
现在,让我们组装所有东西。进一步执行以下步骤:
Dockerfile
和 myapp
文件放在同一文件夹中并构建 myapp 镜像:docker image build -t myimage .
docker-compose.yml
文件作为输入运行 docker compose:docker-compose -f docker-compose.yml up
此时两个容器都将启动。 myapp
将等待 mysqlserver
准备就绪,然后连接到它并运行简单的查询。
我不确定您对 linux、shell 脚本、yaml 语法等有多熟悉。但我希望我提供了足够的细节让您理解。
关于mysql - 如何在基于 mysql/mysql-server 的 Docker 容器中启动 MySQL 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52913449/
本周我将在 Windows Server 2008 上设置一个专用的 SQL Server 2005 机器,并希望将其精简为尽可能简单,同时仍能发挥全部功能。 为此,“服务器核心”选项听起来很有吸引力
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 8 年前。 Improve
我获取了 2014 版本数据库的备份,并尝试在另一台服务器中将其恢复到具有相同名称和登录名的数据库中。此 SQL Server 版本是 2016。 恢复备份文件时,出现此错误: TITLE: Micr
我获取了 2014 版本数据库的备份,并尝试在另一台服务器中将其恢复到具有相同名称和登录名的数据库中。此 SQL Server 版本是 2016。 恢复备份文件时,出现此错误: TITLE: Micr
TFS 是否提供任何增强的方法来存储对 sql server 数据库所做的更改,而不是使用它来对在数据库上执行的 sql 语句的文本文件进行版本控制? 或者我正在寻找的功能是否仅在第 3 方工具(如
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我即将将我的 SQL Server 2012 实例升级到 SQL Server 2014。 我已经克隆了主机 Windows VM 并将其重命名为 foo-2012至 foo-2014 . 重新启动时
我想为 SQL Server 登录授予对数据库的访问权限。我知道 sp_grantdbaccess,但它已被弃用。我可以改用什么以及如何检查登录名是否还没有访问数据库的权限? 场景:UserA 创建数
客户别无选择,只能在接下来的几天内从 sql server 2000 迁移到 2008。测试显示 2005 年的重要功能出现了 Not Acceptable 性能下降,但 2008 年却没有。好消息是
我有一个测试数据库,我需要将其导出到我们客户的测试环境中。 这将是一次性的工作。 我正在使用 SQL Server 2005(我的测试数据库是 SQL Server 2005 Express) 执行此
我需要将一个 CSV 文件导入到 mongoDB 不幸的是我遇到了以下错误: error connecting to host: could not connect to server: se
我以为 R2 是一个补丁/服务包。我一直在寻找下载,但没有看到。因此,我假设 R2 是一个新版本,并且我需要 sqlserver 2008 r2 的安装介质来进行升级? 另外,我需要为新许可证付费吗?
我无法使用 SQL Server Management Studio 连接到 SQL Server。 我有一个连接字符串: 我尝试通过在服务器名中输入 myIP、在登录名中输入 MyID、在密码中
我们希望使用 SQL Server 加密来加密数据库中的几个列。我们还需要在生产和测试环境之间传输数据。看来最好的解决方案是在生产和测试服务器上使用相同的主 key 、证书和对称 key ,以便我可以
有没有可以分析 SQL Server 数据库潜在问题的工具? 例如: a foreign key column that is not indexed 没有 FILL FACTOR 的 uniquei
我正在尝试从我的 SQL 2012 BI 版本建立复制,但我收到一条奇怪的错误消息! "You cannot create a publication from server 'X' because
如果您使用 SQL Server 身份验证 (2005),登录详细信息是否以明文形式通过网络发送? 最佳答案 如您所愿,安全无忧... 您可以相当轻松地配置 SSL,如果您没有受信任的证书,如果您强制
我想将数据从一个表复制到不同服务器之间的另一个表。 如果是在同一服务器和不同的数据库中,我使用了以下 SELECT * INTO DB1..TBL1 FROM DB2..TBL1 (to copy w
我希望得到一些帮助,因为我在这个问题上已经被困了 2 天了! 场景:我可以从我的开发计算机(和其他同事)连接到 SERVER\INSTANCE,但无法从另一个 SQL Server 连接。我得到的错误
我正在尝试从我的 SQL 2012 BI 版本建立复制,但我收到一条奇怪的错误消息! "You cannot create a publication from server 'X' because
我是一名优秀的程序员,十分优秀!