【问题标题】:Dockerfile with env file带有 env 文件的 Dockerfile
【发布时间】:2019-12-30 18:53:24
【问题描述】:

如果我不将 .env 文件推送到我的存储库中,如何在 Dockerfile 中使用 .env ? 因为我想使用 dockerfile 在我的存储库上使用 jenkins

我的 dockerfile 是这样的

FROM node:lts-alpine

COPY ./ ./

RUN npm install

EXPOSE 8090

CMD ["npm", "run" , 'dev']

我对此很陌生,在这里我正在尝试使用 docker 部署我的 nodejs api 并与 jenkins 集成以继续部署,我已经关注了一些文章,所以我尝试在我的 linux 服务器上使用 dockerfile 和 jenkisfile

我的 .env 是这样的,对于 mongod db

DB_USERNAME=for_USERNAME_DB
DB_PASSWORD=for_PASSWORD_DB
DB_NAME=for_DATABASE_NAME

我的 Jenkinsfile 示例

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh 'docker build -t mygithub/express-api:latest'
            }
        }

        stage('Test') {
            steps {
                sh 'docker run mygithub/express-api:latest npm test'
            }
        }

        stage('Deploy') {
            when {
                branch 'master'
            }
            steps {
                sh 'docker push mygithub/express-api:latest'
            }
        }
    }

    post {
        failure {
            echo 'build is broken. notify team!'
        }
    }
}

【问题讨论】:

  • 我想你想让 jenkins 服务器运行集成测试,否则你不应该需要那里的秘密。在我们的设置中,我们生成一组新的凭据来运行测试,并在集成测试完成后最终丢弃实例。为此,我们每次都会生成一个.env
  • 所以我们应该创建私有仓库?
  • 我认为你不需要它。只需在.gitignore 中添加.env 文件,并在需要时动态创建它。
  • 所以当我在 github 上运行没有 .env 的 jenkins 和 dockerfile 时需要 .env 的快递就可以了吗?因为我希望每次推送到 master 时都集成它,所以我在 vps 上的 api 服务器也会更新我在我的 jenkins 服务器上设置的
  • 集成测试将在哪个数据库上运行?如果您计划在全新的数据库上运行集成测试,那么您可以即时创建自己的 .env 文件。另一方面,如果您计划在提交完成后让 jenkins 启动应用程序,情况会发生变化,您需要将 .env 文件直接存储在服务器上。无论如何,在任何一种情况下,您都不想将 .env 文件(或任何硬编码的密码)存储在 git repo

标签: node.js docker jenkins


【解决方案1】:

您可以使用 Jenkins 或配置工具中的脚本在运行时创建 .env 或 env_file_name,您的环境值如下。

DB_USERNAME=for_USERNAME_DB
DB_PASSWORD=for_PASSWORD_DB
DB_NAME=for_DATABASE_NAME

在 Jenkins 中,在运行容器时使用 --env-file 选项来传递容器内的环境变量以供应用程序使用。这样,您就不会在 Dockerfile 中显示您的环境变量。

stage('Test') 
{
  steps 
  {
    sh 'docker run --env-file=env_file_name mygithub/express-api:latest npm test'
  }
}

【讨论】:

    【解决方案2】:

    如果不推送 .env 文件,可以使用 ENV Dockerfile 的指令。喜欢:

    FROM node:lts-alpine
    
    COPY ./ ./
    
    ENV DB_USERNAME=for_USERNAME_DB
    ENV DB_PASSWORD=for_PASSWORD_DB
    ENV DB_NAME=for_DATABASE_NAME
    
    RUN npm install
    
    EXPOSE 8090
    
    CMD ["npm", "run" , 'dev']
    

    应该可以的。

    【讨论】:

    • 我会将我的 Dockerfile 推送到我的 repo 上,如果我在 dockerfile 上这样做,每个人都会看到我的环境是 :(,我只想隐藏它们
    • 您不需要推送已写入 Dockerfile 信息的文件。您可以将模型推送到您的环境中并将默认值更改为正确的值。
    猜你喜欢
    • 1970-01-01
    • 2022-10-09
    • 2021-05-20
    • 2023-03-03
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多