我正在尝试学习Docker,并尝试使用MariaDB和Go创建一个简单的CRUD应用程序。我为Go创建了一个Dockerfile:
FROM golang:1.17
WORKDIR /src/app
COPY . .
# RUN go get -u github.com/go-sql-driver/mysql \
# go get -u github.com/gin-gonic/gin
RUN go build -o app .
CMD [ "./app" ]我还有一个docker-compose,这样我就可以启动MariaDB容器和Go容器:
version: '3.8'
services:
db:
container_name: appdb
image: mariadb:latest
volumes:
- ./dbdata:/var/lib/mysql/data
environment:
MYSQL_ROOT_PASSWORD: "1234"
MYSQL_DATABASE: "crudapp"
MYSQL_USER: "root"
MYSQL_PASSWORD: "root"
app:
container_name: crudapi
build:
context: .
ports:
- '8080:8080'
depends_on:
- db当我运行docker-compose up时,appdb容器启动,但crudapi不启动。它看起来像是启动然后关闭,因为我在控制台中有退出代码0。我在网上搜索,但不明白为什么会发生这种情况。我看到我应该尝试将tty:true添加到docker-compose文件中,但同样不起作用。
我在这里做错了什么?
发布于 2021-11-26 10:29:54
在启动应用程序之前,depends_on不会等待数据库准备就绪,因此在启动时,Compose不会等到容器appdb准备就绪(无论这对您的特定应用程序意味着什么),而只是等到它开始运行。
在实践中,您必须在应用程序代码中实现检查,无论是在启动时还是在连接因任何原因而丢失时,您还可以包含一个wait-for like tool。
发布于 2021-11-27 15:20:04
容器不会等待db启动。您必须在您的应用程序中添加超时。或者实现用于检入循环直到db容器启动为止的逻辑。
或者,您可以使用此处描述的脚本- Docker control startup script
https://stackoverflow.com/questions/70122006
复制相似问题