docker-composeは、以前に作成されたdbコンポーネントに接続できないため、Webコンポーネントの構築に失敗します
Mac OSX 10.13.6、conda 4.5.11、Python 3.6.8、Dockerバージョン18.09.1、docker-composeバージョン1.23.2
Django 1.8.3は、Dockerfileのrequirements.txtとともにインストールされます。アップグレードする自由がない。
SOに関する非常に類似したいくつかの議論は役に立たなかった(このように: Docker-compose with Django could not translate Host name "db" to not toアドレス:名前またはサービスが不明 )。
ネットワークと2つのコンポーネントを持つdocker-compose.yml
があります。
version: '3'
networks:
bridge:
driver: bridge
services:
db:
image: postgres:10
container_name: myapp-db
volumes:
- ./postgres_data:/var/lib/postgresql/data/
ports:
- "5432:5432"
environment:
POSTGRES_DB: actionability-master
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
networks:
- bridge
web:
restart: unless-stopped
container_name: myapp-web
build: .
command: /start_gunicorn.sh
ports:
- "8080:8080"
environment:
PRODUCTION: 'true'
networks:
- bridge
私のsettings.py
にはDATABASESセクションがあります:
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': INSTANCE_NAME,
'USER': 'postgres',
'PASSWORD': 'postgres',
'Host': 'db',
'PORT': '5432'
},
}
$ docker-compose up -d
を実行すると、最初のイメージ(db)が作成され、そのコンテナが起動します。 docker ps
およびlsof
を使用して、ポート5432で実行およびリスニングしていることを確認できます。 web:
ファイルからdocker-compose.yml
コンポーネントを削除しても同じことが起こります
これで、2番目のコンポーネント(web)には、他の多くの行のうち、次の2行を含むDockerfileがあります。
RUN python manage.py makemigrations myapp
RUN python manage.py migrate
のような「移行」はこのエラーで死にます:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/Django/db/backends/base/base.py", line 130, in ensure_connection
self.connect()
File "/usr/local/lib/python3.6/site-packages/Django/db/backends/base/base.py", line 119, in connect
self.connection = self.get_new_connection(conn_params)
File "/usr/local/lib/python3.6/site-packages/Django/db/backends/postgresql_psycopg2/base.py", line 176, in get_new_connection
connection = Database.connect(**conn_params)
File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on Host "db" (37.34.32.51) and accepting TCP/IP connections on port 5432?
私はいくつかの微調整に疲れました。 *変更version '3.7'
* dbセクションに追加
expose:
- "5432"
depends_on: - "db"
links: - "db"
environment: PRODUCTION: 'false'
settings.py
のホストをコンテナ名、イメージ名、タグ、コンテナID、「localhost」、「127.0.0.1」などに変更しました。エラーは同じで、新しいホスト名のみが表示されています「db」の代わりに--build
スイッチで実行(docker-compose up -d --build
)docker system Prune
を実行し、再度実行しましたすべて同じエラー。
UPDATE:docker-composeがこのように機能しないという提案の後、2つの個別のタスクに分割しようとしました。最初にmyapp-dbコンテナを作成し、それが正しいポートで実行されていることを確認します。
$ docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c110e8361cda postgres:10 "docker-entrypoint.s…" 4 hours ago Up 4 hours 0.0.0.0:5432->5432/tcp myapp-db
次に、myapp-webをビルドします。
docker build -t myapp-web .
同じエラーがまだ発生します。それで、なぜ今はdbコンテナが見つからないのですか?
depends_on
リストを使用して、Webコンテナーの前にdbコンテナーを開始し、links
を使用してホスト名を解決できるようにします。
以下をウェブに追加します:
services:
db:
# ...
web:
links:
- "db:db" # resolve the hostname "db" with the ip of the db container
depends_on:
- db # start db before web
これは本当に基本的なように思えるかもしれませんが、適度に洗練された命名規則を考慮して、それらの名前をホスト上のDNSサービス、または少なくともAレコードに追加してみませんか?
その後、システムは名前またはIPでデータベースにアクセスできます。ちょっとした考え。
プラットフォームと言語の優れた選択肢と組み合わせ、Django + PostgreSQLは私のお気に入りです。特に、迅速なツール展開機能を探している場合は、Bootstrapをお勧めします。
ネットワークエイリアスを使用してこの構成を試すことができます。
version: '3.5'
services:
db:
image: postgres:10
container_name: myapp-db
volumes:
- ./postgres_data:/var/lib/postgresql/data/
expose:
- "5432"
environment:
POSTGRES_DB: actionability-master
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
networks:
services-network:
aliases:
- db
web:
restart: unless-stopped
container_name: myapp-web
build: .
command: /start_gunicorn.sh
ports:
- "8080:8080"
environment:
PRODUCTION: 'true'
depends_on:
- db
networks:
services-network:
aliases:
- web
networks:
services-network:
name: services-network
driver: bridge