`docker-compose up` 与带环境变量的 `docker compose up`
`docker-compose up` vs. `docker compose up` with environment variables
我正在尝试使用 Docker Compose 将三节点 Elasticsearch 集群部署到 Azure 容器实例。我大致遵循 ACI 文档中的 this example from the Elasticsearch documentation and this tutorial。
当我尝试使用我在大多数文档中看到的标准 docker-compose
命令部署到 ACI 时,我收到一条错误消息,指出它不受支持:
> docker-compose -f .\docker-compose.yml -f .\docker-compose.production.yml up
ERROR: The platform targeted with the current context is not supported.
Make sure the context in use targets a Docker Engine.
当我尝试使用 ACI 文档中的 docker compose
(无连字符)命令部署到 ACI 时,出现错误,因为它没有从 .env 文件:
> docker compose -f .\docker-compose.yml -f .\docker-compose.production.yml up
1 error(s) decoding:
* error decoding 'Volumes[1]': invalid spec: certs:: empty section between colons
有没有办法在使用 docker compose
或使用 docker-compose
时加载 .env 文件?我不完全理解 docker compose
命令的来源以及为什么它与 docker-compose
不同,它似乎不是我能看到的标准 docker
命令或 CLI 扩展.
这些是相关文件:
docker-compose.yml
# Based on example from Elasticsearch documentation:
# https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker
version: '3.8'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- ELASTIC_PASSWORD=$ELASTIC_PASSWORD
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=true
- xpack.security.http.ssl.key=$CERTS_DIR/es01/es01.key
- xpack.security.http.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.http.ssl.certificate=$CERTS_DIR/es01/es01.crt
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.transport.ssl.certificate=$CERTS_DIR/es01/es01.crt
- xpack.security.transport.ssl.key=$CERTS_DIR/es01/es01.key
volumes:
- data01:/usr/share/elasticsearch/data
- 'certs:$CERTS_DIR'
ports:
- 127.0.0.1:9200:9200
networks:
- elastic
healthcheck:
test: curl --cacert $CERTS_DIR/ca/ca.crt -s https://localhost:9200 >/dev/null; if [[ $$? == 52 ]]; then echo 0; else echo 1; fi
interval: 30s
timeout: 10s
retries: 5
ulimits:
memlock:
soft: -1
hard: -1
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.http.ssl.key=$CERTS_DIR/es02/es02.key
- xpack.security.http.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.http.ssl.certificate=$CERTS_DIR/es02/es02.crt
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.transport.ssl.certificate=$CERTS_DIR/es02/es02.crt
- xpack.security.transport.ssl.key=$CERTS_DIR/es02/es02.key
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
- 'certs:$CERTS_DIR'
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.http.ssl.key=$CERTS_DIR/es03/es03.key
- xpack.security.http.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.http.ssl.certificate=$CERTS_DIR/es03/es03.crt
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.transport.ssl.certificate=$CERTS_DIR/es03/es03.crt
- xpack.security.transport.ssl.key=$CERTS_DIR/es03/es03.key
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
- 'certs:$CERTS_DIR'
networks:
- elastic
wait_until_ready:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
command: /usr/bin/true
depends_on: {"es01": {"condition": "service_healthy"}}
volumes:
data01:
data02:
data03:
certs:
networks:
elastic:
driver: bridge
docker-compose.production.yml:
x-volume: &volume
driver: azure_file
driver_opts:
share_name: acishare
storage_account_name: <My Storage Account Name>
volumes:
data01:
<<: *volume
data02:
<<: *volume
data03:
<<: *volume
certs:
<<: *volume
.env
COMPOSE_PROJECT_NAME=es
CERTS_DIR=/usr/share/elasticsearch/config/certificates
ELASTIC_PASSWORD=<Default Password>
我也尝试过使用 env_file 属性,但 docker compose
似乎忽略了它。
基于 this GitHub issue comment, it seems that docker-compose
is the original Compose project, its source code lives in the docker/compose 存储库。
docker compose
是一个新项目,实现了Compose规范,支持ECS和ACI,但暂不支持本地部署。它的源代码位于 docker/compose-cli 存储库中。
根据 this issue,docker compose
尚不支持 .env 文件。
我正在尝试使用 Docker Compose 将三节点 Elasticsearch 集群部署到 Azure 容器实例。我大致遵循 ACI 文档中的 this example from the Elasticsearch documentation and this tutorial。
当我尝试使用我在大多数文档中看到的标准 docker-compose
命令部署到 ACI 时,我收到一条错误消息,指出它不受支持:
> docker-compose -f .\docker-compose.yml -f .\docker-compose.production.yml up
ERROR: The platform targeted with the current context is not supported.
Make sure the context in use targets a Docker Engine.
当我尝试使用 ACI 文档中的 docker compose
(无连字符)命令部署到 ACI 时,出现错误,因为它没有从 .env 文件:
> docker compose -f .\docker-compose.yml -f .\docker-compose.production.yml up
1 error(s) decoding:
* error decoding 'Volumes[1]': invalid spec: certs:: empty section between colons
有没有办法在使用 docker compose
或使用 docker-compose
时加载 .env 文件?我不完全理解 docker compose
命令的来源以及为什么它与 docker-compose
不同,它似乎不是我能看到的标准 docker
命令或 CLI 扩展.
这些是相关文件:
docker-compose.yml
# Based on example from Elasticsearch documentation:
# https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker
version: '3.8'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- ELASTIC_PASSWORD=$ELASTIC_PASSWORD
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=true
- xpack.security.http.ssl.key=$CERTS_DIR/es01/es01.key
- xpack.security.http.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.http.ssl.certificate=$CERTS_DIR/es01/es01.crt
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.transport.ssl.certificate=$CERTS_DIR/es01/es01.crt
- xpack.security.transport.ssl.key=$CERTS_DIR/es01/es01.key
volumes:
- data01:/usr/share/elasticsearch/data
- 'certs:$CERTS_DIR'
ports:
- 127.0.0.1:9200:9200
networks:
- elastic
healthcheck:
test: curl --cacert $CERTS_DIR/ca/ca.crt -s https://localhost:9200 >/dev/null; if [[ $$? == 52 ]]; then echo 0; else echo 1; fi
interval: 30s
timeout: 10s
retries: 5
ulimits:
memlock:
soft: -1
hard: -1
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.http.ssl.key=$CERTS_DIR/es02/es02.key
- xpack.security.http.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.http.ssl.certificate=$CERTS_DIR/es02/es02.crt
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.transport.ssl.certificate=$CERTS_DIR/es02/es02.crt
- xpack.security.transport.ssl.key=$CERTS_DIR/es02/es02.key
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
- 'certs:$CERTS_DIR'
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.http.ssl.key=$CERTS_DIR/es03/es03.key
- xpack.security.http.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.http.ssl.certificate=$CERTS_DIR/es03/es03.crt
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.transport.ssl.certificate=$CERTS_DIR/es03/es03.crt
- xpack.security.transport.ssl.key=$CERTS_DIR/es03/es03.key
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
- 'certs:$CERTS_DIR'
networks:
- elastic
wait_until_ready:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
command: /usr/bin/true
depends_on: {"es01": {"condition": "service_healthy"}}
volumes:
data01:
data02:
data03:
certs:
networks:
elastic:
driver: bridge
docker-compose.production.yml:
x-volume: &volume
driver: azure_file
driver_opts:
share_name: acishare
storage_account_name: <My Storage Account Name>
volumes:
data01:
<<: *volume
data02:
<<: *volume
data03:
<<: *volume
certs:
<<: *volume
.env
COMPOSE_PROJECT_NAME=es
CERTS_DIR=/usr/share/elasticsearch/config/certificates
ELASTIC_PASSWORD=<Default Password>
我也尝试过使用 env_file 属性,但 docker compose
似乎忽略了它。
基于 this GitHub issue comment, it seems that docker-compose
is the original Compose project, its source code lives in the docker/compose 存储库。
docker compose
是一个新项目,实现了Compose规范,支持ECS和ACI,但暂不支持本地部署。它的源代码位于 docker/compose-cli 存储库中。
根据 this issue,docker compose
尚不支持 .env 文件。