Skip to content

Commit

Permalink
chore: improvements for dockerize command
Browse files Browse the repository at this point in the history
  • Loading branch information
jamesgeorge007 committed Aug 12, 2020
1 parent 9e72548 commit 87ef84f
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 28 deletions.
2 changes: 1 addition & 1 deletion __e2e__/commands/generate.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ describe('mevn generate', () => {

// MongoDB URI path within .env
const envDotFile = fs.readFileSync(path.join(serverPath, '.env'), 'utf8');
expect(envDotFile).toBe('DB_URL=mongodb://localhost:27017');
expect(envDotFile).toBe('DB_URL=mongodb://localhost:27017/userdb');

// Delete generated directory
rmTempDir(tempDirPath);
Expand Down
73 changes: 51 additions & 22 deletions src/commands/basic/docker.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import fs from 'fs';
import path from 'path';
import showBanner from 'node-banner';

import appData from '../../utils/projectConfig';
import { checkIfConfigFileExists } from '../../utils/messages';
import { validateInstallation } from '../../utils/validate';

Expand Down Expand Up @@ -39,15 +40,8 @@ const getFileContent = (configFile) => {
const makeDataDir = () => {
fs.mkdirSync(path.join('tmp', 'data'), { recursive: true });

let gitIgnoreContents = fs.readFileSync('.gitignore');
const mongoGitIgnoreHeader = '# MEVN_GENERATED:MONGO';

if (!new RegExp(mongoGitIgnoreHeader, 'g').test(gitIgnoreContents)) {
gitIgnoreContents += ['\n', '# MEVN_GENERATED:MONGO', '/tmp', '\n'].join(
'\n',
);
}
// Write back the updated contents to .gitignore
// Create .gitignore at project root
const gitIgnoreContents = ['# MEVN_GENERATED:MONGO', '/tmp', '\n'].join('\n');
fs.writeFileSync('.gitignore', gitIgnoreContents);
};

Expand All @@ -62,21 +56,29 @@ const dockerize = async () => {
checkIfConfigFileExists();
await validateInstallation('docker');

// .mevnrc
const { template } = appData();

// Get the respective file contents
let dockerComposeTemplate = getFileContent('docker-compose.yml');
const dockerFileTemplate = getFileContent('Dockerfile');
let dockerFileTemplate = getFileContent('Dockerfile');

// Create Dockerfile for client directory
const clientDockerFilePath = path.join('client', 'Dockerfile');
if (!fs.existsSync(clientDockerFilePath)) {
if (template === 'Nuxt.js') {
// docker-compose.yml
dockerComposeTemplate[4] = `${' '.repeat(
4,
)}command: bash -c "npm install && npm run dev"`;
dockerComposeTemplate[9] = `${' '.repeat(6)}- "3000:3000"`;
dockerComposeTemplate.splice(10, 0, `${' '.repeat(4)}environment:`);
dockerComposeTemplate.splice(11, 0, `${' '.repeat(6)}HOST: 0.0.0.0`);
}
fs.writeFileSync(clientDockerFilePath, dockerFileTemplate.join('\n'));
}

if (fs.existsSync('./server')) {
// Create Dockerfile for the server directory
dockerFileTemplate.splice(8, 0, 'RUN npm install -g nodemon');
dockerFileTemplate.splice(9, 0, '');

if (fs.existsSync('server')) {
// Create Dockerfile for server directory
const serverDockerFilePath = path.join('server', 'Dockerfile');
if (!fs.existsSync(serverDockerFilePath)) {
Expand All @@ -94,32 +96,59 @@ const dockerize = async () => {
if (fs.existsSync(path.join('server', 'models'))) {
if (!fs.existsSync(path.join('tmp', 'data'))) {
makeDataDir();
dockerComposeTemplate.splice(14, 0, `${' '.repeat(4)}environment:`);

// dockerize command was invoked after creating the CRUD boilerplate
if (fs.existsSync('docker-compose.yml')) {
dockerComposeTemplate = fs
.readFileSync('docker-compose.yml', 'utf8')
.split('\n');
}
let startIdx = dockerComposeTemplate.findIndex(
(line) => line.trim() === '- ./server:/app',
);

dockerComposeTemplate.splice(
15,
startIdx + 1,
0,
`${' '.repeat(6)}- DB_URL=mongodb://mongo:27017`,
`${' '.repeat(4)}environment:`,
);

dockerComposeTemplate.splice(
startIdx + 2,
0,
`${' '.repeat(6)}- DB_URL=mongodb://mongo:27017/userdb`,
);

// Write to docker-compose.yml
fs.writeFileSync(
'docker-compose.yml',
dockerComposeTemplate.join('\n'),
);
}
} else {
dockerComposeTemplate = dockerComposeTemplate.slice(0, 19);
const endIdx = template === 'Nuxt.js' ? 21 : 19;
dockerComposeTemplate = dockerComposeTemplate.slice(0, endIdx);
}
}

// Create .dockerignore within client directory
const clientDockerIgnorePath = path.join('client', '.dockerignore');
if (!fs.existsSync(clientDockerIgnorePath)) {
fs.writeFileSync(clientDockerIgnorePath, 'node_modules\ndist');
const dockerIgnoreContent = 'node_modules\ndist';
fs.writeFileSync(
clientDockerIgnorePath,
`${
template === 'Nuxt.js'
? dockerIgnoreContent + '\n.nuxt' // Add .nuxt to .dockerignore
: dockerIgnoreContent
}`,
);
}

// docker-compose.yml should only include the necessary instructions
// for the client side
if (!fs.existsSync('./server')) {
dockerComposeTemplate = dockerComposeTemplate.slice(0, 10);
if (!fs.existsSync('server')) {
dockerComposeTemplate = dockerComposeTemplate.slice(0, 9);
}

// Create docker-compose.yml at project root
Expand Down
3 changes: 0 additions & 3 deletions src/templates/docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,5 @@ WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

CMD [ "npm", "run", "serve" ]
4 changes: 2 additions & 2 deletions src/templates/docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ version: '3'
services:
vue-client:
build: ./client
command: npm run serve
command: bash -c "npm install && npm run serve"
volumes:
- /app/node_modules
- ./client:/app
Expand All @@ -11,7 +11,7 @@ services:

node-server:
build: ./server
command: nodemon --watch views -e js,html server.js
command: bash -c "npm install && npm run serve"
volumes:
- /app/node_modules
- ./server:/app
Expand Down

0 comments on commit 87ef84f

Please sign in to comment.