我正在尝试在节点项目中使用typeorm。因此,数据库是通过泊坞窗旋转的。现在,当容器停止并重新启动时,ip会不断变化,因此更好的可能性是在我的配置中使用容器名称。
现在真正的混乱开始了,所以我尝试使用env变量配置连接选项,似乎它无法解析主机(当作为Docker容器提供时)。
这是我的示例.env文件
TYPEORM_HOST=postgres-container
TYPEORM_POSTGRES_USERNAME=postgres
TYPEORM_POSTGRES_PASSWORD=XXXXXX
TYPEORM_TYPE=postgres
TYPEORM_LOGGING=true
TYPEORM_SYNCHRONIZE=true
TYPEORM_DATABASE=XXXXX
PINO_ENABLE_LOGGING= true
当我尝试在我的应用程序中使用它时,这引发了一个错误,指出找不到主机,因此将其还原回ip并且可以正常工作
const databaseConfigParams = DatabaseConfigInstance.getConnectionParams();
......
try {
const connec = await createConnection({
name: DB_CONNECTION_NAME,
type: DatabaseConnectionEnum.POSTGRES,
host: databaseConfigParams.getHost(),
port: parseInt(databaseConfigParams.getPort()),
username: databaseConfigParams.getUsername(),
password: databaseConfigParams.getPassword(),
database: databaseConfigParams.getDatabase(),
logging: databaseConfigParams.isLogging(),
synchronize: databaseConfigParams.isSynchronize(),
entities: [XXXEntity, XXEntity, XXXEntity]
});
res(connec);
} catch (err){
console.log('error in creating connection:', err);
rej(err);
}
现在,如果将配置作为环境var提供,则无法解析容器名称,因此我决定将配置移至ormconfig.js文件。
现在我可以在哪里指定要使用的实体? 。由于我使用webpack捆绑应用程序,因此即使捆绑了应用程序,我也需要识别实体。
这是我的webpack配置
const path = require('path');
const webpack = require('webpack');
const nodeExternals = require('webpack-node-externals');
const dotEnvPlugin = require('dotenv-webpack');
const TerserPlugin = require('terser-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
'use strict';
module.exports = {
entry: './src/app/server.ts',
mode: 'development',
optimization: {
minimizer: [
new UglifyJsPlugin({
uglifyOptions: {
keep_classnames: true,
keep_fnames: true
}
})
],
},
output: {
path: path.join(__dirname, 'dist'),
filename: '[name].js'
},
resolve: {
extensions: ['.ts', '.js'],
},
module: {
rules: [
{
test: /\.ts$/,
use: [
'ts-loader',
]
},
{
test: /\.handlebars$/,
loader: 'handlebars-loader',
options: {
knownHelpersOnly: false,
inlineRequires: /\/assets\/(:?images|audio|video)\//ig,
partialDirs: [path.join(__dirname, './src/views/email/partials')],
},
}
]
},
externals: [ nodeExternals() ],
plugins: [
new dotEnvPlugin({
path: './config/development/.env',
safe: true,
systemvars: true,
silent: true,
defaults: false
}),
new webpack.DefinePlugin({
'process.env.NODE_ENV': 'development',
'process.env.DEBUG': 'false'
}),
// need this plugin for the maps to be generated
new webpack.EvalSourceMapDevToolPlugin({
filename: '[name].map.js'
}),
new webpack.WatchIgnorePlugin([
path.join(__dirname, "node_modules")
]),
]
};
编辑:
我尝试在oemconfig.js中使用指定实体。它适用于ts节点编译,但不适用于webpack。
module.exports = {
name: 'postgresConnection',
type: 'postgres',
host: '172.17.0.3',
port: 5432,
username: 'postgres',
password: 'XXX',
database: 'XXX',
synchronize: true,
logging: true,
"entities": [
"src/app/modules/database/entities/*.ts"
],
};
所以我有两个问题。不知道应该采用哪种方法。我需要链接postgres-container(docker)并在我的typeorm中使用它。另外,我需要制作捆绑的代码(在webpack捆绑之后)才能使用正确的实体文件夹。
答案 0 :(得分:0)
我没有尝试将postgres容器链接到我的终端,这是导致问题的原因。抱歉,我没有尝试在结尾处链接容器。我的错。现在,它可以完美运行。我可以回复到在env文件中声明typeorm连接选项,并在ts文件本身中声明适合于webpack配置的实体
也许如果有人也遇到类似的问题,这会帮助他们 我的.env文件
TYPEORM_HOST=postgres-container
TYPEORM_POSTGRES_USERNAME=postgres
TYPEORM_POSTGRES_PASSWORD=XXXXXX
TYPEORM_TYPE=postgres
TYPEORM_LOGGING=true
TYPEORM_SYNCHRONIZE=true
TYPEORM_DATABASE=XXXXX
我的Dockerfile(FROM映像是我自己的节点映像。显然dockerhub中的映像12.9.0存在并发性问题,并且较旧的版本似乎不支持atob模块base64解析,因此从UBUNTU创建了我自己的映像并推送到私有dockerhub)
FROM vijayakumarpsg587/node-12:1.01
# install pm2 and link the image using environment variables
RUN npm install pm2 -g
# Create a seperate node user
RUN useradd -ms /bin/bash node-user
RUN mkdir -p /home/node/app
# RUN chown -R node-user:node-user /home/node/app && chmod -R u+rwx,go+rwx /home/node/app
WORKDIR /home/node/app
# USER node-user
COPY package*.json ./
RUN npm install
COPY . ./
RUN npm run build:webpack:dev
ENV PM2_PUBLIC_KEY XXX
ENV PM2_SECRET_KEY XXX
博览会3002
CMD [“ pm2-runtime”,“ ./dist/main.js”]
其相同的webpack配置。此外,用于从.env检索内容的ts文件也相同。
真正的问题是我没有将 postgres-容器链接到我构建的新应用容器。
所以首先我创建一个新的应用程序图像并旋转一个容器
docker build -t XXXX / XXX:。
从图像中旋转一个容器,同时链接postgres-container
docker run -d -p 3002:3002 --name <name of the container> --link postgres-container <image that you created earlier with the prev command>
编辑:编写dockerfile时,请遵循dockerfile准则中的最佳做法。说明RUN,COPY ADD会创建新的图像层,并且它们应尽可能小。如果需要,请尝试创建多阶段构建。