tedshd's DevNote

tedshd's DevNote

Develop & Design Note by Ted

docker 使用紀錄

on 2020-12-24

docker images

列出所有拉下來的 docker image

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              07f8e8c5e660        3 weeks ago         188.3 MB

build dockerfile

使用 dockerfile 建立 docker image

直接建立

docker build .

預設會找當前的目錄的 Dockerfile

-t 可以設定建立的 image & tag name

docker build . -t image_name:tag_name

-f 指定用哪個 dockerfile 建立

docker build . -t ubuntu_dev:16.04 -f local.Dockerfile

dockerfile 使用

使用 nginx official image 建立

FROM nginx:1.19.6-alpine

COPY ~/www /usr/share/nginx/html

EXPOSE 80

multi stage 多次 build image

有時最終要包起來的 image 會做多次處理

兩種做法

  1. 要多次處理的部份

依照要處理的部份個別建立 docker 處理

最後在把要包起來的東西包成 docker

  1. 用 multi stage
FROM golang:1.7.3 AS builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]

都是放在一起 build, build 完之後可以把結果複製到會後再使用的 image 裡面

大致上就是

FROM image_a AS a

# dosomething...

FROM image_b

COPY --from=a path ./

# dosomething...

多用於要先編譯的情況

先在其他 image 編譯完

最後在之前在其他 image 編譯完的結果和要執行的環境包成 image

Refer

但是 build 完之後會有個問題, 就是之前 stage build 出來的 image 基本上沒有必要保留

所以可以用 docker image prune f 移除掉之前 stage 建立的 image

Refer - How to remove intermediate images from a build after the build?

Refer - Prune unused Docker objects

建立 container docker run

docker run -t -i ubuntu /bin/bash

docker run -t -i ubuntu /bin/bash
root@b0cdeb409841:/#

建立 container 並執行 bash

docker run

docker run -idt --name <container name> -v <mount absolute path or ~ path>:<docker path> <IMAGE>:<TAG>

docker ps -a

列出所有已經建立的 container

docker ps

列出所有正在執行的 container

docker start <container_id>

執行 container

docker stop <container_id>

停止 container

docker logs <container_id>

查看 docker 處理的紀錄

Read more

Puppeteer 安裝在 ubuntu server 使用紀錄

on 2020-11-20

Puppeteer 是 Google 推出的基於 nodejs 的一套工具 可以控制 Chrome 和 Chromium 所以在爬蟲和測試等等需求都很好用

這裡記錄一下在 GCP 上面開一台 Computer Engine 後裝 Puppeteer 的紀錄

1. CE 開一個 instance

之前開 f1-mirco(1vCPU & 0.6G RAM)(共用核心)

這樣的等級如果只是 load 完頁面爬內容還是可以撐得住的

但是要做一些操作行為或是下滑垃取 AJAX 內容等等就不夠用了

所以就開了一台 e2-small (2vCPU & 2GB RAM)(非共用核心) 來跑

這次是裝 ubuntu 20.04 LTS

2. 安裝 node

先拉 node 套件庫下來

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

裝 nodejs

sudo apt install nodejs

Refer - How to Install Node.js and npm on Ubuntu 18.04

3. 裝要啟動 Puppeteer 和 chrome 等相關套件

sudo sudo apt update
sudo apt-get install ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils

refer - Troubleshooting

通常裝完 Puppeteer 沒有啟動成功大多是有套件遺漏造成啟動不了 Chrome/Chromium

3. 裝 Puppeteer

npm i puppeteer

不要裝 puppeteer-core(因為這不包含 browser), 這個東西要裝請在自己的電腦裝來玩

Github - puppeteer

4. 寫個 sample code 吧

const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({
    args: ["--no-sandbox"],
  });
  const page = await browser.newPage();
  await page.goto("https://google.com");
  await page.screenshot({ path: "example.png" });

  await browser.close();
})();

記得加上 –no-sandbox 有時在 terminal 有問題是因為沒加這個參數(但這是個選項)

Troubleshooting

在 Puppeteer 有個整理出來的 Troubleshooting

如果有任何狀況都可以參考該頁面

troubleshooting

Log

在使用時參考 launcharg

使用以下的內容當參考

List of Chromium Command Line Switches

puppeteer 文件也是有許多 method 的使用方式

https://pptr.dev/

Read more