$ APP_PASSWORD="env password" go run main.go conf password env password
不过还可以通过硬编码到运行程序内进行,
1 2 3 4 5 6 7 8 9 10 11
package main
import"fmt"
var ( password string )
funcmain() { fmt.Println(password) }
通过使用 ldflags 参数传入 build 或者 run 里就可以了,
1 2
$ go run -ldflags "-X main.password=password" main.go password
具体参数说明:
1 2 3 4 5 6
-X importpath.name=value Set the value of the string variable in importpath named name to value. This is only effective if the variable is declared in the source code either uninitialized or initialized to a constant string expression. -X will not work if the initializer makes a function call or refers to other variables. Note that before Go 1.5 this option took two separate arguments.
importpath 这里是在 main 包,所以用的是 main.password ,假如是 github.com/islishude/config 这个包,那么对应就是 github.com/islishude/config.password。
有几点需要注意:
1 如果是多个配置的话需要使用空格分隔
1 2 3 4 5 6 7 8 9 10 11
package main import"fmt"
var ( username string password string )
funcmain() { fmt.Println(username, password) }
1 2
$ go run -ldflags "-X main.username=username -X main.password=password" main.go username password
2 如果配置内容含有空格,那么需要使用引用。
1 2
$ go run -ldflags "-X 'main.password=build password'" main.go build password
3 只能使用 string 类型不支持其它类型
1 2
main.num: cannot set with -X: not a var of type string (type.int) main.bl: cannot set with -X: not a var of type string (type.bool)
// Value 参数编码 valueInput, err := parsed.Pack("Value", address) if err != nil { panic(err) }
// Value 参数解码 var addrwant common.Address if err := parsed.Methods["Value"].Inputs.Unpack(&addrwant, valueInput[4:]); err != nil { panic(err) } fmt.Println("should equals", addrwant == address)
// Value 返回值解码 var balance *big.Int var returns = common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000005f5e100") if err := parsed.Unpack(&balance, "Value", returns); err != nil { panic(err) } fmt.Println("Value 返回值", balance) }
// List 返回值编码 { // 注意:字段名称需要与 ABI 编码的定义的一致 // 比如,这里 ABI 编码返回值第一个为 receiver 那么转化为 Go 就是首字母大写的 Receiver var res struct { Receiver []common.Address // 返回值名称 Values []*big.Int // 返回值名称 }
$ docker run --rm -it test sh $ ls app bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var $ ls -al app total 12 drwxr-xr-x 2 root root 4096 Mar 27 01:57 . drwxr-xr-x 1 root root 4096 Mar 27 01:57 .. -rw-r--r-- 1 root root 181 Mar 27 01:57 main.go
$ docker run --rm -it test $ ls app bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var $ ls -al app total 16 drwxr-xr-x 2 root root 4096 Mar 27 02:33 . drwxr-xr-x 1 root root 4096 Mar 27 02:33 .. -rw-r--r-- 1 root root 181 Mar 27 01:57 main.go
FROM alpine:latest COPY main.go README.md app CMD ["sh"]
这里就报错了,提示目录路径不是目录。
1 2 3 4 5 6
$ docker build -t test . Sending build context to Docker daemon 10.75kB Step 1/3 : FROM alpine:latest ---> 5cb3aa00f899 Step 2/3 : COPY main.go README.md app When using COPY with more than one source file, the destination must be a directory and end with a /
$ docker run --rm -it test $ ls app bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var $ ls -al app total 16 drwxr-xr-x 2 root root 4096 Mar 27 02:50 . drwxr-xr-x 1 root root 4096 Mar 27 02:57 .. -rw-r--r-- 1 root root 181 Mar 27 01:57 main.go
$ docker run -it --rmtest $ ls app bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var $ ls -al app -rw-rw-rw- 1 root root 77 Mar 27 03:16 app $ cat app package main
$ ls app bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var $ cd app /app # ls vue-2.6.10 $ cd vue-2.6.10/ $ ls BACKERS.md README.md dist flow packages src types LICENSE benchmarks examples package.json scripts test yarn.lock