【问题标题】:Preventing development containers from running in production防止开发容器在生产中运行
【发布时间】:2022-02-22 16:46:36
【问题描述】:

我有一个 docker-compose.yml 文件,其中包含一个用于 API 模拟的容器以及 phpmyadmin 和 mongo-express 容器,这些容器都不应该在我的生产环境中启动。

我已经有单独的.env 文件用于生产和开发。是否可以使用活动 .env 文件中的变量来禁用容器?

这是我的docker-compose.yml

services:
    mysql:
        build: ./docker/mysql
        command: --default-authentication-plugin=mysql_native_password
        container_name: mysql
        entrypoint: sh -c "/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci"
        environment:
            - MYSQL_DATABASE=${MYSQL_DATABASE}
            - MYSQL_USER=${MYSQL_USERNAME}
            - MYSQL_PASSWORD=${MYSQL_PASSWORD}
            - MYSQL_RANDOM_ROOT_PASSWORD=yes
            - MYSQL_ONETIME_PASSWORD=yes
        ports:
            - 3306:3306
        restart: unless-stopped
        volumes:
            - ./data/mysql:/var/lib/mysql

    phpmyadmin:
        container_name: phpmyadmin
        environment:
            - PMA_HOST=mysql
        image: phpmyadmin/phpmyadmin
        ports:
            - 8080:80

    mongo:
        build: ./docker/mongo
        container_name: mongo
        environment:
            - MONGO_INITDB_DATABASE=${MONGO_DATABASE}
            - MONGO_INITDB_ROOT_USERNAME=${MONGO_USERNAME}
            - MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASSWORD}
        ports:
            - 27017:27017
        restart: unless-stopped
        volumes:
            - ./data/mongo:/data/db

    mongo-express:
        build: ./docker/mongo-express
        container_name: mongo-express
        depends_on:
            - mongo
        environment:
            - ME_CONFIG_BASICAUTH_PASSWORD=redacted
            - ME_CONFIG_BASICAUTH_USERNAME=username
            - ME_CONFIG_MONGODB_ADMINUSERNAME=${MONGO_USERNAME}
            - ME_CONFIG_MONGODB_ADMINPASSWORD=${MONGO_PASSWORD}
        ports:
            - 8081:8081

    redis:
        build: ./docker/redis
        container_name: redis
        ports:
            - 6379:6379
        restart: unless-stopped
        volumes:
            - ./data/redis:/data

    mock-apis:
        build: ./docker/mock-apis
        container_name: mock-apis
        command: >
            /initscript.bash
        ports:
            - 81:80
        volumes:
            - ./mock-apis:/home/nodejs

    php-fpm:
        build: 
            context: ./docker/php-fpm
            args: 
                HOST_UID: ${HOST_UID}
        command: >
            /initscript.bash
        container_name: php-fpm
        restart: unless-stopped
        depends_on:
            - mongo
            - mysql
            - redis
        volumes:
            - ./laravel:/var/www/

    nginx:
        build: ./docker/nginx
        container_name: nginx
        depends_on:
            - php-fpm
        ports:
            - 80:80
        restart: unless-stopped
        volumes:
            - ./laravel:/var/www/

version: "3"

【问题讨论】:

  • 哪个变量将定义它是生产环境?我没有看到特定于环境的变量
  • @Adiii 我有一个 APP_DEBUG 变量(来自 laravel),但我可以根据需要定义任何其他变量。
  • 你看过这个stackoverflow.com/questions/39138488/…。一般来说,没有直接的方法,但是有一些好的做法和/模式。
  • 多个 docker-compose 文件是解决方案^

标签: docker docker-compose containers dotenv dev-to-production


【解决方案1】:

我正在使用profiles 来确定我的服务范围。如果我只想在 dev 中使用 PhpMyAdmin,我将此配置文件添加到服务中:

phpmyadmin:
    container_name: phpmyadmin
    environment:
        - PMA_HOST=mysql
    image: phpmyadmin/phpmyadmin
    ports:
        - 8080:80
    profiles: ["dev"]

所以现在我必须告诉 docker compose 如果我想使用开发配置文件。否则将无法启动。

您可以使用以下命令之一(通过这种方式,您必须为每个配置文件键入 --profile your_profil):

$ docker-compose --profile dev up -d
$ docker-compose --profile dev --profile profil2 up -d     <- for multiple profiles

或者您可以使用逗号分隔服务的更简洁的方式:

$ COMPOSE_PROFILES=dev,profil2 docker-compose up -d

没有配置文件属性的服务将始终启用。

当您停止服务时,您也必须指定配置文件:

$ COMPOSE_PROFILES=dev docker-compose down

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2012-01-06
    • 1970-01-01
    • 2016-05-29
    • 2022-12-10
    • 2016-10-19
    相关资源
    最近更新 更多