使用docker-compose.yml中的命令等待docker容器准备就绪
我在docker-compose.yml中有一个mysql db和prisma映像。我希望prisma等待db准备就绪,否则prisma会继续重新启动,并且根本无法工作。从中我知道,我可以使用,但在搜索了一段时间后,我无法连接这些片段使用docker-compose.yml中的命令等待docker容器准备就绪,docker,docker-compose,startup,Docker,Docker Compose,Startup,我在docker-compose.yml中有一个mysql db和prisma映像。我希望prisma等待db准备就绪,否则prisma会继续重新启动,并且根本无法工作。从中我知道,我可以使用,但在搜索了一段时间后,我无法连接这些片段 version: '3' services: prisma: image: prismagraphql/prisma:1.25 restart: unless-stopped ports: - "4001:4466" d
version: '3'
services:
prisma:
image: prismagraphql/prisma:1.25
restart: unless-stopped
ports:
- "4001:4466"
depends_on:
- db
# I added this command
command: ["./wait-for-it.sh", "db:33061", "--"]
environment:
PRISMA_CONFIG: |
managementApiSecret: server.secret.123
port: 4466
databases:
default:
connector: mysql
active: true
host: db
port: 3306
user: ***
password: ***
db:
image: mysql:5.7
restart: unless-stopped
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_USER: ***
MYSQL_ROOT_PASSWORD: ***
ports:
- "33061:3306"
volumes:
- /docker/mysql:/var/lib/mysql
我在上面添加了命令,但没有任何更改,日志中甚至没有错误,但据我所知,该命令在容器中运行
我只是有docker compose文件,想做docker compose up-d你把内部端口和外部端口搞混了。数据库在网络中的端口
3306
上可见,因此您必须等待db:3306
,而不是等待33061
端口公开在用户定义的网桥网络内不起作用,默认情况下由docker compose
创建。默认情况下,网络内的容器可以看到所有端口。当您暴露端口时,将其显示在网络外部
另外,请确保图像的prismagraphql/prisma:1.25的入口点是什么。如果它不是/bin/sh-c
或其他类型的shell,则不会执行命令
UPD
如果在基本图像中获得的入口点与/bin/sh-c
不同,则可以覆盖它。假设您有/bin/sh-c/app/start.sh
,您可以执行以下魔术:
docker compose.yml
...
services:
prisma:
entrypoint: ["/bin/sh", "-c", "'./wait-for-it.sh db:3306 && /app/start.sh'"]
现在我知道了如何将wait.sh
包含到容器中
我将wait-for-it.sh下载到项目文件夹中,然后创建了一个名为Dockerfile的文件,其中包含以下内容:
FROM prismagraphql/prisma:1.25
COPY ./wait-for-it.sh /app/wait-for-it.sh
RUN chmod +x /app/wait-for-it.sh
ENTRYPOINT ["/bin/sh","-c","/app/wait-for-it.sh db:3306 -t 30 -- /app/start.sh"]
在我的docker-compose.yml中,我替换了
image:prismagraphql/prisma:1.25
带有build:。
这会导致从我的项目路径中的Dockerfile生成新版本
现在,新映像将从prisma映像构建,wait-it.sh将复制到新映像中。然后,入口点被覆盖,prisma将等待数据库准备就绪。好的,谢谢。我通过portainer发现/bin/sh-c/app/start.sh
是图像的入口点。那么我的命令会被执行吗?视情况而定。您将以/bin/sh-c/app/start.sh./wait-for-it.sh db:33061--
的形式获得整个命令。因此,根据start.sh
的内容,您可以执行脚本,也可以不执行脚本,因为它似乎覆盖了入口点。我现在的问题是,我不知道如何让等待它。sh
工作,因为我不知道如何将它放入容器中以便在那里执行。不应该/wait-it.sh db:33061
be/wait-it.sh db:3306
这是我文章前半部分的主题)