我一直跟随这本书使用Docker, Flask和React的微服务形成testdriven.io。
在用flask, Postgres创建和配置容器并运行以下命令docker-compose -f docker-compose-dev.yml up -d --build
之后,一切看起来都很好,但是我无法从host访问web服务器。
输出为
docker-compose -f docker-compose-dev.yml up -d
[+] Running 2/2
⠿ Container testdriven-app-users-db-1 Running 0.0s
⠿ Container testdriven-app-users-1 Started 1.1s
- 当我去到URL: http://docker_machine_ip:5001/users/ping这是我应该得到的:
{
"message": "pong!",
"status": "success"
}
但不能访问web服务器,仍然不明白的方式?
- Dockerfile-dev
# base image
FROM python:3.9.12-alpine
# new
# install dependencies
RUN apk update &&
apk add --virtual build-deps gcc python3-dev musl-dev &&
apk add postgresql-dev &&
apk add netcat-openbsd
# set working directory
WORKDIR /usr/src/app
# add and install requirements
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt
# new
# add entrypoint.sh
COPY ./entrypoint.sh /usr/src/app/entrypoint.sh
RUN chmod +x /usr/src/app/entrypoint.sh
# add app
COPY . /usr/src/app
# run server
CMD ["/usr/src/app/entrypoint.sh"]
- docker-compose-dev.yml
version: '3.6'
services:
users:
build:
context: ./services/users
dockerfile: Dockerfile-dev
volumes:
- './services/users:/usr/src/app'
ports:
- 5001:5000
environment:
- FLASK_APP=project/__init__.py
- FLASK_ENV=development
- APP_SETTINGS=project.config.DevelopmentConfig
- DATABASE_URL=postgres://postgres:postgres@users-db:5432/users_dev
- DATABASE_TEST_URL=postgres://postgres:postgres@users-db:5432/users_test
depends_on:
- users-db
users-db:
build:
context: ./services/users/project/db
dockerfile: Dockerfile
ports:
- 5435:5432
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
您需要创建一个网络
networks:
user_network:
然后使用
连接这两个网络networks:
- user_network
那么您将需要一个DATABASE_HOST="users-db"
(容器db的名称)
app = Flask(__name__)
app.config['HOST'] = os.getenv('DATABASE_HOST', 'users-db')
app.config['USER'] = <you know what it is>
app.config['PASSWORD'] = <you know what it is>
app.config['DB'] = <you know what it is>
你现在可以使用上面的信息连接了。
加在一起看起来就像下面
version: '3.6'
services:
users:
build:
context: ./services/users
dockerfile: Dockerfile-dev
volumes:
- './services/users:/usr/src/app'
ports:
- 5001:5000
environment:
- FLASK_APP=project/__init__.py
- FLASK_ENV=development
- APP_SETTINGS=project.config.DevelopmentConfig
- DATABASE_HOST='users-db'
- DATABASE_URL=postgres://postgres:postgres@users-db:5432/users_dev
- DATABASE_TEST_URL=postgres://postgres:postgres@users-db:5432/users_test
networks:
- user_network
depends_on:
- users-db
users-db:
build:
context: ./services/users/project/db
dockerfile: Dockerfile
ports:
- 5435:5432
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
networks:
- user_network
networks:
user_network: