在docker-compose中的.env文件中使用多行值

时间:2019-06-06 10:00:24

标签: docker docker-compose environment-variables

我有一个安装程序,它将一些值输出到.env文件中,以供docker-compose使用。到目前为止,所有这些工作都可以正常进行,只是无法使用SSH密钥。

到目前为止,我已经尝试过使用正确格式的私钥,也尝试用\n替换新行。但是,这会使工作流程进一步中断,并且不会在容器中使用printenv作为必需的多行变量来显示。

docker-compose.yml

myservice:
  build: .
  environment:
    - SSH_KEY
    - SINGLE_LINE_VALUE

.env(忽略明显损坏的sshkey)

SINGLE_LINE_VALUE=I Load just fine
SSH_KEY="---------------
ABCDEFGH
--------------------
"

在容器运行时,SSH_KEY的环境值就是“ ---------------

非常感谢任何想法。

3 个答案:

答案 0 :(得分:1)

也许不是最好的解决方案,但至少可以正常工作。

.env

KEY="--------------- \n ABCDEFGH \n --------------------"

docker-compose.yml

version: '3'

services:
  test:
    image: ubuntu
    environment:
      - SSH_KEY=$KEY
    command: bash -c "echo \"$${SSH_KEY}\" | perl -pe 's/\\\n/\n/g' "

$$表示美元符号转义,因此docker-compose不会在.yml文件中评估该变量,而是在运行时

需要perl replace,因为docker-compose会自动在新行字符中添加转义斜杠。

答案 1 :(得分:0)

您可以找到解决方案this

在这种情况下,您必须将文件名放在.env文件中。然后,只需在docker-compose文件中使用解决方案导出变量即可。

答案 2 :(得分:0)

如果您不介意不使用#include <ctime> #include <fstream> #include <google/protobuf/util/time_util.h> #include <iostream> #include <string> #include "test.pb.h" using namespace std; using google::protobuf::util::TimeUtil; int main(int argc, char *argv[]) { GOOGLE_PROTOBUF_VERIFY_VERSION; if (argc != 2) { cerr << "Usage: " << argv[0] << " ADDRESS_BOOK_FILE" << endl; return -1; } cap cap; int type; cout << "Please choose a type [1, 2]: "; cin >> type; if (type == 1) { type1 *t1 = cap.mutable_entity1(); string name; cout << "Please choose a name: "; cin >> name; int id; cout << "Please choose an id: "; cin >> id; t1->set_name(name); t1->set_id(id); fstream output(argv[1], ios::out | ios::trunc | ios::binary); if(!cap.SerializeToOstream(&output)){ cerr<<"failed to write to file"<<endl; return -1; } }else{ type2 *t2 = cap.mutable_entity2(); int id; cout << "Please choose an id: "; cin>>id; string name; cout << "Please choose a name: "; cin>>name; int v; cout << "Please choose v: "; cin>>v; t2->set_name(name); t2->set_id(id); t2->set_v(v); fstream output(argv[1], ios::out | ios::trunc | ios::binary); if(!cap.SerializeToOstream(&output)){ cerr<<"failed to write to file"<<endl; return -1; } } google::protobuf::ShutdownProtobufLibrary(); return 0; } 文件(也许该环境变量仅在单个容器中使用)。您可以直接在.env内定义环境变量,在那里,您可以充分利用YAML格式设置选项。即:

docker-compose.yml

此外,您不必在myservice: build: . environment: SSH_KEY: > --------- WHATEVER ---------- randomkeybase64thingforyourse rvice ------- END WHATEVER -------- 部分内复制.env值。 environment变量在.env文件中使用,但不在容器环境中使用。但是,您可以这样做:

docker-compose.yml