我有一个正在尝试容器化的应用程序,它由一个带有PostgreSQL、elasticsearch和redis服务的Web应用程序组成。在运行应用程序之前,我的Web应用程序需要用Postgres的数据填充redis和elasticsearch服务中的数据,因此我在应用程序的dockerfile中使用了一个入口点。为了填充这些服务,我的应用程序使用docker compose网络在其自己的(特定于应用程序的)设置文件中设置的服务地址,我已将这些设置文件设置为docker compose中的环境变量
environment
将应用程序的一部分传递到容器中。
我的
docker-compose.yml
文件如下:
version: '3'
services:
redis:
image: 'redis:alpine'
expose:
- 6379:6379
elasticsearch:
image: 'docker.elastic.co/elasticsearch/elasticsearch:7.13.1'
environment:
- node.name=node-1
- cluster.initial_master_nodes=node-1
expose:
- "9200:9200"
db:
image: 'postgres:latest'
build:
context: ./docker/db
dockerfile: Dockerfile
environment:
POSTGRES_USER: myuser
POSTGRES_HOST_AUTH_METHOD: trust
POSTGRES_DB: mydb
app:
build: ./app
ports:
- '8000:8000'
volumes:
- ./database:/var/lib/postgresql
environment:
- REDIS_HOST = redis
- DB_NAME=mydbname
- DB_USER=myusername
- ES_URL = elasticsearch
links:
- redis
- db
- elasticsearch
depends_on:
- redis
- db
- elasticsearch
我的应用程序的dockerfile(相关部分)就是这样,其中
entrypoint.sh
脚本包含用于填充这些服务的命令:
# copy project
COPY . .
RUN chmod +x entrypoint.sh
#compile assets for testing and insert data from db into Elasticsearch and Redis
ENTRYPOINT ["./entrypoint.sh"]
然而,这些服务的地址似乎并没有作为环境变量从
docker-compose.yml
当入口点脚本运行时,应用程序容器无法访问它们,尽管在早期版本中(没有入口点脚本),它们似乎在容器启动并运行后就被传递到了容器中。我在这里有点困惑,因为据我所知,入口点脚本的运行方式就像它们处于容器的运行阶段,而不是构建阶段一样,因此它们应该可以访问来自
docker-compose.yml
.
在这个阶段传递环境变量似乎有几种选择,如果一个容器需要在最终版本之前访问内部网络上的其他容器,我不确定这里的最佳做法是什么
CMD
声明它在哪里运行和公开。
谢谢