我有一个docker-compose文件,其中包含一个数据库和许多webapps。
我想为webapps的DB和其他docker-compose文件提供独有的docker-compose文件。这将帮助我重新启动docker-compose的webapps,而不会自动重启DB。
不幸的是,即使经过多次不同的尝试,网络应用程序的docker-compose也无法依赖' (或连接)由docker-compose数据库生成的网络中运行的数据库。
例如
DB和webapp在同一个docker-compose中,工作正常。
搬运工-撰写-adminer与 - db.yml
version: '2'
services :
db:
image: postgres:10-alpine
ports:
- "5432:5432"
environment:
POSTGRES_USER: user1
POSTGRES_PASSWORD: changeme
POSTGRES_DB: tododb
admin:
image: adminer
restart: always
depends_on:
- db
ports:
- 8080:8080
我想要什么
Docker-compose for db
搬运工-撰写-db.yml
version: '2'
services :
db:
image: postgres:10-alpine
ports:
- "5432:5432"
environment:
POSTGRES_USER: user1
POSTGRES_PASSWORD: changeme
POSTGRES_DB: tododb
Docker-compose for webapps
搬运工-撰写-adminer.yml
version: '2'
services :
admin:
image: adminer
restart: always
depends_on:
- db
ports:
- 8080:8080
networks:
- composeforani_default
$ docker-compose -f docker-compose-db.yml up -d
Creating network "myapp_default" with the default driver
Creating myapp_db_1 ... done
$ docker network list
NETWORK ID NAME DRIVER SCOPE
4eb66db9e09e bridge bridge local
8290604a966b host host local
1752afa36757 myapp_default bridge local
d14d3369531c none null local
$ docker-compose -f docker-compose-adminer.yml up -d
ERROR: Service 'admin' depends on service 'db' which is undefined.
答案 0 :(得分:0)
depends_on不保证等待其他服务完成其启动过程它只是在订单中启动应用程序。 要缓解您的问题,您可以在shell脚本中使用自定义等待来检查您的数据库是否已启动并运行。
在Dockerfile中使用此代码:
ENV DOCKERIZE_VERSION v0.6.0
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
并在adminer image的shell脚本中使用此代码来检查db是否已启动并继续:
dockerize -wait http://$db_host:$db_port -timeout 300s
有关详细信息,请访问此link