Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize Dockerfile #97

Merged
merged 1 commit into from
Oct 17, 2017
Merged

Optimize Dockerfile #97

merged 1 commit into from
Oct 17, 2017

Conversation

kane-c
Copy link
Contributor

@kane-c kane-c commented Oct 17, 2017

Switch to Node/Alpine base image instead of Debian - makes for a much smaller Docker image.

Also add package-lock.json to the build and optimize order of commands for a quicker build.

Switch to Node/Alpine base image instead of Debian
Makes for a much smaller Docker image

Also add `package-lock.json` to the build and optimize order
of commands for a quicker build
@noeljackson
Copy link

Have the node-sass issues with node on alpine based images been resolved? sass/node-sass#2031

@leebenson
Copy link
Member

might need to add the fix from https://github.com/jubel-han/dockerfiles/blob/master/node/Dockerfile - haven't tested yet

@leebenson
Copy link
Member

leebenson commented Oct 17, 2017

node-sass seems to work perfectly from first testing.

Unrelated, I made one slight change to how package(-lock).json is being pulled in:

ADD package*.json ./

Just to avoid an error in the event that package-lock.json is missing, and/or hasn't yet been built in a project.

This Alpine-based image may cause issues for third-party/additional binary NPM packages that are incompatible for musl libc, but I'd consider that an edge case that probably warrants the developer writing their own Dockerfile anyway.

Nice size savings - 323mb vs 943mb for the previous, and 271mb+ of that is the compiled node_modules 👍 - thanks @kane-c, will get this in the next release.

@leebenson leebenson closed this Oct 17, 2017
@leebenson leebenson reopened this Oct 17, 2017
@leebenson leebenson merged commit 18acc29 into reactql:master Oct 17, 2017
leebenson added a commit that referenced this pull request Oct 17, 2017
2.9.0 - 2017-10-17
-----------------------------------------------

## Building
* Fixes static building via `npm run build-static`, by replacing broken
`chunk-manifest-webpack-plugin` (closes #55)

## Webpack
* Adds `src` to modules path, to avoid `src/` prefixes at the start of
userland imports (closes #69)
* Fixes stats configuration to work with the latest Webpack versions
* Adds CORS config to webpack_dev_server, to enable LAN-wide browser
hot-code reloading (closes #99)
* Removes leading `/` in asset output, to allow defining a `<base>` tag
in userland via React Helmet (closes #102)

## ESLint
* Refactors rules, to be grouped by plugin
* Adds `jsx-a11y/anchor-is-valid` rule to avoid 'href' on React Router
`<Link>` attributes
* Adds `function-paren-newline` rule to enforce consistent parenthesis
* Adds `object-curly-newline` rule to allow one-line / multi-line
object definitions
* Fixes various kit and src files to conform to new rules

## React
* Bumps to React v16 - officially out of RC!

## Config
* Adds `.disableKoaHelmet()` for disabling
[koa-helmet](https://www.npmjs.com/package/koa-helmet) on the server
(closes #79)
* Adds `.setKoaHelmetOptions()` for passing options to Koa Helmet
* Sets `.koaHelmetOptions` and `.bodyParserOptions` to null by default

## App
* Disables SSL by default

## Server
* Removes leading `/` in bundled assets (along with Webpack) to allow
for a `<base>` tag to define the load path

## Testing (Jest)
* Fixes Jest testing to be compatible with Babel and React (closes #81,
merges #84 - thanks @Nate0001)

## General
* Fixes 'local' typo (merges #89 - thanks @kane-c)
* Fixes misspelled `browserslist` file (merges #95 - thanks @klarstrup)
* Adds idiomatic [React Helmet](https://github.com/nfl/react-helmet)
`<head>` tags, adds missing html/body attributes, base, link, style,
script and noscript, uses new `Helmet.renderStatic()` call (closes #101
& #94 - thanks @klarstrup)
* Adds default `<base href="/" />` tag, when none is defined with React
Helmet

## Docker
* Adds Alpine-based `Dockerfile` to reduce Docker image size from 943mb
-> 323mb (closes #98, merges #97 - thanks @kane-c)
* Adds `docker-compose.yml` for production (closes #98)
* Adds `docker-compose.dev.yml` for local development. Removes the
local `node_modules` to ensure Alpine-compatible Linux binaries are
being referenced by local code changes. Supports hot code reloading
in-browser and via SSR

## NPM
* Bumps packages:
"babel-eslint": "^8.0.1"
"copy-webpack-plugin": "^4.1.1",
"cross-env": "^5.1.0",
"eslint": "^4.9.0",
"eslint-config-airbnb": "^16.1.0",
"eslint-plugin-compat": "^2.0.1",
"eslint-plugin-jsx-a11y": "^6.0.2",
"eslint-plugin-react": "^7.4.0",
"extract-text-webpack-plugin": "^3.0.1",
"file-loader": "^1.1.5",
"graphql-tag": "^2.5.0",
"iltorb": "^2.0.1"
"jest": "^21.2.1",
"less": "^3.0.0-alpha.3",
"postcss-loader": "^2.0.8",
"resolve-url-loader": "^2.1.1",
"rimraf": "^2.6.2",
"serve": "^6.2.0",
"style-loader": "^0.19.0",
"webpack": "^3.8.0",
"webpack-chunk-hash": "^0.5.0",
"webpack-config": "^7.5.0",
"webpack-dev-server": "^2.9.2",
"webpack-manifest-plugin": "^1.3.2",
"apollo-server-koa": "^1.1.7",
"graphql": "^0.11.7",
"koa-send": "^4.1.1",
"prop-types": "^15.6.0",
"react": "^16.0.0",
"react-apollo": "^1.4.16",
"react-dom": "^16.0.0",
"react-hot-loader": "^3.1.1"
@kane-c
Copy link
Contributor Author

kane-c commented Oct 18, 2017

Awesome, happy to help!

@kane-c kane-c deleted the optimize-docker branch October 18, 2017 01:53
@arsanjea
Copy link

This is creating problems for me on a very simple app btw. Trying to fix it with a workaround.

@kane-c
Copy link
Contributor Author

kane-c commented Oct 30, 2017

What sort of problems?

@arsanjea
Copy link

arsanjea commented Oct 31, 2017 via email

@leebenson
Copy link
Member

This, like any starter kit/framework Dockerfile, won't work in every situation. If you're straying from the out-the-box defaults and adding binaries, you'll probably run into edge cases / things that are broken sooner or later. That's especially true since we're using an Alpine base, which uses musl libc and may not run everything designed for glibc.

This is only intended to be a starter template, designed mostly to strike a decent enough balance between build speed, caching, and the size of the resulting image. You're encouraged to tweak for your project's production requirements.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants