【发布时间】:2020-05-05 18:33:29
【问题描述】:
我正在尝试同步执行一些 shell 命令来安装 npm 依赖项、构建包并在 docker 中创建数据库。
['api', 'front-end'].forEach(async (dir) => {
await new Promise((resolve, reject) => {
console.log(`Installing npm dependencies for ${dir}`);
exec('npm install', { cwd: path.join(initDir, 'pushkin', dir) }, (err) => {
if (err) console.error(`Failed to install npm dependencies for ${dir}: ${err}`);
if (dir !== 'api' && dir !== 'front-end') return;
});
resolve(`${dir} installed...`);
})
.then(() => {
console.log(`Building ${dir}`);
exec('npm run build', { cwd: path.join(process.cwd(), 'pushkin', dir) }, (err) => {
if (err) console.error(`Failed to build ${dir}: ${err}`);
console.log(`${dir} is built`);
});
})
.then(() => {
shell.exec(startDbCommand);
})
.then(() => {
shell.exec(createDbCommand);
})
.then(() => {
shell.exec(stopDbCommand);
});
});
docker 命令是:
const startDbCommand = 'docker-compose -f pushkin/docker-compose.dev.yml up --no-start && docker-compose -f pushkin/docker-compose.dev.yml start test_db';
const createDbCommand = 'docker-compose -f pushkin/docker-compose.dev.yml exec -T test_db psql -U postgres -c "create database test_db"';
const stopDbCommand = 'docker-compose -f pushkin/docker-compose.dev.yml stop test_db';
当我第一次运行它时,我得到了这个错误:
No container found for test_db_1
Failed to build front-end: Error: Command failed: npm run build
sh: react-scripts: command not found
Failed to build api: Error: Command failed: npm run build
sh: babel: command not found
但是,在我第二次再次运行它之后,一切似乎都很好。这是我写的 Promise 链的问题吗?谢谢。
【问题讨论】:
-
同步?你的问题有点混乱,你使用的承诺,你的意思是异步的。如果你想要同步,你会使用
execSync -
Promise 不会使任何东西同步。他们可以帮助制作异步的东西顺序虽然
-
你能发布你的 Dockerfile 吗?
-
我不知道你为什么要在 nodejs 中这样做?为什么不运行 dockerfile / docker-compose 文件中的所有内容?
标签: javascript node.js docker