Docker-compose 有效,仅 Docker 使用 Dockerfile - 无效。为什么?
Docker-compose works, just Docker using Dockerfile - does not. Why?
无论如何我都不是 Docker 专家,所以也许它有一个简单的解决方案。我有这样的“奇怪”问题:
在本地开发中很长一段时间,我使用 Docker-compose 作为我的 Python Flask gunicorn 服务器,设置非常简单,我的 docker-compose.yaml
看起来像这样:
version: '2'
services:
website:
build: .
command: >
gunicorn -b 0.0.0.0:443
--reload
--workers=2
--timeout 0
--certfile=scert.crt
--keyfile=skey.key
db_app.app:create_app()
environment:
PYTHONUNBUFFERED: 'true'
volumes:
- '.:/db_app'
ports:
- '443:443'
我通常用 docker-compose up --build
启动它,刷新本地文件自动重建服务器等等 - 太棒了。客户端应用程序连接也没有任何问题。但现在我需要让它与 Docker 文件一起工作(将其放在 Google Cloud 运行 上)。我想到了这个:
FROM python:3.8-slim
ENV PYTHONUNBUFFERED True
ENV INSTALL_PATH /db_app
RUN mkdir -p ${INSTALL_PATH}
WORKDIR ${INSTALL_PATH}
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
EXPOSE 443
CMD exec gunicorn --bind 0.0.0.0:443 --reload --workers=2 --threads 8 --timeout 0 --certfile=scert.crt --keyfile=skey.key db_app.app:create_app
构建没问题,运行没问题,但是..每当我尝试连接我的客户端应用程序时,我都会收到 503。它发生在 Google 云 运行 和在本地我只是看不到服务器的任何输出,即使它确实 运行 (当用 docker run containername
启动它时它执行 docker 文件而不是 docker-compose(效果很好))。我做错了什么?
附加信息:
docker run containername ls -l /db_app
的结果
total 28
drwxr-xr-x 3 root root 4096 Sep 17 16:12 config
-rw-r--r-- 1 root root 496 Nov 14 11:13 docker-compose.yaml
drwxr-xr-x 2 root root 4096 Sep 16 20:34 instance
-rw-r--r-- 1 root root 252 Oct 11 15:37 requirements.txt
-rwxrwxrwx 1 root root 1456 Oct 15 14:09 scert.crt
-rwxrwxrwx 1 root root 1704 Oct 15 14:09 skey.key
drwxr-xr-x 3 root root 4096 Oct 27 18:05 db_app
回答我自己的问题,因为我知道出了什么问题。
显然,Google Cloud 运行 会自行处理安全问题,它不希望我们在容器实例输出中使用任何自签名或以其他方式生成的证书。为了安全起见,我还使用了默认端口。
从 Gunicorn 命令中删除有关该行的行使其正常工作并正确响应客户端(仍与 https 连接)。
所以这是对 Dockerfile 唯一需要的更改:
CMD exec gunicorn --bind 0.0.0.0:8080 --reload --workers=1 --threads 8 --timeout 0 "db_app.app:create_app()"
这里的底线是 Google 为此使用自己的证书,不需要我们的。
无论如何我都不是 Docker 专家,所以也许它有一个简单的解决方案。我有这样的“奇怪”问题:
在本地开发中很长一段时间,我使用 Docker-compose 作为我的 Python Flask gunicorn 服务器,设置非常简单,我的 docker-compose.yaml
看起来像这样:
version: '2'
services:
website:
build: .
command: >
gunicorn -b 0.0.0.0:443
--reload
--workers=2
--timeout 0
--certfile=scert.crt
--keyfile=skey.key
db_app.app:create_app()
environment:
PYTHONUNBUFFERED: 'true'
volumes:
- '.:/db_app'
ports:
- '443:443'
我通常用 docker-compose up --build
启动它,刷新本地文件自动重建服务器等等 - 太棒了。客户端应用程序连接也没有任何问题。但现在我需要让它与 Docker 文件一起工作(将其放在 Google Cloud 运行 上)。我想到了这个:
FROM python:3.8-slim
ENV PYTHONUNBUFFERED True
ENV INSTALL_PATH /db_app
RUN mkdir -p ${INSTALL_PATH}
WORKDIR ${INSTALL_PATH}
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
EXPOSE 443
CMD exec gunicorn --bind 0.0.0.0:443 --reload --workers=2 --threads 8 --timeout 0 --certfile=scert.crt --keyfile=skey.key db_app.app:create_app
构建没问题,运行没问题,但是..每当我尝试连接我的客户端应用程序时,我都会收到 503。它发生在 Google 云 运行 和在本地我只是看不到服务器的任何输出,即使它确实 运行 (当用 docker run containername
启动它时它执行 docker 文件而不是 docker-compose(效果很好))。我做错了什么?
附加信息:
docker run containername ls -l /db_app
total 28
drwxr-xr-x 3 root root 4096 Sep 17 16:12 config
-rw-r--r-- 1 root root 496 Nov 14 11:13 docker-compose.yaml
drwxr-xr-x 2 root root 4096 Sep 16 20:34 instance
-rw-r--r-- 1 root root 252 Oct 11 15:37 requirements.txt
-rwxrwxrwx 1 root root 1456 Oct 15 14:09 scert.crt
-rwxrwxrwx 1 root root 1704 Oct 15 14:09 skey.key
drwxr-xr-x 3 root root 4096 Oct 27 18:05 db_app
回答我自己的问题,因为我知道出了什么问题。
显然,Google Cloud 运行 会自行处理安全问题,它不希望我们在容器实例输出中使用任何自签名或以其他方式生成的证书。为了安全起见,我还使用了默认端口。 从 Gunicorn 命令中删除有关该行的行使其正常工作并正确响应客户端(仍与 https 连接)。
所以这是对 Dockerfile 唯一需要的更改:
CMD exec gunicorn --bind 0.0.0.0:8080 --reload --workers=1 --threads 8 --timeout 0 "db_app.app:create_app()"
这里的底线是 Google 为此使用自己的证书,不需要我们的。