我有一个安装程序,它将一些值输出到.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的环境值就是“ ---------------
非常感谢任何想法。
答案 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