首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在虚拟机中部署Docker映像和环境变量?

如何在虚拟机中部署Docker映像和环境变量?
EN

Stack Overflow用户
提问于 2022-09-23 12:26:10
回答 1查看 52关注 0票数 1

我在笔记本电脑上用docker-compose制作了两张图片,然后把它们放在一个私人回购中。现在,我想在虚拟机中部署映像,所以我使用docker pull来获取它们,并使用docker run -d来运行容器。问题是容器无法启动,因为没有找到包含所有变量的.env文件。

代码语言:javascript
复制
/entrypoint: line 12: STRATEGY_DB_NAME: unbound variable
Waiting for PostgreSQL to become available...

这个文件存在于我的笔记本电脑中的./strategy/.env中,我想知道在虚拟机中应该在哪里复制这个文件。

我是新部署人员,还不清楚是否需要用git push上传虚拟机中的所有项目文件,然后再上传docker run的Docker映像。我认为这是不必要的,因为这些文件被嵌入到Docker映像中。

我的问题是为什么找不到.env文件,我应该在哪里复制它?

docker-compose.yml

代码语言:javascript
复制
version: '3.8'

services:
  django:
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: strategy
    command: /start
    volumes:
      - .:/app
    ports:
      - "8004:8004"
    env_file:
      - strategy/.env                        <--------------- file with secrets
    depends_on:
      - redis-4
    networks:
      - mynetwork

Dockerfile

代码语言:javascript
复制
FROM python:3.10

ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
WORKDIR /app

RUN apt-get update \
  && apt-get install -y gcc build-essential \
  && apt-get install -y libpq-dev \
  && apt-get install -y gettext \
  && apt-get install -y git \
  && apt-get install -y openssh-client \
  && apt-get install -y libcurl4-openssl-dev libssl-dev \
  && apt-get install -y build-essential \
  && apt-get install -y libpq-dev \
  && apt-get install -y procps telnet \
  && apt-get install -y nano \
  && apt-get install -y postgresql-client \
  && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
  && rm -rf /var/lib/apt/lists/*

RUN mkdir logs \
    && touch logs\flat_line.log \
    && touch logs\json.log

# Requirements are installed here to ensure they will be cached.
COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt
RUN pip install ccxt --upgrade \
  && pip install numpy --upgrade \
  && pip install psycopg2 --upgrade

COPY ./compose/local/django/entrypoint /entrypoint
RUN chmod +x /entrypoint

COPY ./compose/local/django/start /start
RUN chmod +x /start

COPY ./compose/local/django/celery/worker/start /start-celeryworker
RUN chmod +x /start-celeryworker

COPY ./compose/local/django/celery/beat/start /start-celerybeat
RUN chmod +x /start-celerybeat

COPY ./compose/local/django/celery/flower/start /start-flower
RUN chmod +x /start-flower

RUN mkdir /app/strategy
COPY ssl /app/strategy

ENTRYPOINT ["/entrypoint"]

入口点

代码语言:javascript
复制
#!/bin/bash

# if any of the commands in your code fails for any reason, the entire script fails
# fail exit if one of your pipe command fails
# exits if any of your variables is not set

set -o errexit
set -o pipefail
set -o nounset

postgres_ready() {
python << END
import sys

import psycopg2

try:
    psycopg2.connect(
        dbname="${STRATEGY_DB_NAME}",
        user="${STRATEGY_DB_USER}",
        password="${STRATEGY_DB_PASSWORD}",
        host="${STRATEGY_DB_HOST}",
        port="${STRATEGY_DB_PORT}",
        sslmode="require",
    )
except psycopg2.OperationalError:
    sys.exit(-1)
sys.exit(0)

END
}
until postgres_ready; do
  >&2 echo 'Waiting for PostgreSQL to become available...'
  sleep 1
done
>&2 echo 'PostgreSQL is available'

exec "$@"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-23 18:57:04

如果您希望使用docker-compose从映像中运行容器,则需要使用env_file指定环境文件。

代码语言:javascript
复制
#docker-compose.yml
version: '3.8'

services:
  container_name:
    image: imagee:1.0
    ...
    env_file: .env
...

Docker一样,您可以添加参数--env-file,如:

代码语言:javascript
复制
docker run image:1.0 --env-file .env
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73827719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档