发布在 Docker Hub上的Deno的Docker文件:
- Alpine Linux: denoland/deno:alpine
- Centos: denoland/deno:centos
- Debian: denoland/deno:debian (default)
- Distroless: denoland/deno:distroless
- Ubuntu: denoland/deno:ubuntu
- Only the binary: denoland/deno:bin(只有二进制文件)
这几个镜像中,我们在生产时一般使用Alpine版本,因为它的体积最小。
本地运行
# 启动Deno REPL的命令如下:
$ docker run -it denoland/deno:1.36.4 repl
# 进入Docker运行时的命令如下:
$ docker run -it denoland/deno:1.36.4 sh
# 从工作目录运行main.ts的命令如下:
$ docker run -it -p 1993:1993 -v $PWD:/app denoland/deno:1.36.4 run --allow-net /app/main.ts
这里,-p 1993:1993将容器上的端口1993映射到主机上的1993,-v $PWD:/app将主机的工作目录挂载到容器上的/app,--allow-net /app/main.ts是传递给容器中的Deno的参数。
作为Dockerfile使用
FROM denoland/deno:1.36.4
# 应用程序监听的端口。
EXPOSE 1993
WORKDIR /app
# 最好不要以 root 用户身份运行。
USER deno
# 将依赖项缓存为一个层(只有在 deps.ts 修改时才会重新运行以下两个步骤)。
# 理想情况下,cache deps.ts 将下载并编译 main.ts 中使用的所有外部文件。
COPY deps.ts .
RUN deno cache deps.ts
# 这些步骤将在工作目录中的每个文件更改时重新运行:
COPY . .
# 编译主应用程序,以便不需要在每次启动/入口时进行编译。
RUN deno cache main.ts
CMD [ "run" , "--allow-net" , "main.ts" ]
然后构建后运行:
$ docker build -t app . && docker run -it -p 1993:1993 app
复制二进制文件
如果想要在镜像里只复制一个二进制文件,可以使用denoland/deno:bin这个镜像简化操作:
ARG DENO_VERSION=1.36.4
FROM denoland/deno:bin-$DENO_VERSION AS deno
FROM ubuntu
COPY --from=deno /deno /usr/local/bin/deno
本地免安装Deno,直接用Docker中的命令
在国内,由于Deno的安装包是在GitHub上,无论是直接安装还是使用deno upgrade更新,都可能是耗时的:
$ deno upgrade
Looking up latest version
Found latest version 1.36.4
Downloading https://github.com/denoland/deno/releases/download/v1.36.4/deno-x86_64-unknown-linux-gnu.zip
[09:43] [######################>------------------------] 19.22MiB/38.91MiB
这时有几种方案:
- 科学上网
- GitHub上直接下载对应的包,解压到某个目录下,再将之添加到环境变量。有可能还是会慢,你可以百度下GitHub的加速处理。
- 使用Docker。
正常来说,Docker也需要设置国内镜像,这里就不赘述了。
在.bashrc中添加:
deno () {
docker run \
--interactive \
--tty \
--rm \
--volume $PWD:/app \
--volume $HOME/.deno:/deno-dir \
--workdir /app \
denoland/deno:1.36.4 \
"$@"
}
然后查看:
$ source ~/.bashrc
$ deno --version
$ deno run ./main.ts
默认情况下Deno info是这样的:
$ deno info
DENO_DIR location: /root/.cache/deno
Remote modules cache: /root/.cache/deno/deps
npm modules cache: /root/.cache/deno/npm
Emitted modules cache: /root/.cache/deno/gen
Language server registries cache: /root/.cache/deno/registries
Origin storage: /root/.cache/deno/location_data
所以,如果要与默认保持一致,则修改上面的挂载路径:
deno () {
docker run \
--interactive \
--tty \
--rm \
--volume $PWD:/app \
--volume $HOME/.cache/deno:/deno-dir \
--workdir /app \
denoland/deno:1.36.4 \
"$@"
}
只是这样的缺点也很明显,一是启动速度肯定要稍差些,二是时区需要调整。
本文内容主要参考github.com/denoland/de…说明文档。