在启动我们自己的应用程序(例如中层服务器)之前,等待数据库服务器准备就绪,这是一个熟悉的问题。 Docker组成也不例外。我们自己的应用程序容器还必须等待自己的数据库服务器容器,准备在发送请求之前就可以接受请求。我已经尝试了两(2)个“等待Docker正式推荐的工具。我正在讨论我在这篇文章中的尝试,并描述了我仍然存在的一些待处理问题。
目录
- Environments
- Reference Documents, Tutorials and Posts
- wait-for-it
- atkrad/wait4x
- Other Docker Posts Which I've Written
Environments
- Windows 10 Pro - 版本10.0.19045构建19045 。
- Windows docker卡(Docker Engine) - 版本20.10.17,构建DE40AD0 。
- Windows docker-composeâcli - 版本1.29.2,构建5becea4c 。
- Windows Docker桌面 - 版本4.11.0 。
- mysql:8.0.30-debian - 这是MySQL Docker Official Image,版本8.0.30 。它在Windows 10机器上运行。
- python:3.10.5-slim-buster - 这是一个Python Docker Official Image,我在几个月前下载了它。我刚才检查了,它不再在那里列出,但是我猜测仍然对此帖子仍然可以做一个更近的版本。
Reference Documents, Tutorials and Posts
我在开发环境中使用了官方的Docker图像。我还试图构建图像以供自己理解。在开始撰写之前,我已经检查了官方文档和一些教程。
我之前曾使用过多层应用程序。坐在网络前端和数据库服务器之间是我们自己的应用程序数据服务器,写为 Windows服务:如果服务器计算机必须重新启动,我们的应用程序数据服务器必须等待目标数据库服务器为开始之前准备就绪。
一开始,即使存在应用程序容器和数据库容器,我都没有遇到撰写的可见教程。手头的官方Docker文件偶尔提到这是一个问题,但他们并没有立即指出解决此问题的实际文件!
- https://docs.docker.com/compose/ - 撰写的概述。
- 这是跳跃我的教程,让我撰写: How to use MySQL with Docker and Docker compose a beginners guide. 它没有解决等待问题,我编写了一个简单的python脚本 仅运行查询并打印出行。我期望它不工作 一直以来,始终没有。我反复运行,有时 当MySQL Server容器未按时开始时。
- 进一步谷歌搜索,我找到了这个Docker文档 Control startup and shutdown order in Compose, 建议使用几种工具来实施等待,其中包括 wait-for-it和 Wait4X.
-
我不记得确切的情况,但我发现这个堆栈溢出帖子
Docker-compose check if mysql connection is ready,哪里:
- user Erg 讨论了等待。
- user Dávid Szabó讨论了 atkrad/wait4x.
- 与这篇文章没有直接相关,但是我所学的第一个Docker 教程是Learn to build and deploy your distributed applications easily to the cloud with Docker,它是一个很好的教程,而且确实涵盖了Compose。
on mysql:8.0.30-debian docker image build ,我还写了两个相关帖子:
-
Docker on Windows 10: running mysql:8.0.30-debian with a custom config file --
- 安装配置在这篇文章中重新使用:
- - 安装型= bind,source = // e/mysql-config,target =/etc/mysql/conf.d
- - mount source = mysqlvol,target =/var/lib/mysql
- Docker on Windows 10: mysql:8.0.30-debian log files.
wait-for-it
python:3.10.5-slim-buster 是 debian gnu/linux 10(buster)。 Follow the Debian package link given by wait-for-it, we'll eventually find this link https://packages.debian.org/source/oldoldstable/wait-for-it, I downloaded the wait-for-it_0.0~git20160501.orig.tar.gz file and extracted wait- for-it.sh 向项目root Directory went > dockerfile 和 docker-compose.yml 是。
我不会列出 .dockerignore 的内容,因为它特定于应用程序。 dockerfile 在某种程度上是无关紧要的,这是讨论的背景,除了python环境文件 .env-docker 。
。Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.10.5-slim-buster
WORKDIR /book_keeping
COPY . .
EXPOSE 8000
RUN /usr/local/bin/python -m pip install --upgrade pip \
&& pip3 install -e . \
&& pip3 install bh_utils-1.0.0-py3-none-any.whl \
&& pip3 install bh_validator-1.0.0-py3-none-any.whl
RUN chmod +x wait-for-it.sh
RUN rm bh_utils-1.0.0-py3-none-any.whl \
&& rm bh_validator-1.0.0-py3-none-any.whl \
&& mv .env-docker .env
CMD [ "python", "-m" , "flask", "run", "--host=0.0.0.0" ]
请注意:
RUN chmod +x wait-for-it.sh
我们将运行 wait-for-it.sh 稍后,我将在准备就绪中授予执行权限。
The Python environment file .env-docker
python环境文件 .env-docker 与我的本地开发相同,除了:
SQLALCHEMY_DATABASE_URI = mysql+mysqlconnector://behai1:password@mysql_db/ompdev1
数据库主机为 mysql_db - 这是 docker-compose.yml 文件中MySQL容器的服务名称。根据Networking in Compose:
现在每个容器都可以查找主机名Web或DB,并恢复适当的容器IP地址。例如,Web的应用程序代码可以连接到URL Postgres:// db:5432并开始使用Postgres数据库。
docker-compose.yml
version: "3.9"
services:
mysql_db:
image: mysql:8.0.30-debian
cap_add:
- SYS_NICE
restart: always
environment:
- MYSQL_DATABASE=ompdev1
- MYSQL_ROOT_PASSWORD=pcb.2176310315865259
ports:
- '3306:3306'
volumes:
- type: bind
source: //e/mysql-config
target: /etc/mysql/conf.d
- type: volume
source: mysqlvol
target: /var/lib/mysql
app:
container_name: book-keeping
restart: always
build: .
image: book-keeping
depends_on:
- mysql_db
ports:
- '8000:8000'
command: ./wait-for-it.sh -t 40 mysql_db:3306 -- python ./app.py
#command: python -m flask run --host=0.0.0.0:8000
#command: python3 -m flask run
command: flask run -h 0.0.0.0 -p 8000
volumes:
mysqlvol:
external: true
在上面的撰写文件中, wait-it.sh 以与记录的方式几乎相同。 MySQL_DB 是前面讨论的MySQL数据库服务器地址; 3306 是默认端口:
command: ./wait-for-it.sh -t 40 mysql_db:3306 -- python ./app.py
我们将浏览一些不太明显的配置项目,例如其他配置项目,例如 restart , depends_on 等,请自己找出答案。 /p>
- 服务:mysql_db:卷:;回想一下我之前提到的这篇文章Docker on Windows 10: running mysql:8.0.30-debian with a custom config file。相同的 bind -mount 用于根据此Docker文档Use a bind mount with compose翻译的compose,语法。这使我的组合能够使用现有的数据库 /卷以及现有的MySQL自定义配置文件。
- 卷:mysqlvol:外部:true ;召回 - mount source = mysqlvol,target =/var/lib/mysql ? mysqlvol 是主机计算机上使用WSL2的主机计算机上的目录,在我的情况下,使用WSL2存储了Docker容器数据:我已经在Docker volumes on disk中写了有关此的文章。在这种情况下,将其引用并将外部设置为 true ,以表示该卷已在Compose之外创建,请参阅官方文档Compose reference on volumes | external。
- 应用:端口:'8000:8000'(即主机端口:容器端口); - 这使作为http://localhost:8000访问Dockerised网站,没有它,下一个命令将无效:
-
app:命令:烧瓶运行-H 0.0.0.0 -p 8000 ; 在这里放置此命令是我自己的猜测作品,我还没有找到任何文档,我不确定这是否总是有效的。 我正面对两个(2)此时的问题:
- 如果我在这里没有此命令,则应用程序容器将无法正常启动,它将仅坐在最后一个命令上:/wait-for-it.sh -t 40 mysql_db:3306- python ./app.py - 并继续无休止地重新启动。
- 在此命令之前,我尝试了其他几个注释的命令,即使容器正在运行,它们都不允许将其连接到应用程序容器作为http://localhost:8000。看来这是一个流行的问题,我还遇到了一个具体的答案,不同的解决方案似乎在不同的情况下起作用...
atkrad/wait4x
使用了相同的Python environment file .env-docker。除了等待实施外,其他一切都与wait-for-it的实施相同。
,请再次注意,等待本节的实施不是我的 - 我只是复制Reference Documents, Tutorials and Posts4above中引用的实现。
我确实拉了 atkrad/wait4x docker图像在运行 docker-compose 之前,我不认为这是必要的:
docker pull atkrad/wait4x
Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.10.5-slim-buster
WORKDIR /book_keeping
COPY . .
EXPOSE 8000
RUN /usr/local/bin/python -m pip install --upgrade pip \
&& pip3 install -e . \
&& pip3 install bh_utils-1.0.0-py3-none-any.whl \
&& pip3 install bh_validator-1.0.0-py3-none-any.whl
RUN rm bh_utils-1.0.0-py3-none-any.whl \
&& rm bh_validator-1.0.0-py3-none-any.whl \
&& mv .env-docker .env
CMD [ "python", "-m" , "flask", "run", "--host=0.0.0.0" ]
docker-compose.yml
version: "3.9"
services:
mysql_db:
image: mysql:8.0.30-debian
cap_add:
- SYS_NICE
restart: always
environment:
- MYSQL_DATABASE=ompdev1
- MYSQL_ROOT_PASSWORD=pcb.2176310315865259
ports:
- '3306:3306'
volumes:
- type: bind
source: //e/mysql-config
target: /etc/mysql/conf.d
- type: volume
source: mysqlvol
target: /var/lib/mysql
app:
container_name: book-keeping
restart: always
build: .
image: book-keeping
depends_on:
wait-for-db:
condition: service_completed_successfully
ports:
- '8000:8000'
command: flask run -h 0.0.0.0 -p 8000
wait-for-db:
image: atkrad/wait4x
depends_on:
- mysql_db
command: tcp mysql_db:3306 -t 30s -i 250ms
volumes:
mysqlvol:
external: true
等待命令是:
command: tcp mysql_db:3306 -t 30s -i 250ms
我更喜欢这种方法,而不是另一种方法,该工具似乎是积极维护的,超过50万。最重要的是,我不必随身携带其他脚本。我认为它也不会增加最终图像大小。
Other Docker Posts Which I've Written
- Synology DS218: unsupported Docker installation and usage...- Synology没有对Aarch64 NAS模型的Docker支持。 DS218是AARCH64 NAS模型。在这篇文章中,我们正在研究如何安装不支持的Synology DS218的Docker,并且我们还进行了测试以证明安装有效。
- Python: Docker image build -- install required packages via requirements.txt vs editable install.-通过需求安装。TXT是指使用此图像构建步骤命令 - 运行pip3 install -runignts.txtâ。可编辑安装意味着使用运行pip3 install -e。命令。我已经通过需求进行了安装。TXT导致图像不运行,而使用可编辑的安装导致图像确实可以按预期工作。我在这篇文章中介绍了我的发现。
- Python: Docker image build -- “the Werkzeug” problem 🤖!-我经验丰富的Docker Image Build安装了与开发可编辑安装过程的Werkzeug依赖关系包的不同版本。这导致Docker图像中的Python项目无法运行。开发可编辑安装意味着在活动虚拟环境中运行``pip3 install -e''命令。我正在描述问题以及如何在这篇文章中解决问题。
- Python: Docker image build -- save to and load from *.tar files.-我们可以将Docker Images保存到Local *.tar文件,然后加载并从本地 *.tar文件运行这些Docker图像。我正在记录这篇文章中的学习实验。
- Python: Docker volumes -- where is my SQLite database file?-码头图像中的Python应用程序将一些数据写入SQLite数据库。停止容器,然后再次重新运行,数据不再存在!运行图像时必须指定卷以持久数据。但是Windows 10和Linux中的SQLite数据库文件在哪里?我们正在讨论两个操作系统的磁盘上的数量以及磁盘上的数量。
- Docker on Windows 10: running mysql:8.0.30-debian with a custom config file.-运行官方MySQL所需的步骤:Windows 10上的8.0.30-debian映像带有自定义配置文件E:\ mysql-config \ mysql-docker.cnf。
- Docker on Windows 10: mysql:8.0.30-debian log files -运行Docker官方图像MySQL:8.0.30-Debian在我的Windows 10 Pro Host Machine上,我想记录所有查询,慢速查询和错误与主机计算机上的文件。在本文中,我们正在讨论如何实现这一目标。
- pgloader Docker: migrating from Docker & localhost MySQL to localhost PostgreSQL.-使用最新的Dimitri/PGLOADER DOCKER IMAGE构建,我已经迁移了Docker MySQL Server 8.0.30数据库,并在本地安装的MySQL Server 5.5数据库中迁移到本地安装的Postgresql Server 14.3数据库。我正在讨论我在这篇文章中的做法。
€â€
感谢您的阅读...希望您发现这篇文章很有用。一如既往地保持安全。